From 16b1997b4fae558883cc725f651724163f1ce1af Mon Sep 17 00:00:00 2001 From: Harman-singh-waraich Date: Mon, 6 Oct 2025 19:10:21 +0530 Subject: [PATCH 1/6] chore: sync-changes-from-governor-in-kleros-v2 --- contracts/package.json | 2 +- contracts/src/KlerosGovernor.sol | 156 +++++++----- contracts/src/libraries/SafeSend.sol | 24 ++ yarn.lock | 358 ++++++++++++++++++++------- 4 files changed, 390 insertions(+), 150 deletions(-) create mode 100644 contracts/src/libraries/SafeSend.sol diff --git a/contracts/package.json b/contracts/package.json index 55667d8..7b22917 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -90,6 +90,6 @@ "wagmi": "^2.15.4" }, "dependencies": { - "@kleros/kleros-v2-contracts": "^0.9.3" + "@kleros/kleros-v2-contracts": "^0.12.0" } } diff --git a/contracts/src/KlerosGovernor.sol b/contracts/src/KlerosGovernor.sol index 2978964..0aff261 100644 --- a/contracts/src/KlerosGovernor.sol +++ b/contracts/src/KlerosGovernor.sol @@ -1,13 +1,17 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import {IArbitrableV2, IArbitratorV2} from "@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol"; import "@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol"; +import {SafeSend} from "./libraries/SafeSend.sol"; import "./interfaces/IArbSys.sol"; -/// @title KlerosGovernor for V2. Note that appeal functionality and evidence submission will be handled by the court. +/// @title KlerosGovernor for V2. +/// @dev Appeal and evidence submission is handled by the court. contract KlerosGovernor is IArbitrableV2 { + using SafeSend for address payable; + // ************************************* // // * Enums / Structs * // // ************************************* // @@ -48,6 +52,7 @@ contract KlerosGovernor is IArbitrableV2 { ArbSys constant arbSys = ArbSys(address(100)); // ArbSys implementation https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference#arbsys IArbitratorV2 public arbitrator; // Arbitrator contract. bytes public arbitratorExtraData; // Extra data for arbitrator. + address public wNative; // The wrapped native token for safeSend(). IDisputeTemplateRegistry public templateRegistry; // The dispute template registry. uint256 public templateId; // The current dispute template identifier. @@ -62,24 +67,25 @@ contract KlerosGovernor is IArbitrableV2 { Submission[] public submissions; // Stores all created transaction lists. submissions[_listID]. Session[] public sessions; // Stores all submitting sessions. sessions[_session]. mapping(uint256 sessionIndex => mapping(bytes32 listHash => bool)) alreadySubmitted; // Indicates whether or not the transaction list was already submitted in order to catch duplicates in the form alreadySubmitted[listHash]. + // ************************************* // // * Function Modifiers * // // ************************************* // modifier duringSubmissionPeriod() { uint256 offset = sessions[sessions.length - 1].durationOffset; - require(block.timestamp - lastApprovalTime <= submissionTimeout + offset, "Submission time has ended."); + if (block.timestamp - lastApprovalTime > submissionTimeout + offset) revert SubmissionTimeHasEnded(); _; } modifier duringApprovalPeriod() { uint256 offset = sessions[sessions.length - 1].durationOffset; - require(block.timestamp - lastApprovalTime > submissionTimeout + offset, "Approval time not started yet."); + if (block.timestamp - lastApprovalTime <= submissionTimeout + offset) revert ApprovalTimeNotStarted(); _; } - modifier onlyByGovernor() { - require(address(this) == msg.sender, "Only the governor allowed."); + modifier onlyByOwner() { + if (address(this) != msg.sender) revert OwnerOnly(); _; } @@ -87,7 +93,7 @@ contract KlerosGovernor is IArbitrableV2 { // * Events * // // ************************************* // - /// @dev Emitted when a new list is submitted. + /// @notice Emitted when a new list is submitted. /// @param _listID The index of the transaction list in the array of lists. /// @param _submitter The address that submitted the list. /// @param _session The number of the current session. @@ -104,7 +110,7 @@ contract KlerosGovernor is IArbitrableV2 { // * Constructor * // // ************************************* // - /// @dev Constructor. + /// @notice Constructor. /// @param _arbitrator The arbitrator of the contract. /// @param _arbitratorExtraData Extra data for the arbitrator. /// @param _templateRegistry Dispute Template registry address @@ -114,6 +120,7 @@ contract KlerosGovernor is IArbitrableV2 { /// @param _submissionTimeout Time in seconds allocated for submitting transaction list. /// @param _executionTimeout Time in seconds after approval that allows to execute transactions of the approved list. /// @param _withdrawTimeout Time in seconds after submission that allows to withdraw submitted list. + /// @param _wNative The wrapped native token address, typically wETH. constructor( IArbitratorV2 _arbitrator, bytes memory _arbitratorExtraData, @@ -123,10 +130,12 @@ contract KlerosGovernor is IArbitrableV2 { uint256 _submissionBaseDeposit, uint256 _submissionTimeout, uint256 _executionTimeout, - uint256 _withdrawTimeout + uint256 _withdrawTimeout, + address _wNative ) { arbitrator = _arbitrator; arbitratorExtraData = _arbitratorExtraData; + wNative = _wNative; lastApprovalTime = block.timestamp; submissionBaseDeposit = _submissionBaseDeposit; @@ -148,49 +157,51 @@ contract KlerosGovernor is IArbitrableV2 { // * Governance * // // ************************************* // - /// @dev Changes the value of the base deposit required for submitting a list. + /// @notice Changes the value of the base deposit required for submitting a list. /// @param _submissionBaseDeposit The new value of the base deposit, in wei. - function changeSubmissionDeposit(uint256 _submissionBaseDeposit) external onlyByGovernor { + function changeSubmissionDeposit(uint256 _submissionBaseDeposit) external onlyByOwner { submissionBaseDeposit = _submissionBaseDeposit; } - /// @dev Changes the time allocated for submission. Note that it can't be changed during approval period because there can be an active dispute in the old arbitrator contract + /// @notice Changes the time allocated for submission. + /// @dev It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract /// and prolonging submission timeout might switch it back to submission period. /// @param _submissionTimeout The new duration of the submission period, in seconds. - function changeSubmissionTimeout(uint256 _submissionTimeout) external onlyByGovernor duringSubmissionPeriod { + function changeSubmissionTimeout(uint256 _submissionTimeout) external onlyByOwner duringSubmissionPeriod { submissionTimeout = _submissionTimeout; } - /// @dev Changes the time allocated for list's execution. + /// @notice Changes the time allocated for list's execution. /// @param _executionTimeout The new duration of the execution timeout, in seconds. - function changeExecutionTimeout(uint256 _executionTimeout) external onlyByGovernor { + function changeExecutionTimeout(uint256 _executionTimeout) external onlyByOwner { executionTimeout = _executionTimeout; } - /// @dev Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period. + /// @notice Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period. /// @param _withdrawTimeout The new duration of withdraw period, in seconds. - function changeWithdrawTimeout(uint256 _withdrawTimeout) external onlyByGovernor { + function changeWithdrawTimeout(uint256 _withdrawTimeout) external onlyByOwner { withdrawTimeout = _withdrawTimeout; } - /// @dev Changes the arbitrator of the contract. Note that it can't be changed during approval period because there can be an active dispute in the old arbitrator contract. + /// @notice Changes the arbitrator of the contract. + /// @dev It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract. /// @param _arbitrator The new trusted arbitrator. /// @param _arbitratorExtraData The extra data used by the new arbitrator. function changeArbitrator( IArbitratorV2 _arbitrator, bytes memory _arbitratorExtraData - ) external onlyByGovernor duringSubmissionPeriod { + ) external onlyByOwner duringSubmissionPeriod { arbitrator = _arbitrator; arbitratorExtraData = _arbitratorExtraData; } - /// @dev Update the dispute template data. + /// @notice Update the dispute template data. /// @param _templateData The new dispute template data. /// @param _templateDataMappings The new dispute template data mappings. function changeDisputeTemplate( string memory _templateData, string memory _templateDataMappings - ) external onlyByGovernor { + ) external onlyByOwner { templateId = templateRegistry.setDisputeTemplate("", _templateData, _templateDataMappings); } @@ -198,7 +209,7 @@ contract KlerosGovernor is IArbitrableV2 { // * State Modifiers * // // ************************************* // - /// @dev Creates transaction list based on input parameters and submits it for potential approval and execution. + /// @notice Creates transaction list based on input parameters and submits it for potential approval and execution. /// @param _target List of addresses to call. /// @param _value List of values required for respective addresses. /// @param _data Concatenated calldata of all transactions of this list. @@ -211,8 +222,8 @@ contract KlerosGovernor is IArbitrableV2 { uint256[] memory _dataSize, string memory _description ) external payable duringSubmissionPeriod { - require(_target.length == _value.length, "Wrong input: target and value"); - require(_target.length == _dataSize.length, "Wrong input: target and datasize"); + if (_target.length != _value.length) revert WrongInputTargetAndValue(); + if (_target.length != _dataSize.length) revert WrongInputTargetAndDatasize(); Session storage session = sessions[sessions.length - 1]; Submission storage submission = submissions.push(); submission.submitter = payable(msg.sender); @@ -222,7 +233,7 @@ contract KlerosGovernor is IArbitrableV2 { // Do the assignment first to avoid creating a new variable and bypass a 'stack too deep' error. submission.deposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData); - require(msg.value >= submission.deposit, "Not enough ETH to cover deposit"); + if (msg.value < submission.deposit) revert InsufficientDeposit(); bytes32 listHash; bytes32 currentTxHash; @@ -240,7 +251,7 @@ contract KlerosGovernor is IArbitrableV2 { currentTxHash = keccak256(abi.encodePacked(transaction.target, transaction.value, transaction.data)); listHash = keccak256(abi.encodePacked(currentTxHash, listHash)); } - require(!alreadySubmitted[sessions.length - 1][listHash], "List already submitted"); + if (!alreadySubmitted[sessions.length - 1][listHash]) revert ListAlreadySubmitted(); alreadySubmitted[sessions.length - 1][listHash] = true; submission.listHash = listHash; submission.submissionTime = block.timestamp; @@ -251,23 +262,23 @@ contract KlerosGovernor is IArbitrableV2 { emit ListSubmitted(submissions.length - 1, msg.sender, sessions.length - 1, _description); uint256 remainder = msg.value - submission.deposit; - if (remainder > 0) payable(msg.sender).send(remainder); + if (remainder > 0) payable(msg.sender).safeSend(remainder, wNative); reservedETH += submission.deposit; } - /// @dev Withdraws submitted transaction list. Reimburses submission deposit. - /// Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made. + /// @notice Withdraws submitted transaction list. Reimburses submission deposit. + /// @dev Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made. /// @param _submissionID Submission's index in the array of submitted lists of the current session. /// @param _listHash Hash of a withdrawing list. function withdrawTransactionList(uint256 _submissionID, bytes32 _listHash) external { Session storage session = sessions[sessions.length - 1]; Submission storage submission = submissions[session.submittedLists[_submissionID]]; - require(block.timestamp - lastApprovalTime <= submissionTimeout / 2, "Should be in first half"); - // This require statement is an extra check to prevent _submissionID linking to the wrong list because of index swap during withdrawal. - require(submission.listHash == _listHash, "Wrong list hash"); - require(submission.submitter == msg.sender, "Only submitter can withdraw"); - require(block.timestamp - submission.submissionTime <= withdrawTimeout, "Withdrawing time has passed."); + if (block.timestamp - lastApprovalTime > submissionTimeout / 2) revert ShouldOnlyWithdrawInFirstHalf(); + // This is an extra check to prevent _submissionID linking to the wrong list because of index swap during withdrawal. + if (submission.listHash != _listHash) revert WrongListHash(); + if (submission.submitter != msg.sender) revert OnlySubmitterCanWithdraw(); + if (block.timestamp - submission.submissionTime > withdrawTimeout) revert WithdrawingTimeHasPassed(); session.submittedLists[_submissionID] = session.submittedLists[session.submittedLists.length - 1]; alreadySubmitted[sessions.length - 1][_listHash] = false; session.submittedLists.pop(); @@ -276,11 +287,11 @@ contract KlerosGovernor is IArbitrableV2 { payable(msg.sender).transfer(submission.deposit); } - /// @dev Approves a transaction list or creates a dispute if more than one list was submitted. - /// If nothing was submitted changes session. + /// @notice Approves a transaction list or creates a dispute if more than one list was submitted. + /// @dev If nothing was submitted changes session. function executeSubmissions() external duringApprovalPeriod { Session storage session = sessions[sessions.length - 1]; - require(session.status == Status.NoDispute, "Already disputed"); + if (session.status != Status.NoDispute) revert AlreadyDisputed(); if (session.submittedLists.length == 0) { lastApprovalTime = block.timestamp; session.status = Status.Resolved; @@ -291,7 +302,7 @@ contract KlerosGovernor is IArbitrableV2 { submission.approvalTime = block.timestamp; uint256 sumDeposit = session.sumDeposit; session.sumDeposit = 0; - submission.submitter.send(sumDeposit); + submission.submitter.safeSend(sumDeposit, wNative); lastApprovalTime = block.timestamp; session.status = Status.Resolved; sessions.push(); @@ -307,25 +318,26 @@ contract KlerosGovernor is IArbitrableV2 { // Check in case arbitration cost increased after the submission. It's unlikely that its increase won't be covered by the base deposit, but technically possible. session.sumDeposit = session.sumDeposit > arbitrationCost ? session.sumDeposit - arbitrationCost : 0; reservedETH = reservedETH > arbitrationCost ? reservedETH - arbitrationCost : 0; - emit DisputeRequest(arbitrator, session.disputeID, sessions.length - 1, templateId, ""); + emit DisputeRequest(arbitrator, session.disputeID, sessions.length - 1, templateId); } } - /// @dev Gives a ruling for a dispute. Must be called by the arbitrator. + /// @notice Gives a ruling for a dispute. + /// @dev Must be called by the arbitrator. /// @param _disputeID ID of the dispute in the Arbitrator contract. /// @param _ruling Ruling given by the arbitrator. Note that 0 is reserved for "Refuse to arbitrate". /// Note If the final ruling is "0" nothing is approved and deposits will stay locked in the contract. function rule(uint256 _disputeID, uint256 _ruling) external override { Session storage session = sessions[sessions.length - 1]; - require(msg.sender == address(arbitrator), "Only arbitrator allowed"); - require(session.status == Status.DisputeCreated, "Wrong status"); - require(_ruling <= session.submittedLists.length, "Ruling is out of bounds."); + if (msg.sender != address(arbitrator)) revert OnlyArbitratorAllowed(); + if (session.status != Status.DisputeCreated) revert NotDisputed(); + if (_ruling > session.submittedLists.length) revert RulingOutOfBounds(); if (_ruling != 0) { Submission storage submission = submissions[session.submittedLists[_ruling - 1]]; submission.approved = true; submission.approvalTime = block.timestamp; - submission.submitter.send(session.sumDeposit); + submission.submitter.safeSend(session.sumDeposit, wNative); } // If the ruling is "0" the reserved funds of this session become expendable. reservedETH -= session.sumDeposit; @@ -339,14 +351,14 @@ contract KlerosGovernor is IArbitrableV2 { emit Ruling(IArbitratorV2(msg.sender), _disputeID, _ruling); } - /// @dev Executes selected transactions of the list. + /// @notice Executes selected transactions of the list. /// @param _listID The index of the transaction list in the array of lists. /// @param _cursor Index of the transaction from which to start executing. /// @param _count Number of transactions to execute. Executes until the end if set to "0" or number higher than number of transactions in the list. function executeTransactionList(uint256 _listID, uint256 _cursor, uint256 _count) external { Submission storage submission = submissions[_listID]; - require(submission.approved, "Should be approved"); - require(block.timestamp - submission.approvalTime <= executionTimeout, "Time to execute has passed"); + if (!submission.approved) revert SubmissionNotApproved(); + if (block.timestamp - submission.approvalTime > executionTimeout) revert TimeToExecuteHasPassed(); for (uint256 i = _cursor; i < submission.txs.length && (_count == 0 || i < _cursor + _count); i++) { Transaction storage transaction = submission.txs[i]; uint256 expendableFunds = getExpendableFunds(); @@ -354,23 +366,23 @@ contract KlerosGovernor is IArbitrableV2 { (bool callResult, ) = transaction.target.call{value: transaction.value}(transaction.data); // An extra check to prevent re-entrancy through target call. if (callResult == true) { - require(!transaction.executed, "Already executed"); + if (transaction.executed) revert AlreadyExecuted(); transaction.executed = true; } } } } - /// @dev Receive function to receive funds for the execution of transactions. + /// @notice Receive function to receive funds for the execution of transactions. receive() external payable {} - /// @dev Gets the sum of contract funds that are used for the execution of transactions. + /// @notice Gets the sum of contract funds that are used for the execution of transactions. /// @return Contract balance without reserved ETH. function getExpendableFunds() public view returns (uint256) { return address(this).balance - reservedETH; } - /// @dev Gets the info of the specific transaction in the specific list. + /// @notice Gets the info of the specific transaction in the specific list. /// @param _listID The index of the transaction list in the array of lists. /// @param _transactionIndex The index of the transaction. /// @return target The target of the transaction. @@ -386,8 +398,11 @@ contract KlerosGovernor is IArbitrableV2 { return (transaction.target, transaction.value, transaction.data, transaction.executed); } - /// @dev Gets the array of submitted lists in the session. - /// Note that this function is O(n), where n is the number of submissions in the session. This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts. + /// @notice Gets the array of submitted lists in the session. + /// + /// @dev This function is O(n), where `n` is the number of submissions in the session. + /// This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts. + /// /// @param _session The ID of the session. /// @return submittedLists Indexes of lists that were submitted during the session. function getSubmittedLists(uint256 _session) external view returns (uint256[] memory submittedLists) { @@ -395,14 +410,14 @@ contract KlerosGovernor is IArbitrableV2 { submittedLists = session.submittedLists; } - /// @dev Gets the submission from listId. + /// @notice Gets the submission from listId. /// @param _listId The index of the transaction list in the array of lists. /// @return submission List belonging to that listId. function getSubmission(uint256 _listId) external view returns (Submission memory submission) { submission = submissions[_listId]; } - /// @dev Gets the number of transactions in the list. + /// @notice Gets the number of transactions in the list. /// @param _listID The index of the transaction list in the array of lists. /// @return txCount The number of transactions in the list. function getNumberOfTransactions(uint256 _listID) external view returns (uint256 txCount) { @@ -410,27 +425,50 @@ contract KlerosGovernor is IArbitrableV2 { return submission.txs.length; } - /// @dev Gets the number of lists created in contract's lifetime. + /// @notice Gets the number of lists created in contract's lifetime. /// @return The number of created lists. function getNumberOfCreatedLists() external view returns (uint256) { return submissions.length; } - /// @dev Gets the number of the ongoing session. + /// @notice Gets the number of the ongoing session. /// @return The number of the ongoing session. function getCurrentSessionNumber() external view returns (uint256) { return sessions.length - 1; } - /// @dev Gets the session from the session index. + /// @notice Gets the session from the session index. /// @return _session The session info. function getSession(uint256 _sessionIndex) external view returns (Session memory _session) { _session = sessions[_sessionIndex]; } - /// @dev Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost). + /// @notice Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost). /// @return _requiredDeposit required deposit value function getTotalSubmissionDeposit() external view returns (uint256 _requiredDeposit) { _requiredDeposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData); } + + // ************************************* // + // * Errors * // + // ************************************* // + + error SubmissionTimeHasEnded(); + error ApprovalTimeNotStarted(); + error OwnerOnly(); + error WrongInputTargetAndValue(); + error WrongInputTargetAndDatasize(); + error InsufficientDeposit(); + error ListAlreadySubmitted(); + error ShouldOnlyWithdrawInFirstHalf(); + error WrongListHash(); + error OnlySubmitterCanWithdraw(); + error WithdrawingTimeHasPassed(); + error AlreadyDisputed(); + error OnlyArbitratorAllowed(); + error NotDisputed(); + error RulingOutOfBounds(); + error SubmissionNotApproved(); + error TimeToExecuteHasPassed(); + error AlreadyExecuted(); } diff --git a/contracts/src/libraries/SafeSend.sol b/contracts/src/libraries/SafeSend.sol new file mode 100644 index 0000000..850aaf0 --- /dev/null +++ b/contracts/src/libraries/SafeSend.sol @@ -0,0 +1,24 @@ +/** + * @authors: [@andreimvp] + * @reviewers: [@divyangchauhan, @wadader, @fcanela, @unknownunknown1] + * @auditors: [] + * @bounties: [] + * SPDX-License-Identifier: MIT + */ + +pragma solidity ^0.8.24; + +interface WethLike { + function deposit() external payable; + + function transfer(address dst, uint256 wad) external; +} + +library SafeSend { + function safeSend(address payable _to, uint256 _value, address _wethLike) internal { + if (_to.send(_value)) return; + + WethLike(_wethLike).deposit{value: _value}(); + WethLike(_wethLike).transfer(_to, _value); /// forge-lint: disable-line(erc20-unchecked-transfer) + } +} diff --git a/yarn.lock b/yarn.lock index b1c12d6..a17891f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,6 +26,13 @@ __metadata: languageName: node linkType: hard +"@adraffy/ens-normalize@npm:^1.11.0": + version: 1.11.1 + resolution: "@adraffy/ens-normalize@npm:1.11.1" + checksum: dd19274d9fcaf99bf08a62b64e54f4748de11b235767addbd3f7385ae1b7777bd704d17ff003ffaa3295a0b9d035929381cf3b38329c96260bff96aab8ad7b37 + languageName: node + linkType: hard + "@alloc/quick-lru@npm:^5.2.0": version: 5.2.0 resolution: "@alloc/quick-lru@npm:5.2.0" @@ -1340,26 +1347,31 @@ __metadata: languageName: node linkType: hard -"@chainlink/contracts@npm:^1.3.0": - version: 1.4.0 - resolution: "@chainlink/contracts@npm:1.4.0" +"@chainlink/contracts@npm:^1.4.0": + version: 1.5.0 + resolution: "@chainlink/contracts@npm:1.5.0" dependencies: "@arbitrum/nitro-contracts": "npm:3.0.0" - "@changesets/cli": "npm:~2.28.1" + "@changesets/cli": "npm:^2.29.6" "@changesets/get-github-info": "npm:^0.6.0" + "@eslint/eslintrc": "npm:^3.3.1" "@eth-optimism/contracts": "npm:0.6.0" - "@openzeppelin/contracts": "npm:4.9.6" + "@openzeppelin/contracts-4.7.3": "npm:@openzeppelin/contracts@4.7.3" + "@openzeppelin/contracts-4.8.3": "npm:@openzeppelin/contracts@4.8.3" + "@openzeppelin/contracts-4.9.6": "npm:@openzeppelin/contracts@4.9.6" + "@openzeppelin/contracts-5.0.2": "npm:@openzeppelin/contracts@5.0.2" + "@openzeppelin/contracts-5.1.0": "npm:@openzeppelin/contracts@5.1.0" "@openzeppelin/contracts-upgradeable": "npm:4.9.6" - "@scroll-tech/contracts": "npm:0.1.0" + "@scroll-tech/contracts": "npm:2.0.0" "@zksync/contracts": "github:matter-labs/era-contracts#446d391d34bdb48255d5f8fef8a8248925fc98b9" - semver: "npm:^7.7.1" - checksum: df6259b00fbed15cbe4723ce4ff93e2d2d49dc2463b5851f6ffc7b4c07ee3a3d517fb5b3a44adae06cf9bd7aa0cd26185b4fe0ee4a0ad16a9c5f9440b73ec9ac + semver: "npm:^7.7.2" + checksum: 41cbdf4e0f0c1af69f4c646a6ddcd74826fe40869d4b98c610a24cb531d227a449f0f2ed8c2ccb8d9951c25581442ef7411a4eb86a42a0c731049ef48f0f7543 languageName: node linkType: hard -"@changesets/apply-release-plan@npm:^7.0.10": - version: 7.0.12 - resolution: "@changesets/apply-release-plan@npm:7.0.12" +"@changesets/apply-release-plan@npm:^7.0.13": + version: 7.0.13 + resolution: "@changesets/apply-release-plan@npm:7.0.13" dependencies: "@changesets/config": "npm:^3.1.1" "@changesets/get-version-range-type": "npm:^0.4.0" @@ -1374,13 +1386,13 @@ __metadata: prettier: "npm:^2.7.1" resolve-from: "npm:^5.0.0" semver: "npm:^7.5.3" - checksum: 3ce05caa73b7b96a8a6be943507591925c44b22f209da001fb9d83df1d7a4569659e889373f5f7a208a121b3cf7bc17788969b8849bddaf13c27d6720e4e1c47 + checksum: b2ef4fc9a68ffd5c0543f0a98b8ea2321ff58519d541720646692a03844a2cd8e860ebcb93846be1e062926414dc343333196bfd8806fab26f637e8db8adbb9e languageName: node linkType: hard -"@changesets/assemble-release-plan@npm:^6.0.6, @changesets/assemble-release-plan@npm:^6.0.8": - version: 6.0.8 - resolution: "@changesets/assemble-release-plan@npm:6.0.8" +"@changesets/assemble-release-plan@npm:^6.0.9": + version: 6.0.9 + resolution: "@changesets/assemble-release-plan@npm:6.0.9" dependencies: "@changesets/errors": "npm:^0.2.0" "@changesets/get-dependents-graph": "npm:^2.1.3" @@ -1388,7 +1400,7 @@ __metadata: "@changesets/types": "npm:^6.1.0" "@manypkg/get-packages": "npm:^1.1.3" semver: "npm:^7.5.3" - checksum: 5d01fc42c67229874cc70b93fbdc971e11909aa7a72f1909c585ecb3fdc69f3ac105d243e1341cd5b07c02dee133be461fa48138125f00d137e71f8b7e8f428e + checksum: f84656eabb700ed77f97751b282e1701636ed45a44b443abd9af0291870495cc046fee301478010f39a1dc455799065ae007b9d7d2bb5ae8b793b65bbb8e052a languageName: node linkType: hard @@ -1401,29 +1413,29 @@ __metadata: languageName: node linkType: hard -"@changesets/cli@npm:~2.28.1": - version: 2.28.1 - resolution: "@changesets/cli@npm:2.28.1" +"@changesets/cli@npm:^2.29.6": + version: 2.29.7 + resolution: "@changesets/cli@npm:2.29.7" dependencies: - "@changesets/apply-release-plan": "npm:^7.0.10" - "@changesets/assemble-release-plan": "npm:^6.0.6" + "@changesets/apply-release-plan": "npm:^7.0.13" + "@changesets/assemble-release-plan": "npm:^6.0.9" "@changesets/changelog-git": "npm:^0.2.1" "@changesets/config": "npm:^3.1.1" "@changesets/errors": "npm:^0.2.0" "@changesets/get-dependents-graph": "npm:^2.1.3" - "@changesets/get-release-plan": "npm:^4.0.8" - "@changesets/git": "npm:^3.0.2" + "@changesets/get-release-plan": "npm:^4.0.13" + "@changesets/git": "npm:^3.0.4" "@changesets/logger": "npm:^0.1.1" "@changesets/pre": "npm:^2.0.2" - "@changesets/read": "npm:^0.6.3" + "@changesets/read": "npm:^0.6.5" "@changesets/should-skip-package": "npm:^0.1.2" "@changesets/types": "npm:^6.1.0" "@changesets/write": "npm:^0.4.0" + "@inquirer/external-editor": "npm:^1.0.0" "@manypkg/get-packages": "npm:^1.1.3" ansi-colors: "npm:^4.1.3" ci-info: "npm:^3.7.0" enquirer: "npm:^2.4.1" - external-editor: "npm:^3.1.0" fs-extra: "npm:^7.0.1" mri: "npm:^1.2.0" p-limit: "npm:^2.2.0" @@ -1435,7 +1447,7 @@ __metadata: term-size: "npm:^2.1.0" bin: changeset: bin.js - checksum: c2cb4063bfd02147970bd629565d05d7e13b9649446997ea5c17e250ef290a1b093f2a2cfaf1e6856597aa435499758f9d6d98bfb24035533376a9d2cc7f37f2 + checksum: e44ee8e9a09ffc990707ec272b03f5724890e6d8833815b80265a9e62f2784ee3fa76c858469fa95c53e1dabd9a0500a6c36b1343211fc0a38902d8fd1b1fce5 languageName: node linkType: hard @@ -1485,17 +1497,17 @@ __metadata: languageName: node linkType: hard -"@changesets/get-release-plan@npm:^4.0.8": - version: 4.0.12 - resolution: "@changesets/get-release-plan@npm:4.0.12" +"@changesets/get-release-plan@npm:^4.0.13": + version: 4.0.13 + resolution: "@changesets/get-release-plan@npm:4.0.13" dependencies: - "@changesets/assemble-release-plan": "npm:^6.0.8" + "@changesets/assemble-release-plan": "npm:^6.0.9" "@changesets/config": "npm:^3.1.1" "@changesets/pre": "npm:^2.0.2" "@changesets/read": "npm:^0.6.5" "@changesets/types": "npm:^6.1.0" "@manypkg/get-packages": "npm:^1.1.3" - checksum: d6482ecb6f1c2c47266493a36d05b484f0950d0a4472820649e953d073e3fdd612cdd8a4df9e3d7e00756d4e446dae639f9d6e0dab8a25f76bb6df77cd91c21c + checksum: 9983fae5a68012c4c418ddd62f2fb3d325363f21160252ff7b868503a1a2effb8fdd32e4a0289b72653afc3605ce19d163ff69205c942a0004efb571a5f78fd0 languageName: node linkType: hard @@ -1506,7 +1518,7 @@ __metadata: languageName: node linkType: hard -"@changesets/git@npm:^3.0.2, @changesets/git@npm:^3.0.4": +"@changesets/git@npm:^3.0.4": version: 3.0.4 resolution: "@changesets/git@npm:3.0.4" dependencies: @@ -1550,7 +1562,7 @@ __metadata: languageName: node linkType: hard -"@changesets/read@npm:^0.6.3, @changesets/read@npm:^0.6.5": +"@changesets/read@npm:^0.6.5": version: 0.6.5 resolution: "@changesets/read@npm:0.6.5" dependencies: @@ -2125,6 +2137,23 @@ __metadata: languageName: node linkType: hard +"@eslint/eslintrc@npm:^3.3.1": + version: 3.3.1 + resolution: "@eslint/eslintrc@npm:3.3.1" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: cc240addbab3c5fceaa65b2c8d5d4fd77ddbbf472c2f74f0270b9d33263dc9116840b6099c46b64c9680301146250439b044ed79278a1bcc557da412a4e3c1bb + languageName: node + linkType: hard + "@eslint/js@npm:8.57.1": version: 8.57.1 resolution: "@eslint/js@npm:8.57.1" @@ -3022,6 +3051,21 @@ __metadata: languageName: node linkType: hard +"@inquirer/external-editor@npm:^1.0.0": + version: 1.0.2 + resolution: "@inquirer/external-editor@npm:1.0.2" + dependencies: + chardet: "npm:^2.1.0" + iconv-lite: "npm:^0.7.0" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: d0c5c73249b8153f4cf872c4fba01c57a7653142a4cad496f17ed03ef3769330a4b3c519b68d70af69d4bb33003d2599b66b2242be85411c0b027ff383619666 + languageName: node + linkType: hard + "@internationalized/date@npm:^3.7.0, @internationalized/date@npm:^3.8.0": version: 3.8.0 resolution: "@internationalized/date@npm:3.8.0" @@ -3158,7 +3202,7 @@ __metadata: "@kleros/governor-v2-eslint-config": "workspace:^" "@kleros/governor-v2-prettier-config": "workspace:^" "@kleros/governor-v2-tsconfig": "workspace:^" - "@kleros/kleros-v2-contracts": "npm:^0.9.3" + "@kleros/kleros-v2-contracts": "npm:^0.12.0" "@logtail/pino": "npm:^0.4.0" "@nomicfoundation/hardhat-chai-matchers": "npm:^2.0.8" "@nomicfoundation/hardhat-ethers": "npm:^3.0.8" @@ -3240,6 +3284,24 @@ __metadata: languageName: unknown linkType: soft +"@kleros/kleros-v2-contracts@npm:^0.12.0": + version: 0.12.0 + resolution: "@kleros/kleros-v2-contracts@npm:0.12.0" + dependencies: + "@chainlink/contracts": "npm:^1.4.0" + "@kleros/vea-contracts": "npm:^0.6.0" + "@openzeppelin/contracts": "npm:^5.4.0" + "@shutter-network/shutter-sdk": "npm:0.0.2" + isomorphic-fetch: "npm:^3.0.0" + peerDependencies: + viem: ^2.24.1 + peerDependenciesMeta: + viem: + optional: false + checksum: 6b06670686246bc52355a5e103b268bc4faa4e634a2b0a5a0151bf47e631317378559701cce5163c9904adac917f1c7c2d668f09b5259bb4c1d984904b471163 + languageName: node + linkType: hard + "@kleros/kleros-v2-contracts@npm:^0.7.0": version: 0.7.0 resolution: "@kleros/kleros-v2-contracts@npm:0.7.0" @@ -3250,18 +3312,6 @@ __metadata: languageName: node linkType: hard -"@kleros/kleros-v2-contracts@npm:^0.9.3": - version: 0.9.3 - resolution: "@kleros/kleros-v2-contracts@npm:0.9.3" - dependencies: - "@chainlink/contracts": "npm:^1.3.0" - "@kleros/vea-contracts": "npm:^0.6.0" - "@openzeppelin/contracts": "npm:^5.2.0" - viem: "npm:^2.24.1" - checksum: 39862f09fc516f24e1ec2fc3bdde22aa83f58bada40c58e83ca15c8422b713cb8eac666673c67daf4873f4ca3d7c80ca3b7448d56936165847298b93ca2a9478 - languageName: node - linkType: hard - "@kleros/ui-components-library@npm:^3.4.5": version: 3.4.5 resolution: "@kleros/ui-components-library@npm:3.4.5" @@ -3851,7 +3901,7 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.8.0, @noble/hashes@npm:~1.8.0": +"@noble/hashes@npm:1.8.0, @noble/hashes@npm:^1.8.0, @noble/hashes@npm:~1.8.0": version: 1.8.0 resolution: "@noble/hashes@npm:1.8.0" checksum: 474b7f56bc6fb2d5b3a42132561e221b0ea4f91e590f4655312ca13667840896b34195e2b53b7f097ec080a1fdd3b58d902c2a8d0fbdf51d2e238b53808a177e @@ -4211,31 +4261,52 @@ __metadata: languageName: node linkType: hard -"@openzeppelin/contracts-upgradeable@npm:4.7.3": +"@openzeppelin/contracts-4.7.3@npm:@openzeppelin/contracts@4.7.3, @openzeppelin/contracts@npm:4.7.3": version: 4.7.3 - resolution: "@openzeppelin/contracts-upgradeable@npm:4.7.3" - checksum: 7c72ffeca867478b5aa8e8c7adb3d1ce114cfdc797ed4f3cd074788cf4da25d620ffffd624ac7e9d1223eecffeea9f7b79200ff70dc464cc828c470ccd12ddf1 + resolution: "@openzeppelin/contracts@npm:4.7.3" + checksum: 3d16ed8943938373ecc331c2ab83c3e8d0d89aed0c2a109aaa61ca6524b4c31cb5a81185c6f93ce9ee2dda685a4328fd85bd217929ae598f4be813d5d4cd1b78 languageName: node linkType: hard -"@openzeppelin/contracts-upgradeable@npm:4.9.6": +"@openzeppelin/contracts-4.8.3@npm:@openzeppelin/contracts@4.8.3": + version: 4.8.3 + resolution: "@openzeppelin/contracts@npm:4.8.3" + checksum: 276481d76afdc71690bd4204cdd47e6add30d183e20df57c76e5ffc481c783ca756842f3b0ac7e3e6336217dcde448cef8279fafae1176ac436ad86594c4bdc2 + languageName: node + linkType: hard + +"@openzeppelin/contracts-4.9.6@npm:@openzeppelin/contracts@4.9.6": version: 4.9.6 - resolution: "@openzeppelin/contracts-upgradeable@npm:4.9.6" - checksum: af9057147f13b6f0e13ca69581777f615f2cce8c6c274ec00fbea906a9095cd9ca1fb70e2c1282122a9f522fd639641c180bf1ad79bb2722494aac5ae9e565bc + resolution: "@openzeppelin/contracts@npm:4.9.6" + checksum: 71f45ad42e68c0559be4ba502115462a01c76fc805c08d3005c10b5550a093f1a2b00b2d7e9d6d1f331e147c50fd4ad832f71c4470ec5b34f5a2d0751cd19a47 languageName: node linkType: hard -"@openzeppelin/contracts@npm:4.7.3": +"@openzeppelin/contracts-5.0.2@npm:@openzeppelin/contracts@5.0.2": + version: 5.0.2 + resolution: "@openzeppelin/contracts@npm:5.0.2" + checksum: 938ebffbdade7dc59ea3df5b562c0e457bbefde9d82be8fa2acfd11da887df11653ac07922f41746b80cdbc106430e1e6978ce244fe99b00a7d9dc1418fc7670 + languageName: node + linkType: hard + +"@openzeppelin/contracts-5.1.0@npm:@openzeppelin/contracts@5.1.0": + version: 5.1.0 + resolution: "@openzeppelin/contracts@npm:5.1.0" + checksum: c3954d09b206af23a98d352177b49e4b2796a818ee01f082b223d54e6d394b3741a4ea6012570359d2a705d5e932a7b906ee38b64e3987ababfa73bcaa5a4805 + languageName: node + linkType: hard + +"@openzeppelin/contracts-upgradeable@npm:4.7.3": version: 4.7.3 - resolution: "@openzeppelin/contracts@npm:4.7.3" - checksum: 3d16ed8943938373ecc331c2ab83c3e8d0d89aed0c2a109aaa61ca6524b4c31cb5a81185c6f93ce9ee2dda685a4328fd85bd217929ae598f4be813d5d4cd1b78 + resolution: "@openzeppelin/contracts-upgradeable@npm:4.7.3" + checksum: 7c72ffeca867478b5aa8e8c7adb3d1ce114cfdc797ed4f3cd074788cf4da25d620ffffd624ac7e9d1223eecffeea9f7b79200ff70dc464cc828c470ccd12ddf1 languageName: node linkType: hard -"@openzeppelin/contracts@npm:4.9.6": +"@openzeppelin/contracts-upgradeable@npm:4.9.6": version: 4.9.6 - resolution: "@openzeppelin/contracts@npm:4.9.6" - checksum: 71f45ad42e68c0559be4ba502115462a01c76fc805c08d3005c10b5550a093f1a2b00b2d7e9d6d1f331e147c50fd4ad832f71c4470ec5b34f5a2d0751cd19a47 + resolution: "@openzeppelin/contracts-upgradeable@npm:4.9.6" + checksum: af9057147f13b6f0e13ca69581777f615f2cce8c6c274ec00fbea906a9095cd9ca1fb70e2c1282122a9f522fd639641c180bf1ad79bb2722494aac5ae9e565bc languageName: node linkType: hard @@ -4246,6 +4317,13 @@ __metadata: languageName: node linkType: hard +"@openzeppelin/contracts@npm:^5.4.0": + version: 5.4.0 + resolution: "@openzeppelin/contracts@npm:5.4.0" + checksum: 4f7f926ebd98279ba8223cae5d2cd38e0806e60e3e3a615c9d739ffab870ffab7a1e85f47092faa123c0f26d1699ca15252adea8bcdcaf360b21781acc93b218 + languageName: node + linkType: hard + "@paulmillr/qr@npm:^0.2.1": version: 0.2.1 resolution: "@paulmillr/qr@npm:0.2.1" @@ -6282,10 +6360,10 @@ __metadata: languageName: node linkType: hard -"@scroll-tech/contracts@npm:0.1.0": - version: 0.1.0 - resolution: "@scroll-tech/contracts@npm:0.1.0" - checksum: 7b32c4fbd7bafccb4c44f435764e9869486f0094759db24fca5021a3001ea61983a1902eff772c3d003a16470bde28859c975b3a6736264d651695dfbfc3665b +"@scroll-tech/contracts@npm:2.0.0": + version: 2.0.0 + resolution: "@scroll-tech/contracts@npm:2.0.0" + checksum: 316f68354beacc26c1e3e534ef02d75ed5d3cf0f496fbd5aaca8e0ce38959275bb1a2c60ea801d462d60b1f736e37131e211ec5d2968145fe16c60a57c880fba languageName: node linkType: hard @@ -6354,7 +6432,7 @@ __metadata: languageName: node linkType: hard -"@scure/bip32@npm:1.7.0": +"@scure/bip32@npm:1.7.0, @scure/bip32@npm:^1.7.0": version: 1.7.0 resolution: "@scure/bip32@npm:1.7.0" dependencies: @@ -6405,7 +6483,7 @@ __metadata: languageName: node linkType: hard -"@scure/bip39@npm:1.6.0": +"@scure/bip39@npm:1.6.0, @scure/bip39@npm:^1.6.0": version: 1.6.0 resolution: "@scure/bip39@npm:1.6.0" dependencies: @@ -6497,6 +6575,18 @@ __metadata: languageName: node linkType: hard +"@shutter-network/shutter-sdk@npm:0.0.2": + version: 0.0.2 + resolution: "@shutter-network/shutter-sdk@npm:0.0.2" + dependencies: + browser-or-node: "npm:^3.0.0" + buffer: "npm:^6.0.3" + lodash: "npm:^4.17.21" + viem: "npm:^2.23.2" + checksum: da53a9cf757be3204fa0e806e6a39e9dee6f6141471c9220c82f5a8f461615b565d30516880eaaa5d31308345839e7f8e9b5534fd9f0eb0abc243ff4c774becd + languageName: node + linkType: hard + "@sindresorhus/is@npm:^5.2.0": version: 5.6.0 resolution: "@sindresorhus/is@npm:5.6.0" @@ -8362,6 +8452,21 @@ __metadata: languageName: node linkType: hard +"abitype@npm:1.1.0": + version: 1.1.0 + resolution: "abitype@npm:1.1.0" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: fe445c095dcb255e32c50bb1342a49d32c03def8549347bfe7f73f54ebdc3198adf2af6366af89e1e9bd3d04beab3f22f35e099754655a6becd45e09ca30d375 + languageName: node + linkType: hard + "abitype@npm:^0.10.3": version: 0.10.3 resolution: "abitype@npm:0.10.3" @@ -8377,6 +8482,21 @@ __metadata: languageName: node linkType: hard +"abitype@npm:^1.0.9": + version: 1.1.1 + resolution: "abitype@npm:1.1.1" + peerDependencies: + typescript: ">=5.0.4" + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + checksum: 3193d4e228caf606e4c915858e0af78b0b2529fc3baa149c2516379db74c0f9e2ace1999bf479a515b4f8f06d27b1cf8fca37f60b4f73a251eedd7bcac11cf89 + languageName: node + linkType: hard + "abort-controller@npm:^3.0.0": version: 3.0.0 resolution: "abort-controller@npm:3.0.0" @@ -9257,6 +9377,13 @@ __metadata: languageName: node linkType: hard +"browser-or-node@npm:^3.0.0": + version: 3.0.0 + resolution: "browser-or-node@npm:3.0.0" + checksum: 51d74cc5d0139da3d37e83ff3906fcca20d02c42aa8b81a48d9ea01806f36df1a4b55006670071b1d7423967777275920054ec8b723410534b580b0232c5093d + languageName: node + linkType: hard + "browser-stdout@npm:^1.3.1": version: 1.3.1 resolution: "browser-stdout@npm:1.3.1" @@ -9672,10 +9799,10 @@ __metadata: languageName: node linkType: hard -"chardet@npm:^0.7.0": - version: 0.7.0 - resolution: "chardet@npm:0.7.0" - checksum: b0ec668fba5eeec575ed2559a0917ba41a6481f49063c8445400e476754e0957ee09e44dc032310f526182b8f1bf25e9d4ed371f74050af7be1383e06bc44952 +"chardet@npm:^2.1.0": + version: 2.1.0 + resolution: "chardet@npm:2.1.0" + checksum: 8085fd8e5b1234fafacb279b4dab84dc127f512f953441daf09fc71ade70106af0dff28e86bfda00bab0de61fb475fa9003c87f82cbad3da02a4f299bfd427da languageName: node linkType: hard @@ -12599,17 +12726,6 @@ __metadata: languageName: node linkType: hard -"external-editor@npm:^3.1.0": - version: 3.1.0 - resolution: "external-editor@npm:3.1.0" - dependencies: - chardet: "npm:^0.7.0" - iconv-lite: "npm:^0.4.24" - tmp: "npm:^0.0.33" - checksum: 776dff1d64a1d28f77ff93e9e75421a81c062983fd1544279d0a32f563c0b18c52abbb211f31262e2827e48edef5c9dc8f960d06dd2d42d1654443b88568056b - languageName: node - linkType: hard - "fast-copy@npm:^3.0.0": version: 3.0.2 resolution: "fast-copy@npm:3.0.2" @@ -14101,7 +14217,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": +"iconv-lite@npm:0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" dependencies: @@ -14119,6 +14235,15 @@ __metadata: languageName: node linkType: hard +"iconv-lite@npm:^0.7.0": + version: 0.7.0 + resolution: "iconv-lite@npm:0.7.0" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 5bfc897fedfb7e29991ae5ef1c061ed4f864005f8c6d61ef34aba6a3885c04bd207b278c0642b041383aeac2d11645b4319d0ca7b863b0be4be0cde1c9238ca7 + languageName: node + linkType: hard + "icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": version: 5.1.0 resolution: "icss-utils@npm:5.1.0" @@ -14723,6 +14848,16 @@ __metadata: languageName: node linkType: hard +"isomorphic-fetch@npm:^3.0.0": + version: 3.0.0 + resolution: "isomorphic-fetch@npm:3.0.0" + dependencies: + node-fetch: "npm:^2.6.1" + whatwg-fetch: "npm:^3.4.1" + checksum: 568fe0307528c63405c44dd3873b7b6c96c0d19ff795cb15846e728b6823bdbc68cc8c97ac23324509661316f12f551e43dac2929bc7030b8bc4d6aa1158b857 + languageName: node + linkType: hard + "isows@npm:1.0.3": version: 1.0.3 resolution: "isows@npm:1.0.3" @@ -16498,7 +16633,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.5.0, node-fetch@npm:^2.7.0": +"node-fetch@npm:^2.5.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.7.0": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -16971,6 +17106,27 @@ __metadata: languageName: node linkType: hard +"ox@npm:0.9.6": + version: 0.9.6 + resolution: "ox@npm:0.9.6" + dependencies: + "@adraffy/ens-normalize": "npm:^1.11.0" + "@noble/ciphers": "npm:^1.3.0" + "@noble/curves": "npm:1.9.1" + "@noble/hashes": "npm:^1.8.0" + "@scure/bip32": "npm:^1.7.0" + "@scure/bip39": "npm:^1.6.0" + abitype: "npm:^1.0.9" + eventemitter3: "npm:5.0.1" + peerDependencies: + typescript: ">=5.4.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 9fb1a89c710c02366fe2fdda7db4e17474336456d3b80fa24e059b3d269b45e94abfe950d7f52b220abc33cde2b75d03d24f31493382a6bab37ec5aada2bd925 + languageName: node + linkType: hard + "p-cancelable@npm:^3.0.0": version: 3.0.0 resolution: "p-cancelable@npm:3.0.0" @@ -19005,7 +19161,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.5.3": +"semver@npm:^7.5.3, semver@npm:^7.7.2": version: 7.7.2 resolution: "semver@npm:7.7.2" bin: @@ -21342,24 +21498,24 @@ __metadata: languageName: node linkType: hard -"viem@npm:^2.24.1": - version: 2.30.6 - resolution: "viem@npm:2.30.6" +"viem@npm:^2.23.2": + version: 2.37.13 + resolution: "viem@npm:2.37.13" dependencies: "@noble/curves": "npm:1.9.1" "@noble/hashes": "npm:1.8.0" "@scure/bip32": "npm:1.7.0" "@scure/bip39": "npm:1.6.0" - abitype: "npm:1.0.8" + abitype: "npm:1.1.0" isows: "npm:1.0.7" - ox: "npm:0.7.1" - ws: "npm:8.18.2" + ox: "npm:0.9.6" + ws: "npm:8.18.3" peerDependencies: typescript: ">=5.0.4" peerDependenciesMeta: typescript: optional: true - checksum: fe52ad1caff4f719adcaff6e5138bb48041b9bc85cf149a62c0724b9574e133e4a2352884d76b7ad1fe2b7f52e51ef9e348b8a0d1d1f7a53360fc18cdf67d1e8 + checksum: 7cc09f5e4d6bc9679d488e6d5dfe2d226267104b79258774fa50fa9cf8188046e274f2fd6eae30a3e7202c2196d66eaeaa746abf9f63eaaa5f6cecdc387bf427 languageName: node linkType: hard @@ -21586,6 +21742,13 @@ __metadata: languageName: node linkType: hard +"whatwg-fetch@npm:^3.4.1": + version: 3.6.20 + resolution: "whatwg-fetch@npm:3.6.20" + checksum: 2b4ed92acd6a7ad4f626a6cb18b14ec982bbcaf1093e6fe903b131a9c6decd14d7f9c9ca3532663c2759d1bdf01d004c77a0adfb2716a5105465c20755a8c57c + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -21860,6 +22023,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:8.18.3": + version: 8.18.3 + resolution: "ws@npm:8.18.3" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 725964438d752f0ab0de582cd48d6eeada58d1511c3f613485b5598a83680bedac6187c765b0fe082e2d8cc4341fc57707c813ae780feee82d0c5efe6a4c61b6 + languageName: node + linkType: hard + "ws@npm:^7.4.6, ws@npm:^7.5.1": version: 7.5.10 resolution: "ws@npm:7.5.10" From 74efbcd0a3c8890329344ca10067248b7bd9394d Mon Sep 17 00:00:00 2001 From: jaybuidl Date: Tue, 4 Nov 2025 17:41:08 +0000 Subject: [PATCH 2/6] chore: sync with the latest changes --- contracts/deploy/00-governor-v2.ts | 8 +- contracts/deployments/arbitrum/.chainId | 1 + contracts/deployments/arbitrum/WETH.json | 136 ++++++ .../arbitrumSepoliaDevnet/WETH.json | 458 ++++++++++++++++++ contracts/src/GovernorFactory.sol | 11 +- contracts/src/KlerosGovernor.sol | 11 +- 6 files changed, 616 insertions(+), 9 deletions(-) create mode 100644 contracts/deployments/arbitrum/.chainId create mode 100644 contracts/deployments/arbitrum/WETH.json create mode 100644 contracts/deployments/arbitrumSepoliaDevnet/WETH.json diff --git a/contracts/deploy/00-governor-v2.ts b/contracts/deploy/00-governor-v2.ts index 6a3d46e..34c2cac 100644 --- a/contracts/deploy/00-governor-v2.ts +++ b/contracts/deploy/00-governor-v2.ts @@ -18,6 +18,8 @@ const deploy: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { const chainId = Number(await getChainId()); console.log("deploying to %s with deployer %s", HomeChains[chainId], deployer); + const wNative = await ethers.getContract("WETH"); + const { disputeTemplateRegistry, klerosCore } = await getArbitratorContracts(hre); const disputeTemplate = templateFn(klerosCore.target.toString(), chainId); @@ -26,7 +28,7 @@ const deploy: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { log: true, }); - const governorFactory = (await ethers.getContract("GovernorFactory")) as GovernorFactory; + const governorFactory = await ethers.getContract("GovernorFactory"); await governorFactory.deploy( klerosCore.target, extraData, @@ -36,7 +38,8 @@ const deploy: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { 0, 600, 600, - 600 // feeTimeout: 10 minutes + 600, // feeTimeout: 10 minutes + wNative.target ); await deploy("KlerosGovernor", { @@ -51,6 +54,7 @@ const deploy: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { 600, 600, 600, // feeTimeout: 10 minutes + wNative.target, ], log: true, }); diff --git a/contracts/deployments/arbitrum/.chainId b/contracts/deployments/arbitrum/.chainId new file mode 100644 index 0000000..1395ca7 --- /dev/null +++ b/contracts/deployments/arbitrum/.chainId @@ -0,0 +1 @@ +42161 diff --git a/contracts/deployments/arbitrum/WETH.json b/contracts/deployments/arbitrum/WETH.json new file mode 100644 index 0000000..ba8ed29 --- /dev/null +++ b/contracts/deployments/arbitrum/WETH.json @@ -0,0 +1,136 @@ +{ + "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "changeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] +} diff --git a/contracts/deployments/arbitrumSepoliaDevnet/WETH.json b/contracts/deployments/arbitrumSepoliaDevnet/WETH.json new file mode 100644 index 0000000..88c25ff --- /dev/null +++ b/contracts/deployments/arbitrumSepoliaDevnet/WETH.json @@ -0,0 +1,458 @@ +{ + "address": "0x3829A2486d53ee984a0ca2D76552715726b77138", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xf0f89ebb30e850b7c573ab0fa6b56ee46381de866cddc3afbaf3dbb60f632e17", + "receipt": { + "to": null, + "from": "0xf1C7c037891525E360C59f708739Ac09A7670c59", + "contractAddress": "0x3829A2486d53ee984a0ca2D76552715726b77138", + "transactionIndex": 1, + "gasUsed": "621542", + "logsBloom": "0x00000020000000000000000000000000000000000040000000000000000008000000000000000000000000000000000000000000000080000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000002000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x3706ffb00d4b8e4f33496fbf5465bcd47767393e5e57a2d231c98109bed29ad2", + "transactionHash": "0xf0f89ebb30e850b7c573ab0fa6b56ee46381de866cddc3afbaf3dbb60f632e17", + "logs": [ + { + "transactionIndex": 1, + "blockNumber": 3084557, + "transactionHash": "0xf0f89ebb30e850b7c573ab0fa6b56ee46381de866cddc3afbaf3dbb60f632e17", + "address": "0x3829A2486d53ee984a0ca2D76552715726b77138", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000f1c7c037891525e360c59f708739ac09a7670c59" + ], + "data": "0x00000000000000000000000000000000000000000000d3c21bcecceda1000000", + "logIndex": 0, + "blockHash": "0x3706ffb00d4b8e4f33496fbf5465bcd47767393e5e57a2d231c98109bed29ad2" + } + ], + "blockNumber": 3084557, + "cumulativeGasUsed": "621542", + "status": 1, + "byzantium": true + }, + "args": [ + "WETH", + "WETH" + ], + "numDeployments": 1, + "solcInputHash": "4ee8a1f2013c130bec1668c5304bc76a", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/token/TestERC20.sol\":\"TestERC20\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * The default value of {decimals} is 18. To change this, you should override\\n * this function so it returns a different value.\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the default value returned by this function, unless\\n * it's overridden.\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(address from, address to, uint256 amount) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\\n // decrementing then incrementing.\\n _balances[to] += amount;\\n }\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n unchecked {\\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\\n _balances[account] += amount;\\n }\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n // Overflow not possible: amount <= accountBalance <= totalSupply.\\n _totalSupply -= amount;\\n }\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(address owner, address spender, uint256 amount) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\\n}\\n\",\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"src/token/TestERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.18;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\n\\ncontract TestERC20 is ERC20 {\\n constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {\\n _mint(msg.sender, 1000000 ether);\\n }\\n}\\n\",\"keccak256\":\"0x9f67e6b63ca87e6c98b2986364ce16a747ce4098e9146fffb17ea13863c0b7e4\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162000c5838038062000c5883398101604081905262000034916200020a565b8181600362000044838262000302565b50600462000053828262000302565b505050620000723369d3c21bcecceda10000006200007a60201b60201c565b5050620003f6565b6001600160a01b038216620000d55760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620000e99190620003ce565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200016d57600080fd5b81516001600160401b03808211156200018a576200018a62000145565b604051601f8301601f19908116603f01168101908282118183101715620001b557620001b562000145565b81604052838152602092508683858801011115620001d257600080fd5b600091505b83821015620001f65785820183015181830184015290820190620001d7565b600093810190920192909252949350505050565b600080604083850312156200021e57600080fd5b82516001600160401b03808211156200023657600080fd5b62000244868387016200015b565b935060208501519150808211156200025b57600080fd5b506200026a858286016200015b565b9150509250929050565b600181811c908216806200028957607f821691505b602082108103620002aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200014057600081815260208120601f850160051c81016020861015620002d95750805b601f850160051c820191505b81811015620002fa57828155600101620002e5565b505050505050565b81516001600160401b038111156200031e576200031e62000145565b62000336816200032f845462000274565b84620002b0565b602080601f8311600181146200036e5760008415620003555750858301515b600019600386901b1c1916600185901b178555620002fa565b600085815260208120601f198616915b828110156200039f578886015182559484019460019091019084016200037e565b5085821015620003be5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115620003f057634e487b7160e01b600052601160045260246000fd5b92915050565b61085280620004066000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012357806370a082311461013657806395d89b411461015f578063a457c2d714610167578063a9059cbb1461017a578063dd62ed3e1461018d57600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610101578063313ce56714610114575b600080fd5b6100b66101a0565b6040516100c3919061069c565b60405180910390f35b6100df6100da366004610706565b610232565b60405190151581526020016100c3565b6002545b6040519081526020016100c3565b6100df61010f366004610730565b61024c565b604051601281526020016100c3565b6100df610131366004610706565b610270565b6100f361014436600461076c565b6001600160a01b031660009081526020819052604090205490565b6100b6610292565b6100df610175366004610706565b6102a1565b6100df610188366004610706565b610321565b6100f361019b36600461078e565b61032f565b6060600380546101af906107c1565b80601f01602080910402602001604051908101604052809291908181526020018280546101db906107c1565b80156102285780601f106101fd57610100808354040283529160200191610228565b820191906000526020600020905b81548152906001019060200180831161020b57829003601f168201915b5050505050905090565b60003361024081858561035a565b60019150505b92915050565b60003361025a85828561047e565b6102658585856104f8565b506001949350505050565b600033610240818585610283838361032f565b61028d91906107fb565b61035a565b6060600480546101af906107c1565b600033816102af828661032f565b9050838110156103145760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610265828686840361035a565b6000336102408185856104f8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103bc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161030b565b6001600160a01b03821661041d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161030b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061048a848461032f565b905060001981146104f257818110156104e55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161030b565b6104f2848484840361035a565b50505050565b6001600160a01b03831661055c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161030b565b6001600160a01b0382166105be5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161030b565b6001600160a01b038316600090815260208190526040902054818110156106365760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161030b565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104f2565b600060208083528351808285015260005b818110156106c9578581018301518582016040015282016106ad565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461070157600080fd5b919050565b6000806040838503121561071957600080fd5b610722836106ea565b946020939093013593505050565b60008060006060848603121561074557600080fd5b61074e846106ea565b925061075c602085016106ea565b9150604084013590509250925092565b60006020828403121561077e57600080fd5b610787826106ea565b9392505050565b600080604083850312156107a157600080fd5b6107aa836106ea565b91506107b8602084016106ea565b90509250929050565b600181811c908216806107d557607f821691505b6020821081036107f557634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561024657634e487b7160e01b600052601160045260246000fdfea26469706673582212203a956e65a766c03ac95ae037cbdfb51b56810340c98132c2d2482405d386101b64736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012357806370a082311461013657806395d89b411461015f578063a457c2d714610167578063a9059cbb1461017a578063dd62ed3e1461018d57600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610101578063313ce56714610114575b600080fd5b6100b66101a0565b6040516100c3919061069c565b60405180910390f35b6100df6100da366004610706565b610232565b60405190151581526020016100c3565b6002545b6040519081526020016100c3565b6100df61010f366004610730565b61024c565b604051601281526020016100c3565b6100df610131366004610706565b610270565b6100f361014436600461076c565b6001600160a01b031660009081526020819052604090205490565b6100b6610292565b6100df610175366004610706565b6102a1565b6100df610188366004610706565b610321565b6100f361019b36600461078e565b61032f565b6060600380546101af906107c1565b80601f01602080910402602001604051908101604052809291908181526020018280546101db906107c1565b80156102285780601f106101fd57610100808354040283529160200191610228565b820191906000526020600020905b81548152906001019060200180831161020b57829003601f168201915b5050505050905090565b60003361024081858561035a565b60019150505b92915050565b60003361025a85828561047e565b6102658585856104f8565b506001949350505050565b600033610240818585610283838361032f565b61028d91906107fb565b61035a565b6060600480546101af906107c1565b600033816102af828661032f565b9050838110156103145760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610265828686840361035a565b6000336102408185856104f8565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103bc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161030b565b6001600160a01b03821661041d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161030b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061048a848461032f565b905060001981146104f257818110156104e55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161030b565b6104f2848484840361035a565b50505050565b6001600160a01b03831661055c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161030b565b6001600160a01b0382166105be5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161030b565b6001600160a01b038316600090815260208190526040902054818110156106365760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161030b565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104f2565b600060208083528351808285015260005b818110156106c9578581018301518582016040015282016106ad565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461070157600080fd5b919050565b6000806040838503121561071957600080fd5b610722836106ea565b946020939093013593505050565b60008060006060848603121561074557600080fd5b61074e846106ea565b925061075c602085016106ea565b9150604084013590509250925092565b60006020828403121561077e57600080fd5b610787826106ea565b9392505050565b600080604083850312156107a157600080fd5b6107aa836106ea565b91506107b8602084016106ea565b90509250929050565b600181811c908216806107d557607f821691505b6020821081036107f557634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561024657634e487b7160e01b600052601160045260246000fdfea26469706673582212203a956e65a766c03ac95ae037cbdfb51b56810340c98132c2d2482405d386101b64736f6c63430008120033", + "devdoc": { + "events": { + "Approval(address,address,uint256)": { + "details": "Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance." + }, + "Transfer(address,address,uint256)": { + "details": "Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero." + } + }, + "kind": "dev", + "methods": { + "allowance(address,address)": { + "details": "See {IERC20-allowance}." + }, + "approve(address,uint256)": { + "details": "See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address." + }, + "balanceOf(address)": { + "details": "See {IERC20-balanceOf}." + }, + "decimals()": { + "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." + }, + "decreaseAllowance(address,uint256)": { + "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." + }, + "increaseAllowance(address,uint256)": { + "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." + }, + "name()": { + "details": "Returns the name of the token." + }, + "symbol()": { + "details": "Returns the symbol of the token, usually a shorter version of the name." + }, + "totalSupply()": { + "details": "See {IERC20-totalSupply}." + }, + "transfer(address,uint256)": { + "details": "See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 393, + "contract": "src/token/TestERC20.sol:TestERC20", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 399, + "contract": "src/token/TestERC20.sol:TestERC20", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 401, + "contract": "src/token/TestERC20.sol:TestERC20", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 403, + "contract": "src/token/TestERC20.sol:TestERC20", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 405, + "contract": "src/token/TestERC20.sol:TestERC20", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} diff --git a/contracts/src/GovernorFactory.sol b/contracts/src/GovernorFactory.sol index b39f599..b4c5113 100644 --- a/contracts/src/GovernorFactory.sol +++ b/contracts/src/GovernorFactory.sol @@ -3,7 +3,9 @@ pragma solidity 0.8.24; import {IArbitratorV2} from "@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol"; -import "@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol"; +import { + IDisputeTemplateRegistry +} from "@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol"; import {KlerosGovernor} from "./KlerosGovernor.sol"; /// @title GovernorFactory @@ -37,6 +39,7 @@ contract GovernorFactory { /// @param _submissionTimeout Time in seconds allocated for submitting transaction list. /// @param _executionTimeout Time in seconds after approval that allows to execute transactions of the approved list. /// @param _withdrawTimeout Time in seconds after submission that allows to withdraw submitted list. + /// @param _wNative The wrapped native token address, typically wETH. function deploy( IArbitratorV2 _arbitrator, bytes memory _arbitratorExtraData, @@ -46,7 +49,8 @@ contract GovernorFactory { uint256 _submissionBaseDeposit, uint256 _submissionTimeout, uint256 _executionTimeout, - uint256 _withdrawTimeout + uint256 _withdrawTimeout, + address _wNative ) public { KlerosGovernor instance = new KlerosGovernor( _arbitrator, @@ -57,7 +61,8 @@ contract GovernorFactory { _submissionBaseDeposit, _submissionTimeout, _executionTimeout, - _withdrawTimeout + _withdrawTimeout, + _wNative ); instances.push(instance); emit NewGovernor(instance); diff --git a/contracts/src/KlerosGovernor.sol b/contracts/src/KlerosGovernor.sol index 0aff261..a07c445 100644 --- a/contracts/src/KlerosGovernor.sol +++ b/contracts/src/KlerosGovernor.sol @@ -2,10 +2,13 @@ pragma solidity ^0.8.24; -import {IArbitrableV2, IArbitratorV2} from "@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol"; -import "@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol"; +import {IArbitrableV2} from "@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol"; +import {IArbitratorV2} from "@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitratorV2.sol"; +import { + IDisputeTemplateRegistry +} from "@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol"; import {SafeSend} from "./libraries/SafeSend.sol"; -import "./interfaces/IArbSys.sol"; +import {ArbSys} from "./interfaces/IArbSys.sol"; /// @title KlerosGovernor for V2. /// @dev Appeal and evidence submission is handled by the court. @@ -318,7 +321,7 @@ contract KlerosGovernor is IArbitrableV2 { // Check in case arbitration cost increased after the submission. It's unlikely that its increase won't be covered by the base deposit, but technically possible. session.sumDeposit = session.sumDeposit > arbitrationCost ? session.sumDeposit - arbitrationCost : 0; reservedETH = reservedETH > arbitrationCost ? reservedETH - arbitrationCost : 0; - emit DisputeRequest(arbitrator, session.disputeID, sessions.length - 1, templateId); + emit DisputeRequest(arbitrator, session.disputeID, templateId); } } From e484452409b3045483cce6694cdfe02954edef96 Mon Sep 17 00:00:00 2001 From: Harman-singh-waraich Date: Mon, 17 Nov 2025 17:52:51 +0530 Subject: [PATCH 3/6] chore: update-deploy-contracts-and-etherscan-verify-tooling --- contracts/deploy/00-governor-v2.ts | 64 ++- contracts/deploy/utils/getContracts.ts | 2 +- .../GovernorFactory.json | 43 +- .../arbitrumSepoliaDevnet/KlerosGovernor.json | 416 ++++++++++++------ contracts/hardhat.config.ts | 10 +- contracts/package.json | 4 +- contracts/scripts/dotenv.sh | 15 + contracts/scripts/verifyProxies.sh | 19 +- yarn.lock | 62 +-- 9 files changed, 429 insertions(+), 206 deletions(-) create mode 100755 contracts/scripts/dotenv.sh diff --git a/contracts/deploy/00-governor-v2.ts b/contracts/deploy/00-governor-v2.ts index 34c2cac..9a178e5 100644 --- a/contracts/deploy/00-governor-v2.ts +++ b/contracts/deploy/00-governor-v2.ts @@ -10,7 +10,7 @@ const extraData = "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003"; const deploy: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { - const { deployments, getNamedAccounts, getChainId, ethers } = hre; + const { deployments, getNamedAccounts, getChainId, ethers, network } = hre; const { deploy } = deployments; // fallback to hardhat node signers on local network @@ -23,13 +23,14 @@ const deploy: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { const { disputeTemplateRegistry, klerosCore } = await getArbitratorContracts(hre); const disputeTemplate = templateFn(klerosCore.target.toString(), chainId); - await deploy("GovernorFactory", { + const gfDeployment = await deploy("GovernorFactory", { from: deployer, log: true, }); const governorFactory = await ethers.getContract("GovernorFactory"); - await governorFactory.deploy( + + const gfArgs = [ klerosCore.target, extraData, disputeTemplateRegistry.target, @@ -39,25 +40,56 @@ const deploy: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { 600, 600, 600, // feeTimeout: 10 minutes + wNative.target, + ]; + + await governorFactory.deploy( + klerosCore.target, + extraData, + disputeTemplateRegistry.target, + disputeTemplate, + dataMappings, + 0, + 600, + 600, + 600, // feeTimeout: 10 minutes, wNative.target ); - await deploy("KlerosGovernor", { + const kgArgs = gfArgs; + const kgDeployment = await deploy("KlerosGovernor", { from: deployer, - args: [ - klerosCore.target, - extraData, - disputeTemplateRegistry.target, - disputeTemplate, - dataMappings, - 0, - 600, - 600, - 600, // feeTimeout: 10 minutes - wNative.target, - ], + args: kgArgs, log: true, }); + + const shouldVerify = !network.name.includes("hardhat") && !network.name.includes("localhost"); + + if (shouldVerify) { + console.log("Verifying on Etherscan…"); + + try { + // GovernorFactory + await hre.run("verify:verify", { + address: gfDeployment.address, + constructorArguments: [], + }); + console.log(`✓ Verified GovernorFactory at ${gfDeployment.address}`); + } catch (err) { + console.warn("GovernorFactory already verified or failed:", err); + } + + try { + // KlerosGovernor + await hre.run("verify:verify", { + address: kgDeployment.address, + constructorArguments: kgArgs, + }); + console.log(`✓ Verified KlerosGovernor at ${kgDeployment.address}`); + } catch (err) { + console.warn("KlerosGovernor already verified or failed:", err); + } + } }; deploy.tags = ["KlerosGovernor"]; diff --git a/contracts/deploy/utils/getContracts.ts b/contracts/deploy/utils/getContracts.ts index 274d69a..6ccfe62 100644 --- a/contracts/deploy/utils/getContracts.ts +++ b/contracts/deploy/utils/getContracts.ts @@ -5,7 +5,7 @@ import { KlerosGovernor } from "../../typechain-types"; const NETWORK_TO_DEPLOYMENT: Record = { arbitrumSepoliaDevnet: "devnet", arbitrumSepolia: "testnet", - arbitrum: "mainnetNeo", + arbitrum: "mainnet", } as const; export const getArbitratorContracts = async (hre: HardhatRuntimeEnvironment) => { diff --git a/contracts/deployments/arbitrumSepoliaDevnet/GovernorFactory.json b/contracts/deployments/arbitrumSepoliaDevnet/GovernorFactory.json index 3fb041d..c8f21e5 100644 --- a/contracts/deployments/arbitrumSepoliaDevnet/GovernorFactory.json +++ b/contracts/deployments/arbitrumSepoliaDevnet/GovernorFactory.json @@ -1,5 +1,5 @@ { - "address": "0xd02D8cC93F9e7FFf67c4aCB2D3a244265325d885", + "address": "0x46E3D4B6BFf95eee12ae4C3A3bC6a2f17C309Fc1", "abi": [ { "anonymous": false, @@ -60,6 +60,11 @@ "internalType": "uint256", "name": "_withdrawTimeout", "type": "uint256" + }, + { + "internalType": "address", + "name": "_wNative", + "type": "address" } ], "name": "deploy", @@ -87,28 +92,28 @@ "type": "function" } ], - "transactionHash": "0x7ceccc42bf2c5c7c7f7357eadd61267a473e2b6eab2b196444f8255c31e3b636", + "transactionHash": "0xebccc0abd28e439497f91730e0bbc009cbea433359c0133695c85479510d8fd8", "receipt": { "to": null, "from": "0x88AB19C0c7b57EeBa545acbD4368748194cd796B", - "contractAddress": "0xd02D8cC93F9e7FFf67c4aCB2D3a244265325d885", - "transactionIndex": 2, - "gasUsed": "2991711", + "contractAddress": "0x46E3D4B6BFf95eee12ae4C3A3bC6a2f17C309Fc1", + "transactionIndex": 1, + "gasUsed": "2897040", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x6c5391273a329ca5602507d8152906b370820ea5a74cdf2416b97b02ead3904d", - "transactionHash": "0x7ceccc42bf2c5c7c7f7357eadd61267a473e2b6eab2b196444f8255c31e3b636", + "blockHash": "0xccf85552a3febb677e55f5f9e6bc40509d98c86294fcafbe8cec1fa87ae8b0dd", + "transactionHash": "0xebccc0abd28e439497f91730e0bbc009cbea433359c0133695c85479510d8fd8", "logs": [], - "blockNumber": 163024895, - "cumulativeGasUsed": "3018182", + "blockNumber": 216121450, + "cumulativeGasUsed": "2897040", "status": 1, "byzantium": true }, "args": [], - "numDeployments": 10, - "solcInputHash": "2b0d0fdba984395deae7da9f7f5e9dd6", - "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract KlerosGovernor\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"NewGovernor\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_arbitratorExtraData\",\"type\":\"bytes\"},{\"internalType\":\"contract IDisputeTemplateRegistry\",\"name\":\"_templateRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_templateData\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_templateDataMappings\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_submissionBaseDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_submissionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_executionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_withdrawTimeout\",\"type\":\"uint256\"}],\"name\":\"deploy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"instances\",\"outputs\":[{\"internalType\":\"contract KlerosGovernor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"NewGovernor(address)\":{\"details\":\"Emitted when a new Governor contract is deployed using this factory.\",\"params\":{\"_address\":\"The address of the newly deployed Governor contract.\"}}},\"kind\":\"dev\",\"methods\":{\"deploy(address,bytes,address,string,string,uint256,uint256,uint256,uint256)\":{\"details\":\"Deploy the arbitrable kleros.\",\"params\":{\"_arbitrator\":\"The arbitrator of the contract.\",\"_arbitratorExtraData\":\"Extra data for the arbitrator.\",\"_executionTimeout\":\"Time in seconds after approval that allows to execute transactions of the approved list.\",\"_submissionBaseDeposit\":\"The base deposit required for submission.\",\"_submissionTimeout\":\"Time in seconds allocated for submitting transaction list.\",\"_templateData\":\"The dispute template data.\",\"_templateDataMappings\":\"The dispute template data mappings.\",\"_templateRegistry\":\"Dispute Template registry address\",\"_withdrawTimeout\":\"Time in seconds after submission that allows to withdraw submitted list.\"}}},\"title\":\"GovernorFactory This contract acts as a registry for KlerosGovernor instances.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/GovernorFactory.sol\":\"GovernorFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[]},\"sources\":{\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.24;\\n\\nimport \\\"./IArbitratorV2.sol\\\";\\n\\n/// @title IArbitrableV2\\n/// @notice Arbitrable interface.\\n/// @dev When developing arbitrable contracts, we need to:\\n/// - Define the action taken when a ruling is received by the contract.\\n/// - Allow dispute creation. For this a function must call arbitrator.createDispute{value: _fee}(_choices,_extraData);\\ninterface IArbitrableV2 {\\n /// @dev To be emitted when a dispute is created to link the correct meta-evidence to the disputeID.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorDisputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _externalDisputeID An identifier created outside Kleros by the protocol requesting arbitration.\\n /// @param _templateId The identifier of the dispute template. Should not be used with _templateUri.\\n /// @param _templateUri The URI to the dispute template. For example on IPFS: starting with '/ipfs/'. Should not be used with _templateId.\\n event DisputeRequest(\\n IArbitratorV2 indexed _arbitrator,\\n uint256 indexed _arbitratorDisputeID,\\n uint256 _externalDisputeID,\\n uint256 _templateId,\\n string _templateUri\\n );\\n\\n /// @dev To be raised when a ruling is given.\\n /// @param _arbitrator The arbitrator giving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitratorV2 indexed _arbitrator, uint256 indexed _disputeID, uint256 _ruling);\\n\\n /// @dev Give a ruling for a dispute.\\n /// Must be called by the arbitrator.\\n /// The purpose of this function is to ensure that the address calling it has the right to rule on the contract.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator.\\n /// Note that 0 is reserved for \\\"Not able/wanting to make a decision\\\".\\n function rule(uint256 _disputeID, uint256 _ruling) external;\\n}\\n\",\"keccak256\":\"0xe841a4fe8ec109ce17dde4457bf1583c8b499109b05887c53a49a3207fc6e80b\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitratorV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.24;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"./IArbitrableV2.sol\\\";\\n\\n/// @title Arbitrator\\n/// Arbitrator interface that implements the new arbitration standard.\\n/// Unlike the ERC-792 this standard is not concerned with appeals, so each arbitrator can implement an appeal system that suits it the most.\\n/// When developing arbitrator contracts we need to:\\n/// - Define the functions for dispute creation (createDispute). Don't forget to store the arbitrated contract and the disputeID (which should be unique, may nbDisputes).\\n/// - Define the functions for cost display (arbitrationCost).\\n/// - Allow giving rulings. For this a function must call arbitrable.rule(disputeID, ruling).\\ninterface IArbitratorV2 {\\n /// @dev To be emitted when a dispute is created.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _arbitrable The contract which created the dispute.\\n event DisputeCreation(uint256 indexed _disputeID, IArbitrableV2 indexed _arbitrable);\\n\\n /// @dev To be raised when a ruling is given.\\n /// @param _arbitrable The arbitrable receiving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitrableV2 indexed _arbitrable, uint256 indexed _disputeID, uint256 _ruling);\\n\\n /// @dev To be emitted when an ERC20 token is added or removed as a method to pay fees.\\n /// @param _token The ERC20 token.\\n /// @param _accepted Whether the token is accepted or not.\\n event AcceptedFeeToken(IERC20 indexed _token, bool indexed _accepted);\\n\\n /// @dev To be emitted when the fee for a particular ERC20 token is updated.\\n /// @param _feeToken The ERC20 token.\\n /// @param _rateInEth The new rate of the fee token in ETH.\\n /// @param _rateDecimals The new decimals of the fee token rate.\\n event NewCurrencyRate(IERC20 indexed _feeToken, uint64 _rateInEth, uint8 _rateDecimals);\\n\\n /// @dev Create a dispute and pay for the fees in the native currency, typically ETH.\\n /// Must be called by the arbitrable contract.\\n /// Must pay at least arbitrationCost(_extraData).\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData\\n ) external payable returns (uint256 disputeID);\\n\\n /// @dev Create a dispute and pay for the fees in a supported ERC20 token.\\n /// Must be called by the arbitrable contract.\\n /// Must pay at least arbitrationCost(_extraData).\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @param _feeAmount Amount of the ERC20 token used to pay fees.\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData,\\n IERC20 _feeToken,\\n uint256 _feeAmount\\n ) external returns (uint256 disputeID);\\n\\n /// @dev Compute the cost of arbitration denominated in the native currency, typically ETH.\\n /// It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return cost The arbitration cost in ETH.\\n function arbitrationCost(bytes calldata _extraData) external view returns (uint256 cost);\\n\\n /// @dev Compute the cost of arbitration denominated in `_feeToken`.\\n /// It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @return cost The arbitration cost in `_feeToken`.\\n function arbitrationCost(bytes calldata _extraData, IERC20 _feeToken) external view returns (uint256 cost);\\n\\n /// @dev Gets the current ruling of a specified dispute.\\n /// @param _disputeID The ID of the dispute.\\n /// @return ruling The current ruling.\\n /// @return tied Whether it's a tie or not.\\n /// @return overridden Whether the ruling was overridden by appeal funding or not.\\n function currentRuling(uint256 _disputeID) external view returns (uint256 ruling, bool tied, bool overridden);\\n}\\n\",\"keccak256\":\"0xa4dc6b958197adead238de4246cd04e7389c3dc1b9f968acd10985f8fc5b74cf\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.24;\\n\\n/// @title IDisputeTemplate\\n/// @notice Dispute Template interface.\\ninterface IDisputeTemplateRegistry {\\n /// @dev To be emitted when a new dispute template is created.\\n /// @param _templateId The identifier of the dispute template.\\n /// @param _templateTag An optional tag for the dispute template, such as \\\"registration\\\" or \\\"removal\\\".\\n /// @param _templateData The template data.\\n /// @param _templateDataMappings The data mappings.\\n event DisputeTemplate(\\n uint256 indexed _templateId,\\n string indexed _templateTag,\\n string _templateData,\\n string _templateDataMappings\\n );\\n\\n function setDisputeTemplate(\\n string memory _templateTag,\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external returns (uint256 templateId);\\n}\\n\",\"keccak256\":\"0xb46ff71c32a524a865fe8ca99d94c9daeb690bc9d7d49d963a45b06f60af19f3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\"},\"src/GovernorFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.24;\\n\\nimport {IArbitratorV2} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\\\";\\nimport \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\\\";\\nimport {KlerosGovernor} from \\\"./KlerosGovernor.sol\\\";\\n\\n/// @title GovernorFactory\\n/// This contract acts as a registry for KlerosGovernor instances.\\ncontract GovernorFactory {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @dev Emitted when a new Governor contract is deployed using this factory.\\n /// @param _address The address of the newly deployed Governor contract.\\n event NewGovernor(KlerosGovernor indexed _address);\\n\\n // ************************************* //\\n // * Storage * //\\n // ************************************* //\\n\\n KlerosGovernor[] public instances;\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @dev Deploy the arbitrable kleros.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorExtraData Extra data for the arbitrator.\\n /// @param _templateRegistry Dispute Template registry address\\n /// @param _templateData The dispute template data.\\n /// @param _templateDataMappings The dispute template data mappings.\\n /// @param _submissionBaseDeposit The base deposit required for submission.\\n /// @param _submissionTimeout Time in seconds allocated for submitting transaction list.\\n /// @param _executionTimeout Time in seconds after approval that allows to execute transactions of the approved list.\\n /// @param _withdrawTimeout Time in seconds after submission that allows to withdraw submitted list.\\n function deploy(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData,\\n IDisputeTemplateRegistry _templateRegistry,\\n string memory _templateData,\\n string memory _templateDataMappings,\\n uint256 _submissionBaseDeposit,\\n uint256 _submissionTimeout,\\n uint256 _executionTimeout,\\n uint256 _withdrawTimeout\\n ) public {\\n KlerosGovernor instance = new KlerosGovernor(\\n _arbitrator,\\n _arbitratorExtraData,\\n _templateRegistry,\\n _templateData,\\n _templateDataMappings,\\n _submissionBaseDeposit,\\n _submissionTimeout,\\n _executionTimeout,\\n _withdrawTimeout\\n );\\n instances.push(instance);\\n emit NewGovernor(instance);\\n }\\n}\\n\",\"keccak256\":\"0x2f57b4873a7e3887f0f1d3eab80ff627ca2a341b3fc7fd752d0f61e44e5b24cf\",\"license\":\"MIT\"},\"src/KlerosGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.24;\\n\\nimport {IArbitrableV2, IArbitratorV2} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\\\";\\nimport \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\\\";\\nimport \\\"./interfaces/IArbSys.sol\\\";\\n\\n/// @title KlerosGovernor for V2. Note that appeal functionality and evidence submission will be handled by the court.\\ncontract KlerosGovernor is IArbitrableV2 {\\n // ************************************* //\\n // * Enums / Structs * //\\n // ************************************* //\\n\\n enum Status {\\n NoDispute,\\n DisputeCreated,\\n Resolved\\n }\\n\\n struct Session {\\n uint256 ruling; // The ruling that was given in this session, if any.\\n uint256 disputeID; // ID given to the dispute of the session, if any.\\n uint256[] submittedLists; // Tracks all lists that were submitted in a session in the form submittedLists[submissionID].\\n uint256 sumDeposit; // Sum of all submission deposits in a session (minus arbitration fees). This is used to calculate the reward.\\n Status status; // Status of a session.\\n uint256 durationOffset; // Time in seconds that prolongs the submission period after the first submission, to give other submitters time to react.\\n }\\n\\n struct Transaction {\\n address target; // The address to call.\\n uint256 value; // Value paid by governor contract that will be used as msg.value in the execution.\\n bytes data; // Calldata of the transaction.\\n bool executed; // Whether the transaction was already executed or not.\\n }\\n\\n struct Submission {\\n address payable submitter; // The one who submits the list.\\n uint256 deposit; // Value of the deposit paid upon submission of the list.\\n Transaction[] txs; // Transactions stored in the list in the form txs[_transactionIndex].\\n bytes32 listHash; // A hash chain of all transactions stored in the list. This is used as a unique identifier within a session.\\n uint256 submissionTime; // The time when the list was submitted.\\n bool approved; // Whether the list was approved for execution or not.\\n uint256 approvalTime; // The time when the list was approved.\\n uint256 submissionBlock; // Block of list submission.\\n }\\n\\n ArbSys constant arbSys = ArbSys(address(100)); // ArbSys implementation https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference#arbsys\\n IArbitratorV2 public arbitrator; // Arbitrator contract.\\n bytes public arbitratorExtraData; // Extra data for arbitrator.\\n IDisputeTemplateRegistry public templateRegistry; // The dispute template registry.\\n uint256 public templateId; // The current dispute template identifier.\\n\\n uint256 public submissionBaseDeposit; // The base deposit in wei that needs to be paid in order to submit the list.\\n uint256 public submissionTimeout; // Time in seconds allowed for submitting the lists. Once it's passed the contract enters the approval period.\\n uint256 public executionTimeout; // Time in seconds allowed for the execution of approved lists.\\n uint256 public withdrawTimeout; // Time in seconds allowed to withdraw a submitted list.\\n\\n uint256 public lastApprovalTime; // The time of the last approval of a transaction list.\\n uint256 public reservedETH; // Sum of contract's submission deposits. These funds are not to be used in the execution of transactions.\\n\\n Submission[] public submissions; // Stores all created transaction lists. submissions[_listID].\\n Session[] public sessions; // Stores all submitting sessions. sessions[_session].\\n mapping(uint256 sessionIndex => mapping(bytes32 listHash => bool)) alreadySubmitted; // Indicates whether or not the transaction list was already submitted in order to catch duplicates in the form alreadySubmitted[listHash].\\n // ************************************* //\\n // * Function Modifiers * //\\n // ************************************* //\\n\\n modifier duringSubmissionPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n require(block.timestamp - lastApprovalTime <= submissionTimeout + offset, \\\"Submission time has ended.\\\");\\n _;\\n }\\n\\n modifier duringApprovalPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n require(block.timestamp - lastApprovalTime > submissionTimeout + offset, \\\"Approval time not started yet.\\\");\\n _;\\n }\\n\\n modifier onlyByGovernor() {\\n require(address(this) == msg.sender, \\\"Only the governor allowed.\\\");\\n _;\\n }\\n\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @dev Emitted when a new list is submitted.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _submitter The address that submitted the list.\\n /// @param _session The number of the current session.\\n /// @param _description The string in CSV format that contains labels of list's transactions.\\n /// Note that the submitter may give bad descriptions of correct actions, but this is to be seen as UI enhancement, not a critical feature and that would play against him in case of dispute.\\n event ListSubmitted(\\n uint256 indexed _listID,\\n address indexed _submitter,\\n uint256 indexed _session,\\n string _description\\n );\\n\\n // ************************************* //\\n // * Constructor * //\\n // ************************************* //\\n\\n /// @dev Constructor.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorExtraData Extra data for the arbitrator.\\n /// @param _templateRegistry Dispute Template registry address\\n /// @param _templateData The dispute template data.\\n /// @param _templateDataMappings The dispute template data mappings.\\n /// @param _submissionBaseDeposit The base deposit required for submission.\\n /// @param _submissionTimeout Time in seconds allocated for submitting transaction list.\\n /// @param _executionTimeout Time in seconds after approval that allows to execute transactions of the approved list.\\n /// @param _withdrawTimeout Time in seconds after submission that allows to withdraw submitted list.\\n constructor(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData,\\n IDisputeTemplateRegistry _templateRegistry,\\n string memory _templateData,\\n string memory _templateDataMappings,\\n uint256 _submissionBaseDeposit,\\n uint256 _submissionTimeout,\\n uint256 _executionTimeout,\\n uint256 _withdrawTimeout\\n ) {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n\\n lastApprovalTime = block.timestamp;\\n submissionBaseDeposit = _submissionBaseDeposit;\\n submissionTimeout = _submissionTimeout;\\n executionTimeout = _executionTimeout;\\n withdrawTimeout = _withdrawTimeout;\\n sessions.push();\\n submissions.push();\\n\\n templateRegistry = _templateRegistry;\\n templateId = IDisputeTemplateRegistry(templateRegistry).setDisputeTemplate(\\n \\\"\\\",\\n _templateData,\\n _templateDataMappings\\n );\\n }\\n\\n // ************************************* //\\n // * Governance * //\\n // ************************************* //\\n\\n /// @dev Changes the value of the base deposit required for submitting a list.\\n /// @param _submissionBaseDeposit The new value of the base deposit, in wei.\\n function changeSubmissionDeposit(uint256 _submissionBaseDeposit) external onlyByGovernor {\\n submissionBaseDeposit = _submissionBaseDeposit;\\n }\\n\\n /// @dev Changes the time allocated for submission. Note that it can't be changed during approval period because there can be an active dispute in the old arbitrator contract\\n /// and prolonging submission timeout might switch it back to submission period.\\n /// @param _submissionTimeout The new duration of the submission period, in seconds.\\n function changeSubmissionTimeout(uint256 _submissionTimeout) external onlyByGovernor duringSubmissionPeriod {\\n submissionTimeout = _submissionTimeout;\\n }\\n\\n /// @dev Changes the time allocated for list's execution.\\n /// @param _executionTimeout The new duration of the execution timeout, in seconds.\\n function changeExecutionTimeout(uint256 _executionTimeout) external onlyByGovernor {\\n executionTimeout = _executionTimeout;\\n }\\n\\n /// @dev Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period.\\n /// @param _withdrawTimeout The new duration of withdraw period, in seconds.\\n function changeWithdrawTimeout(uint256 _withdrawTimeout) external onlyByGovernor {\\n withdrawTimeout = _withdrawTimeout;\\n }\\n\\n /// @dev Changes the arbitrator of the contract. Note that it can't be changed during approval period because there can be an active dispute in the old arbitrator contract.\\n /// @param _arbitrator The new trusted arbitrator.\\n /// @param _arbitratorExtraData The extra data used by the new arbitrator.\\n function changeArbitrator(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData\\n ) external onlyByGovernor duringSubmissionPeriod {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n }\\n\\n /// @dev Update the dispute template data.\\n /// @param _templateData The new dispute template data.\\n /// @param _templateDataMappings The new dispute template data mappings.\\n function changeDisputeTemplate(\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external onlyByGovernor {\\n templateId = templateRegistry.setDisputeTemplate(\\\"\\\", _templateData, _templateDataMappings);\\n }\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @dev Creates transaction list based on input parameters and submits it for potential approval and execution.\\n /// @param _target List of addresses to call.\\n /// @param _value List of values required for respective addresses.\\n /// @param _data Concatenated calldata of all transactions of this list.\\n /// @param _dataSize List of lengths in bytes required to split calldata for its respective targets.\\n /// @param _description String in CSV format that describes list's transactions.\\n function submitList(\\n address[] memory _target,\\n uint256[] memory _value,\\n bytes memory _data,\\n uint256[] memory _dataSize,\\n string memory _description\\n ) external payable duringSubmissionPeriod {\\n require(_target.length == _value.length, \\\"Wrong input: target and value\\\");\\n require(_target.length == _dataSize.length, \\\"Wrong input: target and datasize\\\");\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions.push();\\n submission.submitter = payable(msg.sender);\\n\\n // https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/block-numbers-and-time\\n submission.submissionBlock = arbSys.arbBlockNumber();\\n\\n // Do the assignment first to avoid creating a new variable and bypass a 'stack too deep' error.\\n submission.deposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n require(msg.value >= submission.deposit, \\\"Not enough ETH to cover deposit\\\");\\n\\n bytes32 listHash;\\n bytes32 currentTxHash;\\n uint256 readingPosition;\\n for (uint256 i = 0; i < _target.length; i++) {\\n bytes memory readData = new bytes(_dataSize[i]);\\n Transaction storage transaction = submission.txs.push();\\n transaction.target = _target[i];\\n transaction.value = _value[i];\\n for (uint256 j = 0; j < _dataSize[i]; j++) {\\n readData[j] = _data[readingPosition + j];\\n }\\n transaction.data = readData;\\n readingPosition += _dataSize[i];\\n currentTxHash = keccak256(abi.encodePacked(transaction.target, transaction.value, transaction.data));\\n listHash = keccak256(abi.encodePacked(currentTxHash, listHash));\\n }\\n require(!alreadySubmitted[sessions.length - 1][listHash], \\\"List already submitted\\\");\\n alreadySubmitted[sessions.length - 1][listHash] = true;\\n submission.listHash = listHash;\\n submission.submissionTime = block.timestamp;\\n session.sumDeposit += submission.deposit;\\n session.submittedLists.push(submissions.length - 1);\\n if (session.submittedLists.length == 1) session.durationOffset = block.timestamp - lastApprovalTime;\\n\\n emit ListSubmitted(submissions.length - 1, msg.sender, sessions.length - 1, _description);\\n\\n uint256 remainder = msg.value - submission.deposit;\\n if (remainder > 0) payable(msg.sender).send(remainder);\\n\\n reservedETH += submission.deposit;\\n }\\n\\n /// @dev Withdraws submitted transaction list. Reimburses submission deposit.\\n /// Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made.\\n /// @param _submissionID Submission's index in the array of submitted lists of the current session.\\n /// @param _listHash Hash of a withdrawing list.\\n function withdrawTransactionList(uint256 _submissionID, bytes32 _listHash) external {\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions[session.submittedLists[_submissionID]];\\n require(block.timestamp - lastApprovalTime <= submissionTimeout / 2, \\\"Should be in first half\\\");\\n // This require statement is an extra check to prevent _submissionID linking to the wrong list because of index swap during withdrawal.\\n require(submission.listHash == _listHash, \\\"Wrong list hash\\\");\\n require(submission.submitter == msg.sender, \\\"Only submitter can withdraw\\\");\\n require(block.timestamp - submission.submissionTime <= withdrawTimeout, \\\"Withdrawing time has passed.\\\");\\n session.submittedLists[_submissionID] = session.submittedLists[session.submittedLists.length - 1];\\n alreadySubmitted[sessions.length - 1][_listHash] = false;\\n session.submittedLists.pop();\\n session.sumDeposit -= submission.deposit;\\n reservedETH -= submission.deposit;\\n payable(msg.sender).transfer(submission.deposit);\\n }\\n\\n /// @dev Approves a transaction list or creates a dispute if more than one list was submitted.\\n /// If nothing was submitted changes session.\\n function executeSubmissions() external duringApprovalPeriod {\\n Session storage session = sessions[sessions.length - 1];\\n require(session.status == Status.NoDispute, \\\"Already disputed\\\");\\n if (session.submittedLists.length == 0) {\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n } else if (session.submittedLists.length == 1) {\\n Submission storage submission = submissions[session.submittedLists[0]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n uint256 sumDeposit = session.sumDeposit;\\n session.sumDeposit = 0;\\n submission.submitter.send(sumDeposit);\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n\\n reservedETH -= sumDeposit;\\n } else {\\n session.status = Status.DisputeCreated;\\n uint256 arbitrationCost = arbitrator.arbitrationCost(arbitratorExtraData);\\n session.disputeID = arbitrator.createDispute{value: arbitrationCost}(\\n session.submittedLists.length,\\n arbitratorExtraData\\n );\\n // Check in case arbitration cost increased after the submission. It's unlikely that its increase won't be covered by the base deposit, but technically possible.\\n session.sumDeposit = session.sumDeposit > arbitrationCost ? session.sumDeposit - arbitrationCost : 0;\\n reservedETH = reservedETH > arbitrationCost ? reservedETH - arbitrationCost : 0;\\n emit DisputeRequest(arbitrator, session.disputeID, sessions.length - 1, templateId, \\\"\\\");\\n }\\n }\\n\\n /// @dev Gives a ruling for a dispute. Must be called by the arbitrator.\\n /// @param _disputeID ID of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator. Note that 0 is reserved for \\\"Refuse to arbitrate\\\".\\n /// Note If the final ruling is \\\"0\\\" nothing is approved and deposits will stay locked in the contract.\\n function rule(uint256 _disputeID, uint256 _ruling) external override {\\n Session storage session = sessions[sessions.length - 1];\\n require(msg.sender == address(arbitrator), \\\"Only arbitrator allowed\\\");\\n require(session.status == Status.DisputeCreated, \\\"Wrong status\\\");\\n require(_ruling <= session.submittedLists.length, \\\"Ruling is out of bounds.\\\");\\n\\n if (_ruling != 0) {\\n Submission storage submission = submissions[session.submittedLists[_ruling - 1]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n submission.submitter.send(session.sumDeposit);\\n }\\n // If the ruling is \\\"0\\\" the reserved funds of this session become expendable.\\n reservedETH -= session.sumDeposit;\\n\\n session.sumDeposit = 0;\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n session.ruling = _ruling;\\n sessions.push();\\n\\n emit Ruling(IArbitratorV2(msg.sender), _disputeID, _ruling);\\n }\\n\\n /// @dev Executes selected transactions of the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _cursor Index of the transaction from which to start executing.\\n /// @param _count Number of transactions to execute. Executes until the end if set to \\\"0\\\" or number higher than number of transactions in the list.\\n function executeTransactionList(uint256 _listID, uint256 _cursor, uint256 _count) external {\\n Submission storage submission = submissions[_listID];\\n require(submission.approved, \\\"Should be approved\\\");\\n require(block.timestamp - submission.approvalTime <= executionTimeout, \\\"Time to execute has passed\\\");\\n for (uint256 i = _cursor; i < submission.txs.length && (_count == 0 || i < _cursor + _count); i++) {\\n Transaction storage transaction = submission.txs[i];\\n uint256 expendableFunds = getExpendableFunds();\\n if (!transaction.executed && transaction.value <= expendableFunds) {\\n (bool callResult, ) = transaction.target.call{value: transaction.value}(transaction.data);\\n // An extra check to prevent re-entrancy through target call.\\n if (callResult == true) {\\n require(!transaction.executed, \\\"Already executed\\\");\\n transaction.executed = true;\\n }\\n }\\n }\\n }\\n\\n /// @dev Receive function to receive funds for the execution of transactions.\\n receive() external payable {}\\n\\n /// @dev Gets the sum of contract funds that are used for the execution of transactions.\\n /// @return Contract balance without reserved ETH.\\n function getExpendableFunds() public view returns (uint256) {\\n return address(this).balance - reservedETH;\\n }\\n\\n /// @dev Gets the info of the specific transaction in the specific list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _transactionIndex The index of the transaction.\\n /// @return target The target of the transaction.\\n /// @return value The value of the transaction.\\n /// @return data The data of the transaction.\\n /// @return executed Whether the transaction was executed or not.\\n function getTransactionInfo(\\n uint256 _listID,\\n uint256 _transactionIndex\\n ) external view returns (address target, uint256 value, bytes memory data, bool executed) {\\n Submission storage submission = submissions[_listID];\\n Transaction storage transaction = submission.txs[_transactionIndex];\\n return (transaction.target, transaction.value, transaction.data, transaction.executed);\\n }\\n\\n /// @dev Gets the array of submitted lists in the session.\\n /// Note that this function is O(n), where n is the number of submissions in the session. This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts.\\n /// @param _session The ID of the session.\\n /// @return submittedLists Indexes of lists that were submitted during the session.\\n function getSubmittedLists(uint256 _session) external view returns (uint256[] memory submittedLists) {\\n Session storage session = sessions[_session];\\n submittedLists = session.submittedLists;\\n }\\n\\n /// @dev Gets the submission from listId.\\n /// @param _listId The index of the transaction list in the array of lists.\\n /// @return submission List belonging to that listId.\\n function getSubmission(uint256 _listId) external view returns (Submission memory submission) {\\n submission = submissions[_listId];\\n }\\n\\n /// @dev Gets the number of transactions in the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @return txCount The number of transactions in the list.\\n function getNumberOfTransactions(uint256 _listID) external view returns (uint256 txCount) {\\n Submission storage submission = submissions[_listID];\\n return submission.txs.length;\\n }\\n\\n /// @dev Gets the number of lists created in contract's lifetime.\\n /// @return The number of created lists.\\n function getNumberOfCreatedLists() external view returns (uint256) {\\n return submissions.length;\\n }\\n\\n /// @dev Gets the number of the ongoing session.\\n /// @return The number of the ongoing session.\\n function getCurrentSessionNumber() external view returns (uint256) {\\n return sessions.length - 1;\\n }\\n\\n /// @dev Gets the session from the session index.\\n /// @return _session The session info.\\n function getSession(uint256 _sessionIndex) external view returns (Session memory _session) {\\n _session = sessions[_sessionIndex];\\n }\\n\\n /// @dev Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost).\\n /// @return _requiredDeposit required deposit value\\n function getTotalSubmissionDeposit() external view returns (uint256 _requiredDeposit) {\\n _requiredDeposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n }\\n}\\n\",\"keccak256\":\"0x5e285214a17b65e7b0fa8c1a5520852eb587be96bcf5413d1ed59993d2da99cf\",\"license\":\"MIT\"},\"src/interfaces/IArbSys.sol\":{\"content\":\"// https://github.com/OffchainLabs/nitro-contracts/blob/bdb8f8c68b2229fe9309fe9c03b37017abd1a2cd/src/precompiles/ArbSys.sol\\n// Copyright 2021-2022, Offchain Labs, Inc.\\n// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE\\n// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity >=0.4.21 <0.9.0;\\n\\n/**\\n * @title System level functionality\\n * @notice For use by contracts to interact with core L2-specific functionality.\\n * Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064.\\n */\\ninterface ArbSys {\\n /**\\n * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)\\n * @return block number as int\\n */\\n function arbBlockNumber() external view returns (uint256);\\n\\n /**\\n * @notice Get Arbitrum block hash (reverts unless currentBlockNum-256 <= arbBlockNum < currentBlockNum)\\n * @return block hash\\n */\\n function arbBlockHash(uint256 arbBlockNum) external view returns (bytes32);\\n\\n /**\\n * @notice Gets the rollup's unique chain identifier\\n * @return Chain identifier as int\\n */\\n function arbChainID() external view returns (uint256);\\n\\n /**\\n * @notice Get internal version number identifying an ArbOS build, this is `55 + nitroArbOS version number`\\n * e.g. on ArbOS 31 this would return 86. This is the only function that have the 55 offset.\\n * @return version number as int\\n */\\n function arbOSVersion() external view returns (uint256);\\n\\n /**\\n * @notice Returns 0 since Nitro has no concept of storage gas\\n * @return uint 0\\n */\\n function getStorageGasAvailable() external view returns (uint256);\\n\\n /**\\n * @notice (deprecated) check if current call is top level (meaning it was triggered by an EoA or a L1 contract)\\n * @dev this call has been deprecated and may be removed in a future release\\n * @return true if current execution frame is not a call by another L2 contract\\n */\\n function isTopLevelCall() external view returns (bool);\\n\\n /**\\n * @notice map L1 sender contract address to its L2 alias\\n * @param sender sender address\\n * @param unused argument no longer used\\n * @return aliased sender address\\n */\\n function mapL1SenderContractAddressToL2Alias(address sender, address unused) external pure returns (address);\\n\\n /**\\n * @notice check if the caller (of this caller of this) is an aliased L1 contract address\\n * @return true iff the caller's address is an alias for an L1 contract address\\n */\\n function wasMyCallersAddressAliased() external view returns (bool);\\n\\n /**\\n * @notice return the address of the caller (of this caller of this), without applying L1 contract address aliasing\\n * @return address of the caller's caller, without applying L1 contract address aliasing\\n */\\n function myCallersAddressWithoutAliasing() external view returns (address);\\n\\n /**\\n * @notice Send given amount of Eth to dest from sender.\\n * This is a convenience function, which is equivalent to calling sendTxToL1 with empty data.\\n * @param destination recipient address on L1\\n * @return unique identifier for this L2-to-L1 transaction.\\n */\\n function withdrawEth(address destination) external payable returns (uint256);\\n\\n /**\\n * @notice Send a transaction to L1\\n * @dev it is not possible to execute on the L1 any L2-to-L1 transaction which contains data\\n * to a contract address without any code (as enforced by the Bridge contract).\\n * @param destination recipient address on L1\\n * @param data (optional) calldata for L1 contract call\\n * @return a unique identifier for this L2-to-L1 transaction.\\n */\\n function sendTxToL1(address destination, bytes calldata data) external payable returns (uint256);\\n\\n /**\\n * @notice Get send Merkle tree state\\n * @return size number of sends in the history\\n * @return root root hash of the send history\\n * @return partials hashes of partial subtrees in the send history tree\\n */\\n function sendMerkleTreeState() external view returns (uint256 size, bytes32 root, bytes32[] memory partials);\\n\\n /**\\n * @notice creates a send txn from L2 to L1\\n * @param position = (level << 192) + leaf = (0 << 192) + leaf = leaf\\n */\\n event L2ToL1Tx(\\n address caller,\\n address indexed destination,\\n uint256 indexed hash,\\n uint256 indexed position,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /// @dev DEPRECATED in favour of the new L2ToL1Tx event above after the nitro upgrade\\n event L2ToL1Transaction(\\n address caller,\\n address indexed destination,\\n uint256 indexed uniqueId,\\n uint256 indexed batchNumber,\\n uint256 indexInBatch,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /**\\n * @notice logs a merkle branch for proof synthesis\\n * @param reserved an index meant only to align the 4th index with L2ToL1Transaction's 4th event\\n * @param hash the merkle hash\\n * @param position = (level << 192) + leaf\\n */\\n event SendMerkleUpdate(uint256 indexed reserved, bytes32 indexed hash, uint256 indexed position);\\n\\n error InvalidBlockNumber(uint256 requested, uint256 current);\\n}\\n\",\"keccak256\":\"0x9f2e1c9d8d19db1d3c6baa0549d14a68d09526764f4bd6f3bf030f0af7fd12fe\",\"license\":\"BUSL-1.1\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b5061352c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063a2f7b3a51461003b578063a5d4fdc31461006a575b600080fd5b61004e61004936600461017f565b61007f565b6040516001600160a01b03909116815260200160405180910390f35b61007d610078366004610257565b6100a9565b005b6000818154811061008f57600080fd5b6000918252602090912001546001600160a01b0316905081565b60008989898989898989896040516100c090610171565b6100d29998979695949392919061036c565b604051809103906000f0801580156100ee573d6000803e3d6000fd5b50600080546001810182558180527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b038416908117909155604051929350917f5425363a03f182281120f5919107c49c7a1a623acc1cbc6df468b6f0c11fcf8c9190a250505050505050505050565b61310a80620003ed83390190565b60006020828403121561019157600080fd5b5035919050565b80356001600160a01b03811681146101af57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126101db57600080fd5b813567ffffffffffffffff808211156101f6576101f66101b4565b604051601f8301601f19908116603f0116810190828211818310171561021e5761021e6101b4565b8160405283815286602085880101111561023757600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060008060006101208a8c03121561027657600080fd5b61027f8a610198565b985060208a013567ffffffffffffffff8082111561029c57600080fd5b6102a88d838e016101ca565b99506102b660408d01610198565b985060608c01359150808211156102cc57600080fd5b6102d88d838e016101ca565b975060808c01359150808211156102ee57600080fd5b506102fb8c828d016101ca565b999c989b50969995989760a0870135975060c08701359660e081013596506101000135945092505050565b6000815180845260005b8181101561034c57602081850181015186830182015201610330565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038a81168252610120602083018190526000916103928483018d610326565b908b166040850152838103606085015290506103ae818a610326565b905082810360808401526103c28189610326565b9150508560a08301528460c08301528360e0830152826101008301529a995050505050505050505056fe60806040523480156200001157600080fd5b506040516200310a3803806200310a833981016040819052620000349162000214565b600080546001600160a01b0319166001600160a01b038b1617905560016200005d898262000384565b50426008556004848155600584905560068390556007829055600b80546001908101909155600a80549091018155600052600280546001600160a01b0319166001600160a01b038a169081179091556040516312a6505d60e21b81529091634a99417491620000d1918a918a91016200047e565b6020604051808303816000875af1158015620000f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001179190620004be565b60035550620004d8975050505050505050565b80516001600160a01b03811681146200014257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200017a57818101518382015260200162000160565b50506000910152565b600082601f8301126200019557600080fd5b81516001600160401b0380821115620001b257620001b262000147565b604051601f8301601f19908116603f01168101908282118183101715620001dd57620001dd62000147565b81604052838152866020858801011115620001f757600080fd5b6200020a8460208301602089016200015d565b9695505050505050565b60008060008060008060008060006101208a8c0312156200023457600080fd5b6200023f8a6200012a565b60208b01519099506001600160401b03808211156200025d57600080fd5b6200026b8d838e0162000183565b99506200027b60408d016200012a565b985060608c01519150808211156200029257600080fd5b620002a08d838e0162000183565b975060808c0151915080821115620002b757600080fd5b50620002c68c828d0162000183565b95505060a08a0151935060c08a0151925060e08a015191506101008a015190509295985092959850929598565b600181811c908216806200030857607f821691505b6020821081036200032957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200037f576000816000526020600020601f850160051c810160208610156200035a5750805b601f850160051c820191505b818110156200037b5782815560010162000366565b5050505b505050565b81516001600160401b03811115620003a057620003a062000147565b620003b881620003b18454620002f3565b846200032f565b602080601f831160018114620003f05760008415620003d75750858301515b600019600386901b1c1916600185901b1785556200037b565b600085815260208120601f198616915b82811015620004215788860151825594840194600190910190840162000400565b5085821015620004405787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526200046a8160208601602086016200015d565b601f01601f19169290920160200192915050565b6060815260006060820152608060208201526000620004a1608083018562000450565b8281036040840152620004b5818562000450565b95945050505050565b600060208284031215620004d157600080fd5b5051919050565b612c2280620004e86000396000f3fe6080604052600436106101a75760003560e01c80639244c704116100e2578063b6dc775411610085578063b6dc77541461050e578063ba7079ca14610523578063bb0b86ff14610543578063c4bd851914610559578063c5d552881461056f578063cc2bcdb41461058f578063dc17bbdb146105af578063f730c07f146105cf57600080fd5b80639244c704146103dd578063953d6651146103f25780639c15d1a214610412578063a0af81f014610428578063a3c595c914610448578063ad73349e14610478578063b5125700146104d9578063b6cd08c6146104ee57600080fd5b8063402ff0db1161014a578063402ff0db146102d357806346047838146103005780636c0b7e71146103135780636cc6cde1146103285780636cf39c2b1461036057806377b9fda8146103805780637aa77f291461039657806383c4b7a3146103ac57600080fd5b80630c7ac7b6146101b35780631b1f5e7b146101de57806321cea5381461020157806322b52d661461022e578063246c76df1461024457806324baacc714610266578063311a6c56146102865780633e8686cc146102a657600080fd5b366101ae57005b600080fd5b3480156101bf57600080fd5b506101c86105e5565b6040516101d5919061219d565b60405180910390f35b3480156101ea57600080fd5b506101f3610673565b6040519081526020016101d5565b34801561020d57600080fd5b5061022161021c3660046121b7565b6106f8565b6040516101d591906121d0565b34801561023a57600080fd5b506101f360065481565b34801561025057600080fd5b5061026461025f3660046121b7565b61077a565b005b34801561027257600080fd5b506102646102813660046121b7565b6107a7565b34801561029257600080fd5b506102646102a1366004612214565b6107cb565b3480156102b257600080fd5b506102c66102c13660046121b7565b610a16565b6040516101d59190612236565b3480156102df57600080fd5b506102f36102ee3660046121b7565b610c11565b6040516101d59190612371565b61026461030e3660046125cb565b610cff565b34801561031f57600080fd5b506101f36113bf565b34801561033457600080fd5b50600054610348906001600160a01b031681565b6040516001600160a01b0390911681526020016101d5565b34801561036c57600080fd5b5061026461037b36600461269c565b6113d1565b34801561038c57600080fd5b506101f360095481565b3480156103a257600080fd5b506101f360035481565b3480156103b857600080fd5b506103cc6103c73660046121b7565b61160c565b6040516101d59594939291906126c8565b3480156103e957600080fd5b50610264611653565b3480156103fe57600080fd5b5061026461040d3660046121b7565b611a4b565b34801561041e57600080fd5b506101f360075481565b34801561043457600080fd5b50600254610348906001600160a01b031681565b34801561045457600080fd5b50610468610463366004612214565b611ae1565b6040516101d594939291906126fa565b34801561048457600080fd5b506104986104933660046121b7565b611bfb565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101d5565b3480156104e557600080fd5b506101f3611c57565b3480156104fa57600080fd5b50610264610509366004612214565b611c67565b34801561051a57600080fd5b50600a546101f3565b34801561052f57600080fd5b5061026461053e366004612734565b611f63565b34801561054f57600080fd5b506101f360045481565b34801561056557600080fd5b506101f360055481565b34801561057b57600080fd5b5061026461058a366004612783565b612020565b34801561059b57600080fd5b506102646105aa3660046121b7565b6120bb565b3480156105bb57600080fd5b506101f36105ca3660046121b7565b6120df565b3480156105db57600080fd5b506101f360085481565b600180546105f2906127dc565b80601f016020809104026020016040519081016040528092919081815260200182805461061e906127dc565b801561066b5780601f106106405761010080835404028352916020019161066b565b820191906000526020600020905b81548152906001019060200180831161064e57829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea9906106a590600190600401612893565b602060405180830381865afa1580156106c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e691906128a6565b6004546106f391906128d5565b905090565b60606000600b838154811061070f5761070f6128ee565b906000526020600020906006020190508060020180548060200260200160405190810160405280929190818152602001828054801561076d57602002820191906000526020600020905b815481526020019060010190808311610759575b5050505050915050919050565b3033146107a25760405162461bcd60e51b815260040161079990612904565b60405180910390fd5b600755565b3033146107c65760405162461bcd60e51b815260040161079990612904565b600455565b600b8054600091906107df9060019061293b565b815481106107ef576107ef6128ee565b600091825260208220915460069190910290910191506001600160a01b031633146108565760405162461bcd60e51b815260206004820152601760248201527613db9b1e48185c989a5d1c985d1bdc88185b1b1bddd959604a1b6044820152606401610799565b6001600482015460ff16600281111561087157610871612339565b146108ad5760405162461bcd60e51b815260206004820152600c60248201526b57726f6e672073746174757360a01b6044820152606401610799565b60028101548211156108fc5760405162461bcd60e51b8152602060048201526018602482015277293ab634b7339034b99037baba1037b3103137bab732399760411b6044820152606401610799565b8115610994576000600a6002830161091560018661293b565b81548110610925576109256128ee565b906000526020600020015481548110610940576109406128ee565b6000918252602082206005600890920201908101805460ff19166001179055426006820155805460038501546040519294506001600160a01b039091169281156108fc029290818181858888f15050505050505b8060030154600960008282546109aa919061293b565b90915550506000600382018190554260085560048201805460ff19166002179055828255600b805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a6c60405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600a8281548110610a7f57610a7f6128ee565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610bcb576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610b28906127dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b54906127dc565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610ad5565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610c19612110565b600b8281548110610c2c57610c2c6128ee565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610ca857602002820191906000526020600020905b815481526020019060010190808311610c94575b505050918352505060038201546020820152600482015460409091019060ff166002811115610cd957610cd9612339565b6002811115610cea57610cea612339565b81526020016005820154815250509050919050565b600b805460009190610d139060019061293b565b81548110610d2357610d236128ee565b906000526020600020906006020160050154905080600554610d4591906128d5565b600854610d52904261293b565b1115610d705760405162461bcd60e51b81526004016107999061294e565b8451865114610dc15760405162461bcd60e51b815260206004820152601d60248201527f57726f6e6720696e7075743a2074617267657420616e642076616c75650000006044820152606401610799565b8251865114610e125760405162461bcd60e51b815260206004820181905260248201527f57726f6e6720696e7075743a2074617267657420616e64206461746173697a656044820152606401610799565b600b805460009190610e269060019061293b565b81548110610e3657610e366128ee565b60009182526020808320600a8054600181018255945260089093027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610ec9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eed91906128a6565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610f2390600190600401612893565b602060405180830381865afa158015610f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6491906128a6565b600454610f7191906128d5565b60018201819055341015610fc75760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420656e6f7567682045544820746f20636f766572206465706f736974006044820152606401610799565b60008080805b8b518110156111d3576000898281518110610fea57610fea6128ee565b60200260200101516001600160401b0381111561100957611009612404565b6040519080825280601f01601f191660200182016040528015611033576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110611068576110686128ee565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d90849081106110a1576110a16128ee565b6020026020010151816001018190555060005b8b84815181106110c6576110c66128ee565b602002602001015181101561112c578c6110e082876128d5565b815181106110f0576110f06128ee565b602001015160f81c60f81b83828151811061110d5761110d6128ee565b60200101906001600160f81b031916908160001a9053506001016110b4565b506002810161113b83826129d6565b508a838151811061114e5761114e6128ee565b60200260200101518461116191906128d5565b8154600183015460405192965061118b926001600160a01b03909216916002850190602001612b08565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610fcd565b50600b54600c906000906111e99060019061293b565b81526020808201929092526040908101600090812086825290925290205460ff16156112505760405162461bcd60e51b8152602060048201526016602482015275131a5cdd08185b1c9958591e481cdd589b5a5d1d195960521b6044820152606401610799565b6001600c60006001600b80549050611268919061293b565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916112bc9084906128d5565b9091555050600a5460028601906112d59060019061293b565b8154600181810184556000938452602090932001556002860154900361130857600854611302904261293b565b60058601555b600b546113179060019061293b565b600a5433906113289060019061293b565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a604051611357919061219d565b60405180910390a46000846001015434611371919061293b565b9050801561139657604051339082156108fc029083906000818181858888f150505050505b8460010154600960008282546113ac91906128d5565b9091555050505050505050505050505050565b600b546000906106f39060019061293b565b6000600a84815481106113e6576113e66128ee565b60009182526020909120600890910201600581015490915060ff166114425760405162461bcd60e51b815260206004820152601260248201527114da1bdd5b1908189948185c1c1c9bdd995960721b6044820152606401610799565b600654816006015442611455919061293b565b11156114a35760405162461bcd60e51b815260206004820152601a60248201527f54696d6520746f206578656375746520686173207061737365640000000000006044820152606401610799565b825b6002820154811080156114c857508215806114c857506114c583856128d5565b81105b156116055760008260020182815481106114e4576114e46128ee565b9060005260206000209060040201905060006114fe611c57565b600383015490915060ff1615801561151a575080826001015411155b156115f057815460018301546040516000926001600160a01b03169190611545906002870190612b3b565b60006040518083038185875af1925050503d8060008114611582576040519150601f19603f3d011682016040523d82523d6000602084013e611587565b606091505b50909150508015156001036115ee57600383015460ff16156115de5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48195e1958dd5d195960821b6044820152606401610799565b60038301805460ff191660011790555b505b505080806115fd90612b47565b9150506114a5565b5050505050565b600b818154811061161c57600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600b8054600091906116679060019061293b565b81548110611677576116776128ee565b90600052602060002090600602016005015490508060055461169991906128d5565b6008546116a6904261293b565b116116f35760405162461bcd60e51b815260206004820152601e60248201527f417070726f76616c2074696d65206e6f742073746172746564207965742e00006044820152606401610799565b600b8054600091906117079060019061293b565b81548110611717576117176128ee565b6000918252602082206006909102019150600482015460ff16600281111561174157611741612339565b146117815760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48191a5cdc1d5d195960821b6044820152606401610799565b60028101546000036117ae5742600855600401805460ff1916600217905550600b80546001018155600052565b600281015460010361188a576000600a826002016000815481106117d4576117d46128ee565b9060005260206000200154815481106117ef576117ef6128ee565b6000918252602082206005600890920201908101805460ff1916600117905542600682015560038401805490839055815460405192945090926001600160a01b039091169183156108fc0291849190818181858888f150504260085550505060048301805460ff19166002179055600b8054600101815560009081526009805483929061187d90849061293b565b90915550611a4792505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926118cc9201612893565b602060405180830381865afa1580156118e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190d91906128a6565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e19184916119499190600190600401612b60565b60206040518083038185885af1158015611967573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061198c91906128a6565b6001830155600382015481106119a35760006119b3565b8082600301546119b3919061293b565b600383015560095481106119c85760006119d6565b806009546119d6919061293b565b600955600180830154600054600b5491926001600160a01b03909116917f8bd32f430ff060e6bd204709b3790c9807987263d3230c580dc80b5f89e2718691611a1e9161293b565b600354604051610a09929190918252602082015260606040820181905260009082015260800190565b5050565b303314611a6a5760405162461bcd60e51b815260040161079990612904565b600b805460009190611a7e9060019061293b565b81548110611a8e57611a8e6128ee565b906000526020600020906006020160050154905080600554611ab091906128d5565b600854611abd904261293b565b1115611adb5760405162461bcd60e51b81526004016107999061294e565b50600555565b6000806060600080600a8781548110611afc57611afc6128ee565b906000526020600020906008020190506000816002018781548110611b2357611b236128ee565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff909116908290611b68906127dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b94906127dc565b8015611be15780601f10611bb657610100808354040283529160200191611be1565b820191906000526020600020905b815481529060010190602001808311611bc457829003601f168201915b505050505091509550955095509550505092959194509250565b600a8181548110611c0b57600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600954476106f3919061293b565b600b805460009190611c7b9060019061293b565b81548110611c8b57611c8b6128ee565b906000526020600020906006020190506000600a826002018581548110611cb457611cb46128ee565b906000526020600020015481548110611ccf57611ccf6128ee565b906000526020600020906008020190506002600554611cee9190612b81565b600854611cfb904261293b565b1115611d435760405162461bcd60e51b815260206004820152601760248201527629b437bab6321031329034b7103334b939ba103430b63360491b6044820152606401610799565b82816003015414611d885760405162461bcd60e51b815260206004820152600f60248201526e0aee4dedcce40d8d2e6e840d0c2e6d608b1b6044820152606401610799565b80546001600160a01b03163314611de15760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79207375626d69747465722063616e20776974686472617700000000006044820152606401610799565b6007546004820154611df3904261293b565b1115611e415760405162461bcd60e51b815260206004820152601c60248201527f5769746864726177696e672074696d6520686173207061737365642e000000006044820152606401610799565b600282018054611e539060019061293b565b81548110611e6357611e636128ee565b9060005260206000200154826002018581548110611e8357611e836128ee565b6000918252602082200191909155600b54600c908290611ea59060019061293b565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611ee457611ee4612ba3565b600190038181906000526020600020016000905590558060010154826003016000828254611f12919061293b565b9091555050600181015460098054600090611f2e90849061293b565b90915550506001810154604051339180156108fc02916000818181858888f19350505050158015611605573d6000803e3d6000fd5b303314611f825760405162461bcd60e51b815260040161079990612904565b600b805460009190611f969060019061293b565b81548110611fa657611fa66128ee565b906000526020600020906006020160050154905080600554611fc891906128d5565b600854611fd5904261293b565b1115611ff35760405162461bcd60e51b81526004016107999061294e565b600080546001600160a01b0319166001600160a01b038516179055600161201a83826129d6565b50505050565b30331461203f5760405162461bcd60e51b815260040161079990612904565b6002546040516312a6505d60e21b81526001600160a01b0390911690634a994174906120719085908590600401612bb9565b6020604051808303816000875af1158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b491906128a6565b6003555050565b3033146120da5760405162461bcd60e51b815260040161079990612904565b600655565b600080600a83815481106120f5576120f56128ee565b60009182526020909120600260089092020101549392505050565b6040518060c00160405280600081526020016000815260200160608152602001600081526020016000600281111561214a5761214a612339565b8152602001600081525090565b6000815180845260005b8181101561217d57602081850181015186830182015201612161565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006121b06020830184612157565b9392505050565b6000602082840312156121c957600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015612208578351835292840192918401916001016121ec565b50909695505050505050565b6000806040838503121561222757600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156122ea5761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d01526122ca828d0182612157565b9287015115159b87019b909b525098509589019591890191600101612291565b5050505060608901516080890152608089015160a089015260a0890151955061231760c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b6003811061236d57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b808310156123ce57835182529284019260019290920191908401906123ae565b5060608701516080870152608087015193506123ed60a087018561234f565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561244257612442612404565b604052919050565b60006001600160401b0382111561246357612463612404565b5060051b60200190565b6001600160a01b038116811461248257600080fd5b50565b600082601f83011261249657600080fd5b813560206124ab6124a68361244a565b61241a565b8083825260208201915060208460051b8701019350868411156124cd57600080fd5b602086015b848110156124f25780356124e58161246d565b83529183019183016124d2565b509695505050505050565b600082601f83011261250e57600080fd5b8135602061251e6124a68361244a565b8083825260208201915060208460051b87010193508684111561254057600080fd5b602086015b848110156124f25780358352918301918301612545565b600082601f83011261256d57600080fd5b81356001600160401b0381111561258657612586612404565b612599601f8201601f191660200161241a565b8181528460208386010111156125ae57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156125e357600080fd5b85356001600160401b03808211156125fa57600080fd5b61260689838a01612485565b9650602088013591508082111561261c57600080fd5b61262889838a016124fd565b9550604088013591508082111561263e57600080fd5b61264a89838a0161255c565b9450606088013591508082111561266057600080fd5b61266c89838a016124fd565b9350608088013591508082111561268257600080fd5b5061268f8882890161255c565b9150509295509295909350565b6000806000606084860312156126b157600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a081016126ea606083018561234f565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006127216080830185612157565b9050821515606083015295945050505050565b6000806040838503121561274757600080fd5b82356127528161246d565b915060208301356001600160401b0381111561276d57600080fd5b6127798582860161255c565b9150509250929050565b6000806040838503121561279657600080fd5b82356001600160401b03808211156127ad57600080fd5b6127b98683870161255c565b935060208501359150808211156127cf57600080fd5b506127798582860161255c565b600181811c908216806127f057607f821691505b60208210810361281057634e487b7160e01b600052602260045260246000fd5b50919050565b60008154612823816127dc565b808552602060018381168015612840576001811461285a57612888565b60ff1985168884015283151560051b880183019550612888565b866000528260002060005b858110156128805781548a8201860152908301908401612865565b890184019650505b505050505092915050565b6020815260006121b06020830184612816565b6000602082840312156128b857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156128e8576128e86128bf565b92915050565b634e487b7160e01b600052603260045260246000fd5b6020808252601a908201527f4f6e6c792074686520676f7665726e6f7220616c6c6f7765642e000000000000604082015260600190565b818103818111156128e8576128e86128bf565b6020808252601a908201527f5375626d697373696f6e2074696d652068617320656e6465642e000000000000604082015260600190565b601f8211156129d1576000816000526020600020601f850160051c810160208610156129ae5750805b601f850160051c820191505b818110156129cd578281556001016129ba565b5050505b505050565b81516001600160401b038111156129ef576129ef612404565b612a03816129fd84546127dc565b84612985565b602080601f831160018114612a385760008415612a205750858301515b600019600386901b1c1916600185901b1785556129cd565b600085815260208120601f198616915b82811015612a6757888601518255948401946001909101908401612a48565b5085821015612a855787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008154612aa2816127dc565b60018281168015612aba5760018114612acf57612afe565b60ff1984168752821515830287019450612afe565b8560005260208060002060005b85811015612af55781548a820152908401908201612adc565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b1681528260148201526000612b326034830184612a95565b95945050505050565b60006121b08284612a95565b600060018201612b5957612b596128bf565b5060010190565b828152604060208201526000612b796040830184612816565b949350505050565b600082612b9e57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b6060815260006060820152608060208201526000612bda6080830185612157565b8281036040840152612b32818561215756fea26469706673582212209c0c5fcddd41b1e2b82bb12b3932cc4e4e9cc6436b435232731efd8374c795a964736f6c63430008180033a26469706673582212205fcb4ca2e296f06826639061caa6a116cd8dd115f6844ef02be0355bf3fade9064736f6c63430008180033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063a2f7b3a51461003b578063a5d4fdc31461006a575b600080fd5b61004e61004936600461017f565b61007f565b6040516001600160a01b03909116815260200160405180910390f35b61007d610078366004610257565b6100a9565b005b6000818154811061008f57600080fd5b6000918252602090912001546001600160a01b0316905081565b60008989898989898989896040516100c090610171565b6100d29998979695949392919061036c565b604051809103906000f0801580156100ee573d6000803e3d6000fd5b50600080546001810182558180527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b038416908117909155604051929350917f5425363a03f182281120f5919107c49c7a1a623acc1cbc6df468b6f0c11fcf8c9190a250505050505050505050565b61310a80620003ed83390190565b60006020828403121561019157600080fd5b5035919050565b80356001600160a01b03811681146101af57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126101db57600080fd5b813567ffffffffffffffff808211156101f6576101f66101b4565b604051601f8301601f19908116603f0116810190828211818310171561021e5761021e6101b4565b8160405283815286602085880101111561023757600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060008060006101208a8c03121561027657600080fd5b61027f8a610198565b985060208a013567ffffffffffffffff8082111561029c57600080fd5b6102a88d838e016101ca565b99506102b660408d01610198565b985060608c01359150808211156102cc57600080fd5b6102d88d838e016101ca565b975060808c01359150808211156102ee57600080fd5b506102fb8c828d016101ca565b999c989b50969995989760a0870135975060c08701359660e081013596506101000135945092505050565b6000815180845260005b8181101561034c57602081850181015186830182015201610330565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038a81168252610120602083018190526000916103928483018d610326565b908b166040850152838103606085015290506103ae818a610326565b905082810360808401526103c28189610326565b9150508560a08301528460c08301528360e0830152826101008301529a995050505050505050505056fe60806040523480156200001157600080fd5b506040516200310a3803806200310a833981016040819052620000349162000214565b600080546001600160a01b0319166001600160a01b038b1617905560016200005d898262000384565b50426008556004848155600584905560068390556007829055600b80546001908101909155600a80549091018155600052600280546001600160a01b0319166001600160a01b038a169081179091556040516312a6505d60e21b81529091634a99417491620000d1918a918a91016200047e565b6020604051808303816000875af1158015620000f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001179190620004be565b60035550620004d8975050505050505050565b80516001600160a01b03811681146200014257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200017a57818101518382015260200162000160565b50506000910152565b600082601f8301126200019557600080fd5b81516001600160401b0380821115620001b257620001b262000147565b604051601f8301601f19908116603f01168101908282118183101715620001dd57620001dd62000147565b81604052838152866020858801011115620001f757600080fd5b6200020a8460208301602089016200015d565b9695505050505050565b60008060008060008060008060006101208a8c0312156200023457600080fd5b6200023f8a6200012a565b60208b01519099506001600160401b03808211156200025d57600080fd5b6200026b8d838e0162000183565b99506200027b60408d016200012a565b985060608c01519150808211156200029257600080fd5b620002a08d838e0162000183565b975060808c0151915080821115620002b757600080fd5b50620002c68c828d0162000183565b95505060a08a0151935060c08a0151925060e08a015191506101008a015190509295985092959850929598565b600181811c908216806200030857607f821691505b6020821081036200032957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200037f576000816000526020600020601f850160051c810160208610156200035a5750805b601f850160051c820191505b818110156200037b5782815560010162000366565b5050505b505050565b81516001600160401b03811115620003a057620003a062000147565b620003b881620003b18454620002f3565b846200032f565b602080601f831160018114620003f05760008415620003d75750858301515b600019600386901b1c1916600185901b1785556200037b565b600085815260208120601f198616915b82811015620004215788860151825594840194600190910190840162000400565b5085821015620004405787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526200046a8160208601602086016200015d565b601f01601f19169290920160200192915050565b6060815260006060820152608060208201526000620004a1608083018562000450565b8281036040840152620004b5818562000450565b95945050505050565b600060208284031215620004d157600080fd5b5051919050565b612c2280620004e86000396000f3fe6080604052600436106101a75760003560e01c80639244c704116100e2578063b6dc775411610085578063b6dc77541461050e578063ba7079ca14610523578063bb0b86ff14610543578063c4bd851914610559578063c5d552881461056f578063cc2bcdb41461058f578063dc17bbdb146105af578063f730c07f146105cf57600080fd5b80639244c704146103dd578063953d6651146103f25780639c15d1a214610412578063a0af81f014610428578063a3c595c914610448578063ad73349e14610478578063b5125700146104d9578063b6cd08c6146104ee57600080fd5b8063402ff0db1161014a578063402ff0db146102d357806346047838146103005780636c0b7e71146103135780636cc6cde1146103285780636cf39c2b1461036057806377b9fda8146103805780637aa77f291461039657806383c4b7a3146103ac57600080fd5b80630c7ac7b6146101b35780631b1f5e7b146101de57806321cea5381461020157806322b52d661461022e578063246c76df1461024457806324baacc714610266578063311a6c56146102865780633e8686cc146102a657600080fd5b366101ae57005b600080fd5b3480156101bf57600080fd5b506101c86105e5565b6040516101d5919061219d565b60405180910390f35b3480156101ea57600080fd5b506101f3610673565b6040519081526020016101d5565b34801561020d57600080fd5b5061022161021c3660046121b7565b6106f8565b6040516101d591906121d0565b34801561023a57600080fd5b506101f360065481565b34801561025057600080fd5b5061026461025f3660046121b7565b61077a565b005b34801561027257600080fd5b506102646102813660046121b7565b6107a7565b34801561029257600080fd5b506102646102a1366004612214565b6107cb565b3480156102b257600080fd5b506102c66102c13660046121b7565b610a16565b6040516101d59190612236565b3480156102df57600080fd5b506102f36102ee3660046121b7565b610c11565b6040516101d59190612371565b61026461030e3660046125cb565b610cff565b34801561031f57600080fd5b506101f36113bf565b34801561033457600080fd5b50600054610348906001600160a01b031681565b6040516001600160a01b0390911681526020016101d5565b34801561036c57600080fd5b5061026461037b36600461269c565b6113d1565b34801561038c57600080fd5b506101f360095481565b3480156103a257600080fd5b506101f360035481565b3480156103b857600080fd5b506103cc6103c73660046121b7565b61160c565b6040516101d59594939291906126c8565b3480156103e957600080fd5b50610264611653565b3480156103fe57600080fd5b5061026461040d3660046121b7565b611a4b565b34801561041e57600080fd5b506101f360075481565b34801561043457600080fd5b50600254610348906001600160a01b031681565b34801561045457600080fd5b50610468610463366004612214565b611ae1565b6040516101d594939291906126fa565b34801561048457600080fd5b506104986104933660046121b7565b611bfb565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101d5565b3480156104e557600080fd5b506101f3611c57565b3480156104fa57600080fd5b50610264610509366004612214565b611c67565b34801561051a57600080fd5b50600a546101f3565b34801561052f57600080fd5b5061026461053e366004612734565b611f63565b34801561054f57600080fd5b506101f360045481565b34801561056557600080fd5b506101f360055481565b34801561057b57600080fd5b5061026461058a366004612783565b612020565b34801561059b57600080fd5b506102646105aa3660046121b7565b6120bb565b3480156105bb57600080fd5b506101f36105ca3660046121b7565b6120df565b3480156105db57600080fd5b506101f360085481565b600180546105f2906127dc565b80601f016020809104026020016040519081016040528092919081815260200182805461061e906127dc565b801561066b5780601f106106405761010080835404028352916020019161066b565b820191906000526020600020905b81548152906001019060200180831161064e57829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea9906106a590600190600401612893565b602060405180830381865afa1580156106c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e691906128a6565b6004546106f391906128d5565b905090565b60606000600b838154811061070f5761070f6128ee565b906000526020600020906006020190508060020180548060200260200160405190810160405280929190818152602001828054801561076d57602002820191906000526020600020905b815481526020019060010190808311610759575b5050505050915050919050565b3033146107a25760405162461bcd60e51b815260040161079990612904565b60405180910390fd5b600755565b3033146107c65760405162461bcd60e51b815260040161079990612904565b600455565b600b8054600091906107df9060019061293b565b815481106107ef576107ef6128ee565b600091825260208220915460069190910290910191506001600160a01b031633146108565760405162461bcd60e51b815260206004820152601760248201527613db9b1e48185c989a5d1c985d1bdc88185b1b1bddd959604a1b6044820152606401610799565b6001600482015460ff16600281111561087157610871612339565b146108ad5760405162461bcd60e51b815260206004820152600c60248201526b57726f6e672073746174757360a01b6044820152606401610799565b60028101548211156108fc5760405162461bcd60e51b8152602060048201526018602482015277293ab634b7339034b99037baba1037b3103137bab732399760411b6044820152606401610799565b8115610994576000600a6002830161091560018661293b565b81548110610925576109256128ee565b906000526020600020015481548110610940576109406128ee565b6000918252602082206005600890920201908101805460ff19166001179055426006820155805460038501546040519294506001600160a01b039091169281156108fc029290818181858888f15050505050505b8060030154600960008282546109aa919061293b565b90915550506000600382018190554260085560048201805460ff19166002179055828255600b805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a6c60405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600a8281548110610a7f57610a7f6128ee565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610bcb576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610b28906127dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b54906127dc565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610ad5565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610c19612110565b600b8281548110610c2c57610c2c6128ee565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610ca857602002820191906000526020600020905b815481526020019060010190808311610c94575b505050918352505060038201546020820152600482015460409091019060ff166002811115610cd957610cd9612339565b6002811115610cea57610cea612339565b81526020016005820154815250509050919050565b600b805460009190610d139060019061293b565b81548110610d2357610d236128ee565b906000526020600020906006020160050154905080600554610d4591906128d5565b600854610d52904261293b565b1115610d705760405162461bcd60e51b81526004016107999061294e565b8451865114610dc15760405162461bcd60e51b815260206004820152601d60248201527f57726f6e6720696e7075743a2074617267657420616e642076616c75650000006044820152606401610799565b8251865114610e125760405162461bcd60e51b815260206004820181905260248201527f57726f6e6720696e7075743a2074617267657420616e64206461746173697a656044820152606401610799565b600b805460009190610e269060019061293b565b81548110610e3657610e366128ee565b60009182526020808320600a8054600181018255945260089093027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610ec9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eed91906128a6565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610f2390600190600401612893565b602060405180830381865afa158015610f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6491906128a6565b600454610f7191906128d5565b60018201819055341015610fc75760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420656e6f7567682045544820746f20636f766572206465706f736974006044820152606401610799565b60008080805b8b518110156111d3576000898281518110610fea57610fea6128ee565b60200260200101516001600160401b0381111561100957611009612404565b6040519080825280601f01601f191660200182016040528015611033576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110611068576110686128ee565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d90849081106110a1576110a16128ee565b6020026020010151816001018190555060005b8b84815181106110c6576110c66128ee565b602002602001015181101561112c578c6110e082876128d5565b815181106110f0576110f06128ee565b602001015160f81c60f81b83828151811061110d5761110d6128ee565b60200101906001600160f81b031916908160001a9053506001016110b4565b506002810161113b83826129d6565b508a838151811061114e5761114e6128ee565b60200260200101518461116191906128d5565b8154600183015460405192965061118b926001600160a01b03909216916002850190602001612b08565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610fcd565b50600b54600c906000906111e99060019061293b565b81526020808201929092526040908101600090812086825290925290205460ff16156112505760405162461bcd60e51b8152602060048201526016602482015275131a5cdd08185b1c9958591e481cdd589b5a5d1d195960521b6044820152606401610799565b6001600c60006001600b80549050611268919061293b565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916112bc9084906128d5565b9091555050600a5460028601906112d59060019061293b565b8154600181810184556000938452602090932001556002860154900361130857600854611302904261293b565b60058601555b600b546113179060019061293b565b600a5433906113289060019061293b565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a604051611357919061219d565b60405180910390a46000846001015434611371919061293b565b9050801561139657604051339082156108fc029083906000818181858888f150505050505b8460010154600960008282546113ac91906128d5565b9091555050505050505050505050505050565b600b546000906106f39060019061293b565b6000600a84815481106113e6576113e66128ee565b60009182526020909120600890910201600581015490915060ff166114425760405162461bcd60e51b815260206004820152601260248201527114da1bdd5b1908189948185c1c1c9bdd995960721b6044820152606401610799565b600654816006015442611455919061293b565b11156114a35760405162461bcd60e51b815260206004820152601a60248201527f54696d6520746f206578656375746520686173207061737365640000000000006044820152606401610799565b825b6002820154811080156114c857508215806114c857506114c583856128d5565b81105b156116055760008260020182815481106114e4576114e46128ee565b9060005260206000209060040201905060006114fe611c57565b600383015490915060ff1615801561151a575080826001015411155b156115f057815460018301546040516000926001600160a01b03169190611545906002870190612b3b565b60006040518083038185875af1925050503d8060008114611582576040519150601f19603f3d011682016040523d82523d6000602084013e611587565b606091505b50909150508015156001036115ee57600383015460ff16156115de5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48195e1958dd5d195960821b6044820152606401610799565b60038301805460ff191660011790555b505b505080806115fd90612b47565b9150506114a5565b5050505050565b600b818154811061161c57600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600b8054600091906116679060019061293b565b81548110611677576116776128ee565b90600052602060002090600602016005015490508060055461169991906128d5565b6008546116a6904261293b565b116116f35760405162461bcd60e51b815260206004820152601e60248201527f417070726f76616c2074696d65206e6f742073746172746564207965742e00006044820152606401610799565b600b8054600091906117079060019061293b565b81548110611717576117176128ee565b6000918252602082206006909102019150600482015460ff16600281111561174157611741612339565b146117815760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48191a5cdc1d5d195960821b6044820152606401610799565b60028101546000036117ae5742600855600401805460ff1916600217905550600b80546001018155600052565b600281015460010361188a576000600a826002016000815481106117d4576117d46128ee565b9060005260206000200154815481106117ef576117ef6128ee565b6000918252602082206005600890920201908101805460ff1916600117905542600682015560038401805490839055815460405192945090926001600160a01b039091169183156108fc0291849190818181858888f150504260085550505060048301805460ff19166002179055600b8054600101815560009081526009805483929061187d90849061293b565b90915550611a4792505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926118cc9201612893565b602060405180830381865afa1580156118e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190d91906128a6565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e19184916119499190600190600401612b60565b60206040518083038185885af1158015611967573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061198c91906128a6565b6001830155600382015481106119a35760006119b3565b8082600301546119b3919061293b565b600383015560095481106119c85760006119d6565b806009546119d6919061293b565b600955600180830154600054600b5491926001600160a01b03909116917f8bd32f430ff060e6bd204709b3790c9807987263d3230c580dc80b5f89e2718691611a1e9161293b565b600354604051610a09929190918252602082015260606040820181905260009082015260800190565b5050565b303314611a6a5760405162461bcd60e51b815260040161079990612904565b600b805460009190611a7e9060019061293b565b81548110611a8e57611a8e6128ee565b906000526020600020906006020160050154905080600554611ab091906128d5565b600854611abd904261293b565b1115611adb5760405162461bcd60e51b81526004016107999061294e565b50600555565b6000806060600080600a8781548110611afc57611afc6128ee565b906000526020600020906008020190506000816002018781548110611b2357611b236128ee565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff909116908290611b68906127dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b94906127dc565b8015611be15780601f10611bb657610100808354040283529160200191611be1565b820191906000526020600020905b815481529060010190602001808311611bc457829003601f168201915b505050505091509550955095509550505092959194509250565b600a8181548110611c0b57600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600954476106f3919061293b565b600b805460009190611c7b9060019061293b565b81548110611c8b57611c8b6128ee565b906000526020600020906006020190506000600a826002018581548110611cb457611cb46128ee565b906000526020600020015481548110611ccf57611ccf6128ee565b906000526020600020906008020190506002600554611cee9190612b81565b600854611cfb904261293b565b1115611d435760405162461bcd60e51b815260206004820152601760248201527629b437bab6321031329034b7103334b939ba103430b63360491b6044820152606401610799565b82816003015414611d885760405162461bcd60e51b815260206004820152600f60248201526e0aee4dedcce40d8d2e6e840d0c2e6d608b1b6044820152606401610799565b80546001600160a01b03163314611de15760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79207375626d69747465722063616e20776974686472617700000000006044820152606401610799565b6007546004820154611df3904261293b565b1115611e415760405162461bcd60e51b815260206004820152601c60248201527f5769746864726177696e672074696d6520686173207061737365642e000000006044820152606401610799565b600282018054611e539060019061293b565b81548110611e6357611e636128ee565b9060005260206000200154826002018581548110611e8357611e836128ee565b6000918252602082200191909155600b54600c908290611ea59060019061293b565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611ee457611ee4612ba3565b600190038181906000526020600020016000905590558060010154826003016000828254611f12919061293b565b9091555050600181015460098054600090611f2e90849061293b565b90915550506001810154604051339180156108fc02916000818181858888f19350505050158015611605573d6000803e3d6000fd5b303314611f825760405162461bcd60e51b815260040161079990612904565b600b805460009190611f969060019061293b565b81548110611fa657611fa66128ee565b906000526020600020906006020160050154905080600554611fc891906128d5565b600854611fd5904261293b565b1115611ff35760405162461bcd60e51b81526004016107999061294e565b600080546001600160a01b0319166001600160a01b038516179055600161201a83826129d6565b50505050565b30331461203f5760405162461bcd60e51b815260040161079990612904565b6002546040516312a6505d60e21b81526001600160a01b0390911690634a994174906120719085908590600401612bb9565b6020604051808303816000875af1158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b491906128a6565b6003555050565b3033146120da5760405162461bcd60e51b815260040161079990612904565b600655565b600080600a83815481106120f5576120f56128ee565b60009182526020909120600260089092020101549392505050565b6040518060c00160405280600081526020016000815260200160608152602001600081526020016000600281111561214a5761214a612339565b8152602001600081525090565b6000815180845260005b8181101561217d57602081850181015186830182015201612161565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006121b06020830184612157565b9392505050565b6000602082840312156121c957600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015612208578351835292840192918401916001016121ec565b50909695505050505050565b6000806040838503121561222757600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156122ea5761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d01526122ca828d0182612157565b9287015115159b87019b909b525098509589019591890191600101612291565b5050505060608901516080890152608089015160a089015260a0890151955061231760c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b6003811061236d57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b808310156123ce57835182529284019260019290920191908401906123ae565b5060608701516080870152608087015193506123ed60a087018561234f565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561244257612442612404565b604052919050565b60006001600160401b0382111561246357612463612404565b5060051b60200190565b6001600160a01b038116811461248257600080fd5b50565b600082601f83011261249657600080fd5b813560206124ab6124a68361244a565b61241a565b8083825260208201915060208460051b8701019350868411156124cd57600080fd5b602086015b848110156124f25780356124e58161246d565b83529183019183016124d2565b509695505050505050565b600082601f83011261250e57600080fd5b8135602061251e6124a68361244a565b8083825260208201915060208460051b87010193508684111561254057600080fd5b602086015b848110156124f25780358352918301918301612545565b600082601f83011261256d57600080fd5b81356001600160401b0381111561258657612586612404565b612599601f8201601f191660200161241a565b8181528460208386010111156125ae57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156125e357600080fd5b85356001600160401b03808211156125fa57600080fd5b61260689838a01612485565b9650602088013591508082111561261c57600080fd5b61262889838a016124fd565b9550604088013591508082111561263e57600080fd5b61264a89838a0161255c565b9450606088013591508082111561266057600080fd5b61266c89838a016124fd565b9350608088013591508082111561268257600080fd5b5061268f8882890161255c565b9150509295509295909350565b6000806000606084860312156126b157600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a081016126ea606083018561234f565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006127216080830185612157565b9050821515606083015295945050505050565b6000806040838503121561274757600080fd5b82356127528161246d565b915060208301356001600160401b0381111561276d57600080fd5b6127798582860161255c565b9150509250929050565b6000806040838503121561279657600080fd5b82356001600160401b03808211156127ad57600080fd5b6127b98683870161255c565b935060208501359150808211156127cf57600080fd5b506127798582860161255c565b600181811c908216806127f057607f821691505b60208210810361281057634e487b7160e01b600052602260045260246000fd5b50919050565b60008154612823816127dc565b808552602060018381168015612840576001811461285a57612888565b60ff1985168884015283151560051b880183019550612888565b866000528260002060005b858110156128805781548a8201860152908301908401612865565b890184019650505b505050505092915050565b6020815260006121b06020830184612816565b6000602082840312156128b857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156128e8576128e86128bf565b92915050565b634e487b7160e01b600052603260045260246000fd5b6020808252601a908201527f4f6e6c792074686520676f7665726e6f7220616c6c6f7765642e000000000000604082015260600190565b818103818111156128e8576128e86128bf565b6020808252601a908201527f5375626d697373696f6e2074696d652068617320656e6465642e000000000000604082015260600190565b601f8211156129d1576000816000526020600020601f850160051c810160208610156129ae5750805b601f850160051c820191505b818110156129cd578281556001016129ba565b5050505b505050565b81516001600160401b038111156129ef576129ef612404565b612a03816129fd84546127dc565b84612985565b602080601f831160018114612a385760008415612a205750858301515b600019600386901b1c1916600185901b1785556129cd565b600085815260208120601f198616915b82811015612a6757888601518255948401946001909101908401612a48565b5085821015612a855787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008154612aa2816127dc565b60018281168015612aba5760018114612acf57612afe565b60ff1984168752821515830287019450612afe565b8560005260208060002060005b85811015612af55781548a820152908401908201612adc565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b1681528260148201526000612b326034830184612a95565b95945050505050565b60006121b08284612a95565b600060018201612b5957612b596128bf565b5060010190565b828152604060208201526000612b796040830184612816565b949350505050565b600082612b9e57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b6060815260006060820152608060208201526000612bda6080830185612157565b8281036040840152612b32818561215756fea26469706673582212209c0c5fcddd41b1e2b82bb12b3932cc4e4e9cc6436b435232731efd8374c795a964736f6c63430008180033a26469706673582212205fcb4ca2e296f06826639061caa6a116cd8dd115f6844ef02be0355bf3fade9064736f6c63430008180033", + "numDeployments": 11, + "solcInputHash": "334f9bb4703835bd27add7ada7992ca0", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract KlerosGovernor\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"NewGovernor\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_arbitratorExtraData\",\"type\":\"bytes\"},{\"internalType\":\"contract IDisputeTemplateRegistry\",\"name\":\"_templateRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_templateData\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_templateDataMappings\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_submissionBaseDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_submissionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_executionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_withdrawTimeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_wNative\",\"type\":\"address\"}],\"name\":\"deploy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"instances\",\"outputs\":[{\"internalType\":\"contract KlerosGovernor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"NewGovernor(address)\":{\"details\":\"Emitted when a new Governor contract is deployed using this factory.\",\"params\":{\"_address\":\"The address of the newly deployed Governor contract.\"}}},\"kind\":\"dev\",\"methods\":{\"deploy(address,bytes,address,string,string,uint256,uint256,uint256,uint256,address)\":{\"details\":\"Deploy the arbitrable kleros.\",\"params\":{\"_arbitrator\":\"The arbitrator of the contract.\",\"_arbitratorExtraData\":\"Extra data for the arbitrator.\",\"_executionTimeout\":\"Time in seconds after approval that allows to execute transactions of the approved list.\",\"_submissionBaseDeposit\":\"The base deposit required for submission.\",\"_submissionTimeout\":\"Time in seconds allocated for submitting transaction list.\",\"_templateData\":\"The dispute template data.\",\"_templateDataMappings\":\"The dispute template data mappings.\",\"_templateRegistry\":\"Dispute Template registry address\",\"_withdrawTimeout\":\"Time in seconds after submission that allows to withdraw submitted list.\"}}},\"title\":\"GovernorFactory This contract acts as a registry for KlerosGovernor instances.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/GovernorFactory.sol\":\"GovernorFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[]},\"sources\":{\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport {IArbitratorV2} from \\\"./IArbitratorV2.sol\\\";\\n\\n/// @title IArbitrableV2\\n/// @notice Arbitrable interface.\\n/// @dev When developing arbitrable contracts, we need to:\\n/// - Define the action taken when a ruling is received by the contract.\\n/// - Allow dispute creation which calls `arbitrator.createDispute{value: _fee}(_choices,_extraData)`.\\ninterface IArbitrableV2 {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a dispute is created to link the correct template to the disputeID.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorDisputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _templateId The identifier of the dispute template.\\n event DisputeRequest(IArbitratorV2 indexed _arbitrator, uint256 indexed _arbitratorDisputeID, uint256 _templateId);\\n\\n /// @notice To be raised when a ruling is given.\\n /// @param _arbitrator The arbitrator giving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitratorV2 indexed _arbitrator, uint256 indexed _disputeID, uint256 _ruling);\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Give a ruling for a dispute.\\n ///\\n /// @dev This is a callback function for the arbitrator to provide the ruling to this contract.\\n /// Only the arbitrator must be allowed to call this function.\\n /// Ruling 0 is reserved for \\\"Not able/wanting to make a decision\\\".\\n ///\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator.\\n function rule(uint256 _disputeID, uint256 _ruling) external;\\n}\\n\",\"keccak256\":\"0x97c6455e4b9f57e76f338f43eea612ea47ac933dda85c08ef29d418e34879a9b\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitratorV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport {IArbitrableV2} from \\\"./IArbitrableV2.sol\\\";\\n\\n/// @title Arbitrator\\n/// @notice Arbitrator interface for the Kleros V2 protocol.\\n/// @dev Unlike the ERC-792 this standard is not concerned with appeals, so each arbitrator can implement an appeal system that suits it the most.\\ninterface IArbitratorV2 {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a dispute is created.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _arbitrable The contract which created the dispute.\\n event DisputeCreation(uint256 indexed _disputeID, IArbitrableV2 indexed _arbitrable);\\n\\n /// @notice To be raised when a ruling is given.\\n /// @param _arbitrable The arbitrable receiving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitrableV2 indexed _arbitrable, uint256 indexed _disputeID, uint256 _ruling);\\n\\n /// @notice To be emitted when an ERC20 token is added or removed as a method to pay fees.\\n /// @param _token The ERC20 token.\\n /// @param _accepted Whether the token is accepted or not.\\n event AcceptedFeeToken(IERC20 indexed _token, bool indexed _accepted);\\n\\n /// @notice To be emitted when the fee for a particular ERC20 token is updated.\\n /// @param _feeToken The ERC20 token.\\n /// @param _rateInEth The new rate of the fee token in ETH.\\n /// @param _rateDecimals The new decimals of the fee token rate.\\n event NewCurrencyRate(IERC20 indexed _feeToken, uint64 _rateInEth, uint8 _rateDecimals);\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Create a dispute and pay for the fees in the native currency, typically ETH.\\n /// @dev Must be called by the arbitrable contract and pay at least `arbitrationCost(_extraData)` in ETH.\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData\\n ) external payable returns (uint256 disputeID);\\n\\n /// @notice Create a dispute and pay for the fees in a supported ERC20 token.\\n /// @dev Must be called by the arbitrable contract and pay at least `arbitrationCost(_extraData, _feeToken)` in the supported ERC20 token.\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @param _feeAmount Amount of the ERC20 token used to pay fees.\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData,\\n IERC20 _feeToken,\\n uint256 _feeAmount\\n ) external returns (uint256 disputeID);\\n\\n // ************************************* //\\n // * Public Views * //\\n // ************************************* //\\n\\n /// @notice Compute the cost of arbitration denominated in the native currency, typically ETH.\\n /// @dev It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return cost The arbitration cost in ETH.\\n function arbitrationCost(bytes calldata _extraData) external view returns (uint256 cost);\\n\\n /// @notice Compute the cost of arbitration denominated in `_feeToken`.\\n /// @dev It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @return cost The arbitration cost in `_feeToken`.\\n function arbitrationCost(bytes calldata _extraData, IERC20 _feeToken) external view returns (uint256 cost);\\n\\n /// @notice Gets the current ruling of a specified dispute.\\n /// @param _disputeID The ID of the dispute.\\n /// @return ruling The current ruling.\\n /// @return tied Whether it's a tie or not.\\n /// @return overridden Whether the ruling was overridden by appeal funding or not.\\n function currentRuling(uint256 _disputeID) external view returns (uint256 ruling, bool tied, bool overridden);\\n}\\n\",\"keccak256\":\"0x1f4e84e23034f3a291e305e8c69f283c9c97354a49a24f8c02ca366b3eaae00f\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\n/// @title IDisputeTemplateRegistry\\n/// @notice Dispute Template Registry interface.\\ninterface IDisputeTemplateRegistry {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a new dispute template is created.\\n /// @param _templateId The identifier of the dispute template.\\n /// @param _templateTag An optional tag for the dispute template, such as \\\"registration\\\" or \\\"removal\\\".\\n /// @param _templateData The template data.\\n /// @param _templateDataMappings The data mappings.\\n event DisputeTemplate(\\n uint256 indexed _templateId,\\n string indexed _templateTag,\\n string _templateData,\\n string _templateDataMappings\\n );\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Registers a new dispute template.\\n /// @param _templateTag An optional tag for the dispute template, such as \\\"registration\\\" or \\\"removal\\\".\\n /// @param _templateData The template data.\\n /// @param _templateDataMappings The data mappings for the template.\\n /// @return templateId The identifier of the dispute template.\\n function setDisputeTemplate(\\n string memory _templateTag,\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external returns (uint256 templateId);\\n}\\n\",\"keccak256\":\"0x1d6ad6549baabcbfe306ac3a9a3c339bb2d5dcb67fa9f3c5eaed0c9bd3548b12\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\"},\"src/GovernorFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.24;\\n\\nimport {IArbitratorV2} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\\\";\\nimport \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\\\";\\nimport {KlerosGovernor} from \\\"./KlerosGovernor.sol\\\";\\n\\n/// @title GovernorFactory\\n/// This contract acts as a registry for KlerosGovernor instances.\\ncontract GovernorFactory {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @dev Emitted when a new Governor contract is deployed using this factory.\\n /// @param _address The address of the newly deployed Governor contract.\\n event NewGovernor(KlerosGovernor indexed _address);\\n\\n // ************************************* //\\n // * Storage * //\\n // ************************************* //\\n\\n KlerosGovernor[] public instances;\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @dev Deploy the arbitrable kleros.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorExtraData Extra data for the arbitrator.\\n /// @param _templateRegistry Dispute Template registry address\\n /// @param _templateData The dispute template data.\\n /// @param _templateDataMappings The dispute template data mappings.\\n /// @param _submissionBaseDeposit The base deposit required for submission.\\n /// @param _submissionTimeout Time in seconds allocated for submitting transaction list.\\n /// @param _executionTimeout Time in seconds after approval that allows to execute transactions of the approved list.\\n /// @param _withdrawTimeout Time in seconds after submission that allows to withdraw submitted list.\\n function deploy(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData,\\n IDisputeTemplateRegistry _templateRegistry,\\n string memory _templateData,\\n string memory _templateDataMappings,\\n uint256 _submissionBaseDeposit,\\n uint256 _submissionTimeout,\\n uint256 _executionTimeout,\\n uint256 _withdrawTimeout,\\n address _wNative\\n ) public {\\n KlerosGovernor instance = new KlerosGovernor(\\n _arbitrator,\\n _arbitratorExtraData,\\n _templateRegistry,\\n _templateData,\\n _templateDataMappings,\\n _submissionBaseDeposit,\\n _submissionTimeout,\\n _executionTimeout,\\n _withdrawTimeout,\\n _wNative\\n );\\n instances.push(instance);\\n emit NewGovernor(instance);\\n }\\n}\\n\",\"keccak256\":\"0xea0abdd2f86794314f386dfae08caa76f188262b9737c78e5fbda898321b5ec5\",\"license\":\"MIT\"},\"src/KlerosGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.24;\\n\\nimport {IArbitrableV2, IArbitratorV2} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\\\";\\nimport \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\\\";\\nimport {SafeSend} from \\\"./libraries/SafeSend.sol\\\";\\nimport \\\"./interfaces/IArbSys.sol\\\";\\n\\n/// @title KlerosGovernor for V2.\\n/// @dev Appeal and evidence submission is handled by the court.\\ncontract KlerosGovernor is IArbitrableV2 {\\n using SafeSend for address payable;\\n\\n // ************************************* //\\n // * Enums / Structs * //\\n // ************************************* //\\n\\n enum Status {\\n NoDispute,\\n DisputeCreated,\\n Resolved\\n }\\n\\n struct Session {\\n uint256 ruling; // The ruling that was given in this session, if any.\\n uint256 disputeID; // ID given to the dispute of the session, if any.\\n uint256[] submittedLists; // Tracks all lists that were submitted in a session in the form submittedLists[submissionID].\\n uint256 sumDeposit; // Sum of all submission deposits in a session (minus arbitration fees). This is used to calculate the reward.\\n Status status; // Status of a session.\\n uint256 durationOffset; // Time in seconds that prolongs the submission period after the first submission, to give other submitters time to react.\\n }\\n\\n struct Transaction {\\n address target; // The address to call.\\n uint256 value; // Value paid by governor contract that will be used as msg.value in the execution.\\n bytes data; // Calldata of the transaction.\\n bool executed; // Whether the transaction was already executed or not.\\n }\\n\\n struct Submission {\\n address payable submitter; // The one who submits the list.\\n uint256 deposit; // Value of the deposit paid upon submission of the list.\\n Transaction[] txs; // Transactions stored in the list in the form txs[_transactionIndex].\\n bytes32 listHash; // A hash chain of all transactions stored in the list. This is used as a unique identifier within a session.\\n uint256 submissionTime; // The time when the list was submitted.\\n bool approved; // Whether the list was approved for execution or not.\\n uint256 approvalTime; // The time when the list was approved.\\n uint256 submissionBlock; // Block of list submission.\\n }\\n\\n ArbSys constant arbSys = ArbSys(address(100)); // ArbSys implementation https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference#arbsys\\n IArbitratorV2 public arbitrator; // Arbitrator contract.\\n bytes public arbitratorExtraData; // Extra data for arbitrator.\\n address public wNative; // The wrapped native token for safeSend().\\n IDisputeTemplateRegistry public templateRegistry; // The dispute template registry.\\n uint256 public templateId; // The current dispute template identifier.\\n\\n uint256 public submissionBaseDeposit; // The base deposit in wei that needs to be paid in order to submit the list.\\n uint256 public submissionTimeout; // Time in seconds allowed for submitting the lists. Once it's passed the contract enters the approval period.\\n uint256 public executionTimeout; // Time in seconds allowed for the execution of approved lists.\\n uint256 public withdrawTimeout; // Time in seconds allowed to withdraw a submitted list.\\n\\n uint256 public lastApprovalTime; // The time of the last approval of a transaction list.\\n uint256 public reservedETH; // Sum of contract's submission deposits. These funds are not to be used in the execution of transactions.\\n\\n Submission[] public submissions; // Stores all created transaction lists. submissions[_listID].\\n Session[] public sessions; // Stores all submitting sessions. sessions[_session].\\n mapping(uint256 sessionIndex => mapping(bytes32 listHash => bool)) alreadySubmitted; // Indicates whether or not the transaction list was already submitted in order to catch duplicates in the form alreadySubmitted[listHash].\\n\\n // ************************************* //\\n // * Function Modifiers * //\\n // ************************************* //\\n\\n modifier duringSubmissionPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n if (block.timestamp - lastApprovalTime > submissionTimeout + offset) revert SubmissionTimeHasEnded();\\n _;\\n }\\n\\n modifier duringApprovalPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n if (block.timestamp - lastApprovalTime <= submissionTimeout + offset) revert ApprovalTimeNotStarted();\\n _;\\n }\\n\\n modifier onlyByOwner() {\\n if (address(this) != msg.sender) revert OwnerOnly();\\n _;\\n }\\n\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice Emitted when a new list is submitted.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _submitter The address that submitted the list.\\n /// @param _session The number of the current session.\\n /// @param _description The string in CSV format that contains labels of list's transactions.\\n /// Note that the submitter may give bad descriptions of correct actions, but this is to be seen as UI enhancement, not a critical feature and that would play against him in case of dispute.\\n event ListSubmitted(\\n uint256 indexed _listID,\\n address indexed _submitter,\\n uint256 indexed _session,\\n string _description\\n );\\n\\n // ************************************* //\\n // * Constructor * //\\n // ************************************* //\\n\\n /// @notice Constructor.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorExtraData Extra data for the arbitrator.\\n /// @param _templateRegistry Dispute Template registry address\\n /// @param _templateData The dispute template data.\\n /// @param _templateDataMappings The dispute template data mappings.\\n /// @param _submissionBaseDeposit The base deposit required for submission.\\n /// @param _submissionTimeout Time in seconds allocated for submitting transaction list.\\n /// @param _executionTimeout Time in seconds after approval that allows to execute transactions of the approved list.\\n /// @param _withdrawTimeout Time in seconds after submission that allows to withdraw submitted list.\\n /// @param _wNative The wrapped native token address, typically wETH.\\n constructor(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData,\\n IDisputeTemplateRegistry _templateRegistry,\\n string memory _templateData,\\n string memory _templateDataMappings,\\n uint256 _submissionBaseDeposit,\\n uint256 _submissionTimeout,\\n uint256 _executionTimeout,\\n uint256 _withdrawTimeout,\\n address _wNative\\n ) {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n wNative = _wNative;\\n\\n lastApprovalTime = block.timestamp;\\n submissionBaseDeposit = _submissionBaseDeposit;\\n submissionTimeout = _submissionTimeout;\\n executionTimeout = _executionTimeout;\\n withdrawTimeout = _withdrawTimeout;\\n sessions.push();\\n submissions.push();\\n\\n templateRegistry = _templateRegistry;\\n templateId = IDisputeTemplateRegistry(templateRegistry).setDisputeTemplate(\\n \\\"\\\",\\n _templateData,\\n _templateDataMappings\\n );\\n }\\n\\n // ************************************* //\\n // * Governance * //\\n // ************************************* //\\n\\n /// @notice Changes the value of the base deposit required for submitting a list.\\n /// @param _submissionBaseDeposit The new value of the base deposit, in wei.\\n function changeSubmissionDeposit(uint256 _submissionBaseDeposit) external onlyByOwner {\\n submissionBaseDeposit = _submissionBaseDeposit;\\n }\\n\\n /// @notice Changes the time allocated for submission.\\n /// @dev It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract\\n /// and prolonging submission timeout might switch it back to submission period.\\n /// @param _submissionTimeout The new duration of the submission period, in seconds.\\n function changeSubmissionTimeout(uint256 _submissionTimeout) external onlyByOwner duringSubmissionPeriod {\\n submissionTimeout = _submissionTimeout;\\n }\\n\\n /// @notice Changes the time allocated for list's execution.\\n /// @param _executionTimeout The new duration of the execution timeout, in seconds.\\n function changeExecutionTimeout(uint256 _executionTimeout) external onlyByOwner {\\n executionTimeout = _executionTimeout;\\n }\\n\\n /// @notice Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period.\\n /// @param _withdrawTimeout The new duration of withdraw period, in seconds.\\n function changeWithdrawTimeout(uint256 _withdrawTimeout) external onlyByOwner {\\n withdrawTimeout = _withdrawTimeout;\\n }\\n\\n /// @notice Changes the arbitrator of the contract.\\n /// @dev It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract.\\n /// @param _arbitrator The new trusted arbitrator.\\n /// @param _arbitratorExtraData The extra data used by the new arbitrator.\\n function changeArbitrator(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData\\n ) external onlyByOwner duringSubmissionPeriod {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n }\\n\\n /// @notice Update the dispute template data.\\n /// @param _templateData The new dispute template data.\\n /// @param _templateDataMappings The new dispute template data mappings.\\n function changeDisputeTemplate(\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external onlyByOwner {\\n templateId = templateRegistry.setDisputeTemplate(\\\"\\\", _templateData, _templateDataMappings);\\n }\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Creates transaction list based on input parameters and submits it for potential approval and execution.\\n /// @param _target List of addresses to call.\\n /// @param _value List of values required for respective addresses.\\n /// @param _data Concatenated calldata of all transactions of this list.\\n /// @param _dataSize List of lengths in bytes required to split calldata for its respective targets.\\n /// @param _description String in CSV format that describes list's transactions.\\n function submitList(\\n address[] memory _target,\\n uint256[] memory _value,\\n bytes memory _data,\\n uint256[] memory _dataSize,\\n string memory _description\\n ) external payable duringSubmissionPeriod {\\n if (_target.length != _value.length) revert WrongInputTargetAndValue();\\n if (_target.length != _dataSize.length) revert WrongInputTargetAndDatasize();\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions.push();\\n submission.submitter = payable(msg.sender);\\n\\n // https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/block-numbers-and-time\\n submission.submissionBlock = arbSys.arbBlockNumber();\\n\\n // Do the assignment first to avoid creating a new variable and bypass a 'stack too deep' error.\\n submission.deposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n if (msg.value < submission.deposit) revert InsufficientDeposit();\\n\\n bytes32 listHash;\\n bytes32 currentTxHash;\\n uint256 readingPosition;\\n for (uint256 i = 0; i < _target.length; i++) {\\n bytes memory readData = new bytes(_dataSize[i]);\\n Transaction storage transaction = submission.txs.push();\\n transaction.target = _target[i];\\n transaction.value = _value[i];\\n for (uint256 j = 0; j < _dataSize[i]; j++) {\\n readData[j] = _data[readingPosition + j];\\n }\\n transaction.data = readData;\\n readingPosition += _dataSize[i];\\n currentTxHash = keccak256(abi.encodePacked(transaction.target, transaction.value, transaction.data));\\n listHash = keccak256(abi.encodePacked(currentTxHash, listHash));\\n }\\n if (!alreadySubmitted[sessions.length - 1][listHash]) revert ListAlreadySubmitted();\\n alreadySubmitted[sessions.length - 1][listHash] = true;\\n submission.listHash = listHash;\\n submission.submissionTime = block.timestamp;\\n session.sumDeposit += submission.deposit;\\n session.submittedLists.push(submissions.length - 1);\\n if (session.submittedLists.length == 1) session.durationOffset = block.timestamp - lastApprovalTime;\\n\\n emit ListSubmitted(submissions.length - 1, msg.sender, sessions.length - 1, _description);\\n\\n uint256 remainder = msg.value - submission.deposit;\\n if (remainder > 0) payable(msg.sender).safeSend(remainder, wNative);\\n\\n reservedETH += submission.deposit;\\n }\\n\\n /// @notice Withdraws submitted transaction list. Reimburses submission deposit.\\n /// @dev Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made.\\n /// @param _submissionID Submission's index in the array of submitted lists of the current session.\\n /// @param _listHash Hash of a withdrawing list.\\n function withdrawTransactionList(uint256 _submissionID, bytes32 _listHash) external {\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions[session.submittedLists[_submissionID]];\\n if (block.timestamp - lastApprovalTime > submissionTimeout / 2) revert ShouldOnlyWithdrawInFirstHalf();\\n // This is an extra check to prevent _submissionID linking to the wrong list because of index swap during withdrawal.\\n if (submission.listHash != _listHash) revert WrongListHash();\\n if (submission.submitter != msg.sender) revert OnlySubmitterCanWithdraw();\\n if (block.timestamp - submission.submissionTime > withdrawTimeout) revert WithdrawingTimeHasPassed();\\n session.submittedLists[_submissionID] = session.submittedLists[session.submittedLists.length - 1];\\n alreadySubmitted[sessions.length - 1][_listHash] = false;\\n session.submittedLists.pop();\\n session.sumDeposit -= submission.deposit;\\n reservedETH -= submission.deposit;\\n payable(msg.sender).transfer(submission.deposit);\\n }\\n\\n /// @notice Approves a transaction list or creates a dispute if more than one list was submitted.\\n /// @dev If nothing was submitted changes session.\\n function executeSubmissions() external duringApprovalPeriod {\\n Session storage session = sessions[sessions.length - 1];\\n if (session.status != Status.NoDispute) revert AlreadyDisputed();\\n if (session.submittedLists.length == 0) {\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n } else if (session.submittedLists.length == 1) {\\n Submission storage submission = submissions[session.submittedLists[0]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n uint256 sumDeposit = session.sumDeposit;\\n session.sumDeposit = 0;\\n submission.submitter.safeSend(sumDeposit, wNative);\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n\\n reservedETH -= sumDeposit;\\n } else {\\n session.status = Status.DisputeCreated;\\n uint256 arbitrationCost = arbitrator.arbitrationCost(arbitratorExtraData);\\n session.disputeID = arbitrator.createDispute{value: arbitrationCost}(\\n session.submittedLists.length,\\n arbitratorExtraData\\n );\\n // Check in case arbitration cost increased after the submission. It's unlikely that its increase won't be covered by the base deposit, but technically possible.\\n session.sumDeposit = session.sumDeposit > arbitrationCost ? session.sumDeposit - arbitrationCost : 0;\\n reservedETH = reservedETH > arbitrationCost ? reservedETH - arbitrationCost : 0;\\n emit DisputeRequest(arbitrator, session.disputeID, templateId);\\n }\\n }\\n\\n /// @notice Gives a ruling for a dispute.\\n /// @dev Must be called by the arbitrator.\\n /// @param _disputeID ID of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator. Note that 0 is reserved for \\\"Refuse to arbitrate\\\".\\n /// Note If the final ruling is \\\"0\\\" nothing is approved and deposits will stay locked in the contract.\\n function rule(uint256 _disputeID, uint256 _ruling) external override {\\n Session storage session = sessions[sessions.length - 1];\\n if (msg.sender != address(arbitrator)) revert OnlyArbitratorAllowed();\\n if (session.status != Status.DisputeCreated) revert NotDisputed();\\n if (_ruling > session.submittedLists.length) revert RulingOutOfBounds();\\n\\n if (_ruling != 0) {\\n Submission storage submission = submissions[session.submittedLists[_ruling - 1]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n submission.submitter.safeSend(session.sumDeposit, wNative);\\n }\\n // If the ruling is \\\"0\\\" the reserved funds of this session become expendable.\\n reservedETH -= session.sumDeposit;\\n\\n session.sumDeposit = 0;\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n session.ruling = _ruling;\\n sessions.push();\\n\\n emit Ruling(IArbitratorV2(msg.sender), _disputeID, _ruling);\\n }\\n\\n /// @notice Executes selected transactions of the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _cursor Index of the transaction from which to start executing.\\n /// @param _count Number of transactions to execute. Executes until the end if set to \\\"0\\\" or number higher than number of transactions in the list.\\n function executeTransactionList(uint256 _listID, uint256 _cursor, uint256 _count) external {\\n Submission storage submission = submissions[_listID];\\n if (!submission.approved) revert SubmissionNotApproved();\\n if (block.timestamp - submission.approvalTime > executionTimeout) revert TimeToExecuteHasPassed();\\n for (uint256 i = _cursor; i < submission.txs.length && (_count == 0 || i < _cursor + _count); i++) {\\n Transaction storage transaction = submission.txs[i];\\n uint256 expendableFunds = getExpendableFunds();\\n if (!transaction.executed && transaction.value <= expendableFunds) {\\n (bool callResult, ) = transaction.target.call{value: transaction.value}(transaction.data);\\n // An extra check to prevent re-entrancy through target call.\\n if (callResult == true) {\\n if (transaction.executed) revert AlreadyExecuted();\\n transaction.executed = true;\\n }\\n }\\n }\\n }\\n\\n /// @notice Receive function to receive funds for the execution of transactions.\\n receive() external payable {}\\n\\n /// @notice Gets the sum of contract funds that are used for the execution of transactions.\\n /// @return Contract balance without reserved ETH.\\n function getExpendableFunds() public view returns (uint256) {\\n return address(this).balance - reservedETH;\\n }\\n\\n /// @notice Gets the info of the specific transaction in the specific list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _transactionIndex The index of the transaction.\\n /// @return target The target of the transaction.\\n /// @return value The value of the transaction.\\n /// @return data The data of the transaction.\\n /// @return executed Whether the transaction was executed or not.\\n function getTransactionInfo(\\n uint256 _listID,\\n uint256 _transactionIndex\\n ) external view returns (address target, uint256 value, bytes memory data, bool executed) {\\n Submission storage submission = submissions[_listID];\\n Transaction storage transaction = submission.txs[_transactionIndex];\\n return (transaction.target, transaction.value, transaction.data, transaction.executed);\\n }\\n\\n /// @notice Gets the array of submitted lists in the session.\\n ///\\n /// @dev This function is O(n), where `n` is the number of submissions in the session.\\n /// This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts.\\n ///\\n /// @param _session The ID of the session.\\n /// @return submittedLists Indexes of lists that were submitted during the session.\\n function getSubmittedLists(uint256 _session) external view returns (uint256[] memory submittedLists) {\\n Session storage session = sessions[_session];\\n submittedLists = session.submittedLists;\\n }\\n\\n /// @notice Gets the submission from listId.\\n /// @param _listId The index of the transaction list in the array of lists.\\n /// @return submission List belonging to that listId.\\n function getSubmission(uint256 _listId) external view returns (Submission memory submission) {\\n submission = submissions[_listId];\\n }\\n\\n /// @notice Gets the number of transactions in the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @return txCount The number of transactions in the list.\\n function getNumberOfTransactions(uint256 _listID) external view returns (uint256 txCount) {\\n Submission storage submission = submissions[_listID];\\n return submission.txs.length;\\n }\\n\\n /// @notice Gets the number of lists created in contract's lifetime.\\n /// @return The number of created lists.\\n function getNumberOfCreatedLists() external view returns (uint256) {\\n return submissions.length;\\n }\\n\\n /// @notice Gets the number of the ongoing session.\\n /// @return The number of the ongoing session.\\n function getCurrentSessionNumber() external view returns (uint256) {\\n return sessions.length - 1;\\n }\\n\\n /// @notice Gets the session from the session index.\\n /// @return _session The session info.\\n function getSession(uint256 _sessionIndex) external view returns (Session memory _session) {\\n _session = sessions[_sessionIndex];\\n }\\n\\n /// @notice Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost).\\n /// @return _requiredDeposit required deposit value\\n function getTotalSubmissionDeposit() external view returns (uint256 _requiredDeposit) {\\n _requiredDeposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n }\\n\\n // ************************************* //\\n // * Errors * //\\n // ************************************* //\\n\\n error SubmissionTimeHasEnded();\\n error ApprovalTimeNotStarted();\\n error OwnerOnly();\\n error WrongInputTargetAndValue();\\n error WrongInputTargetAndDatasize();\\n error InsufficientDeposit();\\n error ListAlreadySubmitted();\\n error ShouldOnlyWithdrawInFirstHalf();\\n error WrongListHash();\\n error OnlySubmitterCanWithdraw();\\n error WithdrawingTimeHasPassed();\\n error AlreadyDisputed();\\n error OnlyArbitratorAllowed();\\n error NotDisputed();\\n error RulingOutOfBounds();\\n error SubmissionNotApproved();\\n error TimeToExecuteHasPassed();\\n error AlreadyExecuted();\\n}\\n\",\"keccak256\":\"0xe43c23fe08e7022e619a9514d2a7dc5d05e454919a0ed51ca91164d95e04b028\",\"license\":\"MIT\"},\"src/interfaces/IArbSys.sol\":{\"content\":\"// https://github.com/OffchainLabs/nitro-contracts/blob/bdb8f8c68b2229fe9309fe9c03b37017abd1a2cd/src/precompiles/ArbSys.sol\\n// Copyright 2021-2022, Offchain Labs, Inc.\\n// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE\\n// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity >=0.4.21 <0.9.0;\\n\\n/**\\n * @title System level functionality\\n * @notice For use by contracts to interact with core L2-specific functionality.\\n * Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064.\\n */\\ninterface ArbSys {\\n /**\\n * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)\\n * @return block number as int\\n */\\n function arbBlockNumber() external view returns (uint256);\\n\\n /**\\n * @notice Get Arbitrum block hash (reverts unless currentBlockNum-256 <= arbBlockNum < currentBlockNum)\\n * @return block hash\\n */\\n function arbBlockHash(uint256 arbBlockNum) external view returns (bytes32);\\n\\n /**\\n * @notice Gets the rollup's unique chain identifier\\n * @return Chain identifier as int\\n */\\n function arbChainID() external view returns (uint256);\\n\\n /**\\n * @notice Get internal version number identifying an ArbOS build, this is `55 + nitroArbOS version number`\\n * e.g. on ArbOS 31 this would return 86. This is the only function that have the 55 offset.\\n * @return version number as int\\n */\\n function arbOSVersion() external view returns (uint256);\\n\\n /**\\n * @notice Returns 0 since Nitro has no concept of storage gas\\n * @return uint 0\\n */\\n function getStorageGasAvailable() external view returns (uint256);\\n\\n /**\\n * @notice (deprecated) check if current call is top level (meaning it was triggered by an EoA or a L1 contract)\\n * @dev this call has been deprecated and may be removed in a future release\\n * @return true if current execution frame is not a call by another L2 contract\\n */\\n function isTopLevelCall() external view returns (bool);\\n\\n /**\\n * @notice map L1 sender contract address to its L2 alias\\n * @param sender sender address\\n * @param unused argument no longer used\\n * @return aliased sender address\\n */\\n function mapL1SenderContractAddressToL2Alias(address sender, address unused) external pure returns (address);\\n\\n /**\\n * @notice check if the caller (of this caller of this) is an aliased L1 contract address\\n * @return true iff the caller's address is an alias for an L1 contract address\\n */\\n function wasMyCallersAddressAliased() external view returns (bool);\\n\\n /**\\n * @notice return the address of the caller (of this caller of this), without applying L1 contract address aliasing\\n * @return address of the caller's caller, without applying L1 contract address aliasing\\n */\\n function myCallersAddressWithoutAliasing() external view returns (address);\\n\\n /**\\n * @notice Send given amount of Eth to dest from sender.\\n * This is a convenience function, which is equivalent to calling sendTxToL1 with empty data.\\n * @param destination recipient address on L1\\n * @return unique identifier for this L2-to-L1 transaction.\\n */\\n function withdrawEth(address destination) external payable returns (uint256);\\n\\n /**\\n * @notice Send a transaction to L1\\n * @dev it is not possible to execute on the L1 any L2-to-L1 transaction which contains data\\n * to a contract address without any code (as enforced by the Bridge contract).\\n * @param destination recipient address on L1\\n * @param data (optional) calldata for L1 contract call\\n * @return a unique identifier for this L2-to-L1 transaction.\\n */\\n function sendTxToL1(address destination, bytes calldata data) external payable returns (uint256);\\n\\n /**\\n * @notice Get send Merkle tree state\\n * @return size number of sends in the history\\n * @return root root hash of the send history\\n * @return partials hashes of partial subtrees in the send history tree\\n */\\n function sendMerkleTreeState() external view returns (uint256 size, bytes32 root, bytes32[] memory partials);\\n\\n /**\\n * @notice creates a send txn from L2 to L1\\n * @param position = (level << 192) + leaf = (0 << 192) + leaf = leaf\\n */\\n event L2ToL1Tx(\\n address caller,\\n address indexed destination,\\n uint256 indexed hash,\\n uint256 indexed position,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /// @dev DEPRECATED in favour of the new L2ToL1Tx event above after the nitro upgrade\\n event L2ToL1Transaction(\\n address caller,\\n address indexed destination,\\n uint256 indexed uniqueId,\\n uint256 indexed batchNumber,\\n uint256 indexInBatch,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /**\\n * @notice logs a merkle branch for proof synthesis\\n * @param reserved an index meant only to align the 4th index with L2ToL1Transaction's 4th event\\n * @param hash the merkle hash\\n * @param position = (level << 192) + leaf\\n */\\n event SendMerkleUpdate(uint256 indexed reserved, bytes32 indexed hash, uint256 indexed position);\\n\\n error InvalidBlockNumber(uint256 requested, uint256 current);\\n}\\n\",\"keccak256\":\"0x9f2e1c9d8d19db1d3c6baa0549d14a68d09526764f4bd6f3bf030f0af7fd12fe\",\"license\":\"BUSL-1.1\"},\"src/libraries/SafeSend.sol\":{\"content\":\"/**\\n * @authors: [@andreimvp]\\n * @reviewers: [@divyangchauhan, @wadader, @fcanela, @unknownunknown1]\\n * @auditors: []\\n * @bounties: []\\n * SPDX-License-Identifier: MIT\\n */\\n\\npragma solidity ^0.8.24;\\n\\ninterface WethLike {\\n function deposit() external payable;\\n\\n function transfer(address dst, uint256 wad) external;\\n}\\n\\nlibrary SafeSend {\\n function safeSend(address payable _to, uint256 _value, address _wethLike) internal {\\n if (_to.send(_value)) return;\\n\\n WethLike(_wethLike).deposit{value: _value}();\\n WethLike(_wethLike).transfer(_to, _value); /// forge-lint: disable-line(erc20-unchecked-transfer)\\n }\\n}\\n\",\"keccak256\":\"0xd4d5b25d0eb7f7965ea7a9e3d3d6bc13368de9aaf882543a75dc9c57c85e9283\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50613378806100206000396000f3fe60806040523480156200001157600080fd5b50600436106200003a5760003560e01c8063a17ad8a7146200003f578063a2f7b3a51462000058575b600080fd5b62000056620000503660046200025c565b6200008b565b005b6200006f620000693660046200034f565b6200015b565b6040516001600160a01b03909116815260200160405180910390f35b60008a8a8a8a8a8a8a8a8a8a604051620000a59062000186565b620000ba9a99989796959493929190620003b1565b604051809103906000f080158015620000d7573d6000803e3d6000fd5b50600080546001810182558180527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b038416908117909155604051929350917f5425363a03f182281120f5919107c49c7a1a623acc1cbc6df468b6f0c11fcf8c9190a25050505050505050505050565b600081815481106200016c57600080fd5b6000918252602090912001546001600160a01b0316905081565b612f00806200044383390190565b80356001600160a01b0381168114620001ac57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001d957600080fd5b813567ffffffffffffffff80821115620001f757620001f7620001b1565b604051601f8301601f19908116603f01168101908282118183101715620002225762000222620001b1565b816040528381528660208588010111156200023c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806000806000806000806101408b8d0312156200027d57600080fd5b620002888b62000194565b995060208b013567ffffffffffffffff80821115620002a657600080fd5b620002b48e838f01620001c7565b9a50620002c460408e0162000194565b995060608d0135915080821115620002db57600080fd5b620002e98e838f01620001c7565b985060808d01359150808211156200030057600080fd5b506200030f8d828e01620001c7565b96505060a08b0135945060c08b0135935060e08b013592506101008b013591506200033e6101208c0162000194565b90509295989b9194979a5092959850565b6000602082840312156200036257600080fd5b5035919050565b6000815180845260005b81811015620003915760208185018101518683018201520162000373565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038b8116825261014060208301819052600091620003d98483018e62000369565b9150808c1660408501528382036060850152620003f7828c62000369565b915083820360808501526200040d828b62000369565b92508860a08501528760c08501528660e08501528561010085015280851661012085015250509b9a505050505050505050505056fe60806040523480156200001157600080fd5b5060405162002f0038038062002f00833981016040819052620000349162000225565b600080546001600160a01b0319166001600160a01b038c1617905560016200005d8a82620003a9565b50600280546001600160a01b038084166001600160a01b031992831617909255426009556005879055600686905560078590556008849055600c80546001908101909155600b8054909101815560005260038054928b1692909116821790556040516312a6505d60e21b8152634a99417490620000e1908a908a90600401620004a3565b6020604051808303816000875af115801562000101573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001279190620004e3565b60045550620004fd98505050505050505050565b80516001600160a01b03811681146200015357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200018b57818101518382015260200162000171565b50506000910152565b600082601f830112620001a657600080fd5b81516001600160401b0380821115620001c357620001c362000158565b604051601f8301601f19908116603f01168101908282118183101715620001ee57620001ee62000158565b816040528381528660208588010111156200020857600080fd5b6200021b8460208301602089016200016e565b9695505050505050565b6000806000806000806000806000806101408b8d0312156200024657600080fd5b620002518b6200013b565b60208c0151909a506001600160401b03808211156200026f57600080fd5b6200027d8e838f0162000194565b9a506200028d60408e016200013b565b995060608d0151915080821115620002a457600080fd5b620002b28e838f0162000194565b985060808d0151915080821115620002c957600080fd5b50620002d88d828e0162000194565b96505060a08b0151945060c08b0151935060e08b015192506101008b01519150620003076101208c016200013b565b90509295989b9194979a5092959850565b600181811c908216806200032d57607f821691505b6020821081036200034e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a4576000816000526020600020601f850160051c810160208610156200037f5750805b601f850160051c820191505b81811015620003a0578281556001016200038b565b5050505b505050565b81516001600160401b03811115620003c557620003c562000158565b620003dd81620003d6845462000318565b8462000354565b602080601f831160018114620004155760008415620003fc5750858301515b600019600386901b1c1916600185901b178555620003a0565b600085815260208120601f198616915b82811015620004465788860151825594840194600190910190840162000425565b5085821015620004655787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526200048f8160208601602086016200016e565b601f01601f19169290920160200192915050565b6060815260006060820152608060208201526000620004c6608083018562000475565b8281036040840152620004da818562000475565b95945050505050565b600060208284031215620004f657600080fd5b5051919050565b6129f3806200050d6000396000f3fe6080604052600436106101b25760003560e01c806383c4b7a3116100ed578063b6cd08c611610090578063b6cd08c614610519578063b6dc775414610539578063ba7079ca1461054e578063bb0b86ff1461056e578063c4bd851914610584578063c5d552881461059a578063cc2bcdb4146105ba578063dc17bbdb146105da578063f730c07f146105fa57600080fd5b806383c4b7a3146103d75780639244c70414610408578063953d66511461041d5780639c15d1a21461043d578063a0af81f014610453578063a3c595c914610473578063ad73349e146104a3578063b51257001461050457600080fd5b80633e8686cc116101555780633e8686cc146102e9578063402ff0db1461031657806346047838146103435780636c0b7e71146103565780636cc6cde11461036b5780636cf39c2b1461038b57806377b9fda8146103ab5780637aa77f29146103c157600080fd5b80630c7ac7b6146101be5780631b1f5e7b146101e957806321cea5381461020c57806322b52d6614610239578063246c76df1461024f57806324baacc7146102715780632d68efc914610291578063311a6c56146102c957600080fd5b366101b957005b600080fd5b3480156101ca57600080fd5b506101d3610610565b6040516101e09190611fdc565b60405180910390f35b3480156101f557600080fd5b506101fe61069e565b6040519081526020016101e0565b34801561021857600080fd5b5061022c610227366004611ff6565b610723565b6040516101e0919061200f565b34801561024557600080fd5b506101fe60075481565b34801561025b57600080fd5b5061026f61026a366004611ff6565b6107a5565b005b34801561027d57600080fd5b5061026f61028c366004611ff6565b6107ca565b34801561029d57600080fd5b506002546102b1906001600160a01b031681565b6040516001600160a01b0390911681526020016101e0565b3480156102d557600080fd5b5061026f6102e4366004612053565b6107ef565b3480156102f557600080fd5b50610309610304366004611ff6565b6109c1565b6040516101e09190612075565b34801561032257600080fd5b50610336610331366004611ff6565b610bbc565b6040516101e091906121b0565b61026f61035136600461240a565b610caa565b34801561036257600080fd5b506101fe6112b1565b34801561037757600080fd5b506000546102b1906001600160a01b031681565b34801561039757600080fd5b5061026f6103a63660046124db565b6112c3565b3480156103b757600080fd5b506101fe600a5481565b3480156103cd57600080fd5b506101fe60045481565b3480156103e357600080fd5b506103f76103f2366004611ff6565b611487565b6040516101e0959493929190612507565b34801561041457600080fd5b5061026f6114ce565b34801561042957600080fd5b5061026f610438366004611ff6565b611841565b34801561044957600080fd5b506101fe60085481565b34801561045f57600080fd5b506003546102b1906001600160a01b031681565b34801561047f57600080fd5b5061049361048e366004612053565b6118d9565b6040516101e09493929190612539565b3480156104af57600080fd5b506104c36104be366004611ff6565b6119f3565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101e0565b34801561051057600080fd5b506101fe611a4f565b34801561052557600080fd5b5061026f610534366004612053565b611a5f565b34801561054557600080fd5b50600b546101fe565b34801561055a57600080fd5b5061026f610569366004612573565b611cb3565b34801561057a57600080fd5b506101fe60055481565b34801561059057600080fd5b506101fe60065481565b3480156105a657600080fd5b5061026f6105b53660046125c2565b611d72565b3480156105c657600080fd5b5061026f6105d5366004611ff6565b611e0e565b3480156105e657600080fd5b506101fe6105f5366004611ff6565b611e33565b34801561060657600080fd5b506101fe60095481565b6001805461061d9061261b565b80601f01602080910402602001604051908101604052809291908181526020018280546106499061261b565b80156106965780601f1061066b57610100808354040283529160200191610696565b820191906000526020600020905b81548152906001019060200180831161067957829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea9906106d0906001906004016126d2565b602060405180830381865afa1580156106ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071191906126e5565b60055461071e9190612714565b905090565b60606000600c838154811061073a5761073a61272d565b906000526020600020906006020190508060020180548060200260200160405190810160405280929190818152602001828054801561079857602002820191906000526020600020905b815481526020019060010190808311610784575b5050505050915050919050565b3033146107c557604051630b2db9b760e31b815260040160405180910390fd5b600855565b3033146107ea57604051630b2db9b760e31b815260040160405180910390fd5b600555565b600c80546000919061080390600190612743565b815481106108135761081361272d565b600091825260208220915460069190910290910191506001600160a01b031633146108515760405163381a2cb560e11b815260040160405180910390fd5b6001600482015460ff16600281111561086c5761086c612178565b1461088a576040516310cec38560e21b815260040160405180910390fd5b60028101548211156108af57604051631f6edbfd60e01b815260040160405180910390fd5b811561093f576000600b600283016108c8600186612743565b815481106108d8576108d861272d565b9060005260206000200154815481106108f3576108f361272d565b600091825260209091206005600890920201908101805460ff191660011790554260068201556003830154600254825492935061093d926001600160a01b03908116929116611e64565b505b8060030154600a60008282546109559190612743565b90915550506000600382018190554260095560048201805460ff19166002179055828255600c805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a1760405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600b8281548110610a2a57610a2a61272d565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610b76576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610ad39061261b565b80601f0160208091040260200160405190810160405280929190818152602001828054610aff9061261b565b8015610b4c5780601f10610b2157610100808354040283529160200191610b4c565b820191906000526020600020905b815481529060010190602001808311610b2f57829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610a80565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610bc4611f4f565b600c8281548110610bd757610bd761272d565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610c5357602002820191906000526020600020905b815481526020019060010190808311610c3f575b505050918352505060038201546020820152600482015460409091019060ff166002811115610c8457610c84612178565b6002811115610c9557610c95612178565b81526020016005820154815250509050919050565b600c805460009190610cbe90600190612743565b81548110610cce57610cce61272d565b906000526020600020906006020160050154905080600654610cf09190612714565b600954610cfd9042612743565b1115610d1c5760405163d5ac976d60e01b815260040160405180910390fd5b8451865114610d3e57604051638f32290560e01b815260040160405180910390fd5b8251865114610d6057604051633222108360e01b815260040160405180910390fd5b600c805460009190610d7490600190612743565b81548110610d8457610d8461272d565b60009182526020808320600b8054600181018255945260089093027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3b91906126e5565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610e71906001906004016126d2565b602060405180830381865afa158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb291906126e5565b600554610ebf9190612714565b60018201819055341015610ee65760405163070f6eed60e11b815260040160405180910390fd5b60008080805b8b518110156110f2576000898281518110610f0957610f0961272d565b60200260200101516001600160401b03811115610f2857610f28612243565b6040519080825280601f01601f191660200182016040528015610f52576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110610f8757610f8761272d565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d9084908110610fc057610fc061272d565b6020026020010151816001018190555060005b8b8481518110610fe557610fe561272d565b602002602001015181101561104b578c610fff8287612714565b8151811061100f5761100f61272d565b602001015160f81c60f81b83828151811061102c5761102c61272d565b60200101906001600160f81b031916908160001a905350600101610fd3565b506002810161105a83826127a7565b508a838151811061106d5761106d61272d565b6020026020010151846110809190612714565b815460018301546040519296506110aa926001600160a01b039092169160028501906020016128d9565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610eec565b50600c54600d9060009061110890600190612743565b81526020808201929092526040908101600090812086825290925290205460ff166111465760405163607cb3e760e01b815260040160405180910390fd5b6001600d60006001600c8054905061115e9190612743565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916111b2908490612714565b9091555050600b5460028601906111cb90600190612743565b815460018181018455600093845260209093200155600286015490036111fe576009546111f89042612743565b60058601555b600c5461120d90600190612743565b600b54339061121e90600190612743565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a60405161124d9190611fdc565b60405180910390a460008460010154346112679190612743565b905080156112885760025461128890339083906001600160a01b0316611e64565b8460010154600a600082825461129e9190612714565b9091555050505050505050505050505050565b600c5460009061071e90600190612743565b6000600b84815481106112d8576112d861272d565b60009182526020909120600890910201600581015490915060ff1661130f5760405162325f4560e91b815260040160405180910390fd5b60075460068201546113219042612743565b111561134057604051638b349aa560e01b815260040160405180910390fd5b825b600282015481108015611365575082158061136557506113628385612714565b81105b156114805760008260020182815481106113815761138161272d565b90600052602060002090600402019050600061139b611a4f565b600383015490915060ff161580156113b7575080826001015411155b1561146b57815460018301546040516000926001600160a01b031691906113e290600287019061290c565b60006040518083038185875af1925050503d806000811461141f576040519150601f19603f3d011682016040523d82523d6000602084013e611424565b606091505b509091505080151560010361146957600383015460ff161561145957604051630dc1019760e01b815260040160405180910390fd5b60038301805460ff191660011790555b505b5050808061147890612918565b915050611342565b5050505050565b600c818154811061149757600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600c8054600091906114e290600190612743565b815481106114f2576114f261272d565b9060005260206000209060060201600501549050806006546115149190612714565b6009546115219042612743565b1161153f57604051631875ed4760e21b815260040160405180910390fd5b600c80546000919061155390600190612743565b815481106115635761156361272d565b6000918252602082206006909102019150600482015460ff16600281111561158d5761158d612178565b146115ab576040516304ee891b60e11b815260040160405180910390fd5b60028101546000036115d85742600955600401805460ff1916600217905550600c80546001018155600052565b60028101546001036116a7576000600b826002016000815481106115fe576115fe61272d565b9060005260206000200154815481106116195761161961272d565b6000918252602082206005600890920201908101805460ff191660011790554260068201556003840180549290556002548154919350611667916001600160a01b0390811691849116611e64565b4260095560048301805460ff19166002179055600c805460010181556000908152600a805483929061169a908490612743565b9091555061183d92505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926116e992016126d2565b602060405180830381865afa158015611706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172a91906126e5565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e19184916117669190600190600401612931565b60206040518083038185885af1158015611784573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117a991906126e5565b6001830155600382015481106117c05760006117d0565b8082600301546117d09190612743565b6003830155600a5481106117e55760006117f3565b80600a546117f39190612743565b600a5560018201546000546004546040519081526001600160a01b03909116907fee1017dcbefba87397fcdaab31f187328533572b6a5568177fa2eb64026003b6906020016109b4565b5050565b30331461186157604051630b2db9b760e31b815260040160405180910390fd5b600c80546000919061187590600190612743565b815481106118855761188561272d565b9060005260206000209060060201600501549050806006546118a79190612714565b6009546118b49042612743565b11156118d35760405163d5ac976d60e01b815260040160405180910390fd5b50600655565b6000806060600080600b87815481106118f4576118f461272d565b90600052602060002090600802019050600081600201878154811061191b5761191b61272d565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff9091169082906119609061261b565b80601f016020809104026020016040519081016040528092919081815260200182805461198c9061261b565b80156119d95780601f106119ae576101008083540402835291602001916119d9565b820191906000526020600020905b8154815290600101906020018083116119bc57829003601f168201915b505050505091509550955095509550505092959194509250565b600b8181548110611a0357600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600a544761071e9190612743565b600c805460009190611a7390600190612743565b81548110611a8357611a8361272d565b906000526020600020906006020190506000600b826002018581548110611aac57611aac61272d565b906000526020600020015481548110611ac757611ac761272d565b906000526020600020906008020190506002600654611ae69190612952565b600954611af39042612743565b1115611b125760405163383f4af360e21b815260040160405180910390fd5b82816003015414611b36576040516306e671b760e31b815260040160405180910390fd5b80546001600160a01b03163314611b605760405163415360c560e11b815260040160405180910390fd5b6008546004820154611b729042612743565b1115611b915760405163603c988d60e11b815260040160405180910390fd5b600282018054611ba390600190612743565b81548110611bb357611bb361272d565b9060005260206000200154826002018581548110611bd357611bd361272d565b6000918252602082200191909155600c54600d908290611bf590600190612743565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611c3457611c34612974565b600190038181906000526020600020016000905590558060010154826003016000828254611c629190612743565b90915550506001810154600a8054600090611c7e908490612743565b90915550506001810154604051339180156108fc02916000818181858888f19350505050158015611480573d6000803e3d6000fd5b303314611cd357604051630b2db9b760e31b815260040160405180910390fd5b600c805460009190611ce790600190612743565b81548110611cf757611cf761272d565b906000526020600020906006020160050154905080600654611d199190612714565b600954611d269042612743565b1115611d455760405163d5ac976d60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0385161790556001611d6c83826127a7565b50505050565b303314611d9257604051630b2db9b760e31b815260040160405180910390fd5b6003546040516312a6505d60e21b81526001600160a01b0390911690634a99417490611dc4908590859060040161298a565b6020604051808303816000875af1158015611de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0791906126e5565b6004555050565b303314611e2e57604051630b2db9b760e31b815260040160405180910390fd5b600755565b600080600b8381548110611e4957611e4961272d565b60009182526020909120600260089092020101549392505050565b6040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015611e9357505050565b806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ece57600080fd5b505af1158015611ee2573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018790528516935063a9059cbb92506044019050600060405180830381600087803b158015611f3257600080fd5b505af1158015611f46573d6000803e3d6000fd5b50505050505050565b6040518060c001604052806000815260200160008152602001606081526020016000815260200160006002811115611f8957611f89612178565b8152602001600081525090565b6000815180845260005b81811015611fbc57602081850181015186830182015201611fa0565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611fef6020830184611f96565b9392505050565b60006020828403121561200857600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156120475783518352928401929184019160010161202b565b50909695505050505050565b6000806040838503121561206657600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156121295761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d0152612109828d0182611f96565b9287015115159b87019b909b5250985095890195918901916001016120d0565b5050505060608901516080890152608089015160a089015260a0890151955061215660c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b600381106121ac57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b8083101561220d57835182529284019260019290920191908401906121ed565b50606087015160808701526080870151935061222c60a087018561218e565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561228157612281612243565b604052919050565b60006001600160401b038211156122a2576122a2612243565b5060051b60200190565b6001600160a01b03811681146122c157600080fd5b50565b600082601f8301126122d557600080fd5b813560206122ea6122e583612289565b612259565b8083825260208201915060208460051b87010193508684111561230c57600080fd5b602086015b84811015612331578035612324816122ac565b8352918301918301612311565b509695505050505050565b600082601f83011261234d57600080fd5b8135602061235d6122e583612289565b8083825260208201915060208460051b87010193508684111561237f57600080fd5b602086015b848110156123315780358352918301918301612384565b600082601f8301126123ac57600080fd5b81356001600160401b038111156123c5576123c5612243565b6123d8601f8201601f1916602001612259565b8181528460208386010111156123ed57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561242257600080fd5b85356001600160401b038082111561243957600080fd5b61244589838a016122c4565b9650602088013591508082111561245b57600080fd5b61246789838a0161233c565b9550604088013591508082111561247d57600080fd5b61248989838a0161239b565b9450606088013591508082111561249f57600080fd5b6124ab89838a0161233c565b935060808801359150808211156124c157600080fd5b506124ce8882890161239b565b9150509295509295909350565b6000806000606084860312156124f057600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a08101612529606083018561218e565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006125606080830185611f96565b9050821515606083015295945050505050565b6000806040838503121561258657600080fd5b8235612591816122ac565b915060208301356001600160401b038111156125ac57600080fd5b6125b88582860161239b565b9150509250929050565b600080604083850312156125d557600080fd5b82356001600160401b03808211156125ec57600080fd5b6125f88683870161239b565b9350602085013591508082111561260e57600080fd5b506125b88582860161239b565b600181811c9082168061262f57607f821691505b60208210810361264f57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546126628161261b565b80855260206001838116801561267f5760018114612699576126c7565b60ff1985168884015283151560051b8801830195506126c7565b866000528260002060005b858110156126bf5781548a82018601529083019084016126a4565b890184019650505b505050505092915050565b602081526000611fef6020830184612655565b6000602082840312156126f757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115612727576127276126fe565b92915050565b634e487b7160e01b600052603260045260246000fd5b81810381811115612727576127276126fe565b601f8211156127a2576000816000526020600020601f850160051c8101602086101561277f5750805b601f850160051c820191505b8181101561279e5782815560010161278b565b5050505b505050565b81516001600160401b038111156127c0576127c0612243565b6127d4816127ce845461261b565b84612756565b602080601f83116001811461280957600084156127f15750858301515b600019600386901b1c1916600185901b17855561279e565b600085815260208120601f198616915b8281101561283857888601518255948401946001909101908401612819565b50858210156128565787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081546128738161261b565b6001828116801561288b57600181146128a0576128cf565b60ff19841687528215158302870194506128cf565b8560005260208060002060005b858110156128c65781548a8201529084019082016128ad565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b16815282601482015260006129036034830184612866565b95945050505050565b6000611fef8284612866565b60006001820161292a5761292a6126fe565b5060010190565b82815260406020820152600061294a6040830184612655565b949350505050565b60008261296f57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b60608152600060608201526080602082015260006129ab6080830185611f96565b82810360408401526129038185611f9656fea26469706673582212203eb0ce20128709ce0e25d07609542c5c1fd2df8b0d773b52b6377b98d8fada1f64736f6c63430008180033a26469706673582212208a8c8bf9d1e7493392661a016528e4a23e59e8481f5b2e6f93fa98c37412787964736f6c63430008180033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200003a5760003560e01c8063a17ad8a7146200003f578063a2f7b3a51462000058575b600080fd5b62000056620000503660046200025c565b6200008b565b005b6200006f620000693660046200034f565b6200015b565b6040516001600160a01b03909116815260200160405180910390f35b60008a8a8a8a8a8a8a8a8a8a604051620000a59062000186565b620000ba9a99989796959493929190620003b1565b604051809103906000f080158015620000d7573d6000803e3d6000fd5b50600080546001810182558180527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b038416908117909155604051929350917f5425363a03f182281120f5919107c49c7a1a623acc1cbc6df468b6f0c11fcf8c9190a25050505050505050505050565b600081815481106200016c57600080fd5b6000918252602090912001546001600160a01b0316905081565b612f00806200044383390190565b80356001600160a01b0381168114620001ac57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001d957600080fd5b813567ffffffffffffffff80821115620001f757620001f7620001b1565b604051601f8301601f19908116603f01168101908282118183101715620002225762000222620001b1565b816040528381528660208588010111156200023c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806000806000806000806101408b8d0312156200027d57600080fd5b620002888b62000194565b995060208b013567ffffffffffffffff80821115620002a657600080fd5b620002b48e838f01620001c7565b9a50620002c460408e0162000194565b995060608d0135915080821115620002db57600080fd5b620002e98e838f01620001c7565b985060808d01359150808211156200030057600080fd5b506200030f8d828e01620001c7565b96505060a08b0135945060c08b0135935060e08b013592506101008b013591506200033e6101208c0162000194565b90509295989b9194979a5092959850565b6000602082840312156200036257600080fd5b5035919050565b6000815180845260005b81811015620003915760208185018101518683018201520162000373565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038b8116825261014060208301819052600091620003d98483018e62000369565b9150808c1660408501528382036060850152620003f7828c62000369565b915083820360808501526200040d828b62000369565b92508860a08501528760c08501528660e08501528561010085015280851661012085015250509b9a505050505050505050505056fe60806040523480156200001157600080fd5b5060405162002f0038038062002f00833981016040819052620000349162000225565b600080546001600160a01b0319166001600160a01b038c1617905560016200005d8a82620003a9565b50600280546001600160a01b038084166001600160a01b031992831617909255426009556005879055600686905560078590556008849055600c80546001908101909155600b8054909101815560005260038054928b1692909116821790556040516312a6505d60e21b8152634a99417490620000e1908a908a90600401620004a3565b6020604051808303816000875af115801562000101573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001279190620004e3565b60045550620004fd98505050505050505050565b80516001600160a01b03811681146200015357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200018b57818101518382015260200162000171565b50506000910152565b600082601f830112620001a657600080fd5b81516001600160401b0380821115620001c357620001c362000158565b604051601f8301601f19908116603f01168101908282118183101715620001ee57620001ee62000158565b816040528381528660208588010111156200020857600080fd5b6200021b8460208301602089016200016e565b9695505050505050565b6000806000806000806000806000806101408b8d0312156200024657600080fd5b620002518b6200013b565b60208c0151909a506001600160401b03808211156200026f57600080fd5b6200027d8e838f0162000194565b9a506200028d60408e016200013b565b995060608d0151915080821115620002a457600080fd5b620002b28e838f0162000194565b985060808d0151915080821115620002c957600080fd5b50620002d88d828e0162000194565b96505060a08b0151945060c08b0151935060e08b015192506101008b01519150620003076101208c016200013b565b90509295989b9194979a5092959850565b600181811c908216806200032d57607f821691505b6020821081036200034e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a4576000816000526020600020601f850160051c810160208610156200037f5750805b601f850160051c820191505b81811015620003a0578281556001016200038b565b5050505b505050565b81516001600160401b03811115620003c557620003c562000158565b620003dd81620003d6845462000318565b8462000354565b602080601f831160018114620004155760008415620003fc5750858301515b600019600386901b1c1916600185901b178555620003a0565b600085815260208120601f198616915b82811015620004465788860151825594840194600190910190840162000425565b5085821015620004655787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526200048f8160208601602086016200016e565b601f01601f19169290920160200192915050565b6060815260006060820152608060208201526000620004c6608083018562000475565b8281036040840152620004da818562000475565b95945050505050565b600060208284031215620004f657600080fd5b5051919050565b6129f3806200050d6000396000f3fe6080604052600436106101b25760003560e01c806383c4b7a3116100ed578063b6cd08c611610090578063b6cd08c614610519578063b6dc775414610539578063ba7079ca1461054e578063bb0b86ff1461056e578063c4bd851914610584578063c5d552881461059a578063cc2bcdb4146105ba578063dc17bbdb146105da578063f730c07f146105fa57600080fd5b806383c4b7a3146103d75780639244c70414610408578063953d66511461041d5780639c15d1a21461043d578063a0af81f014610453578063a3c595c914610473578063ad73349e146104a3578063b51257001461050457600080fd5b80633e8686cc116101555780633e8686cc146102e9578063402ff0db1461031657806346047838146103435780636c0b7e71146103565780636cc6cde11461036b5780636cf39c2b1461038b57806377b9fda8146103ab5780637aa77f29146103c157600080fd5b80630c7ac7b6146101be5780631b1f5e7b146101e957806321cea5381461020c57806322b52d6614610239578063246c76df1461024f57806324baacc7146102715780632d68efc914610291578063311a6c56146102c957600080fd5b366101b957005b600080fd5b3480156101ca57600080fd5b506101d3610610565b6040516101e09190611fdc565b60405180910390f35b3480156101f557600080fd5b506101fe61069e565b6040519081526020016101e0565b34801561021857600080fd5b5061022c610227366004611ff6565b610723565b6040516101e0919061200f565b34801561024557600080fd5b506101fe60075481565b34801561025b57600080fd5b5061026f61026a366004611ff6565b6107a5565b005b34801561027d57600080fd5b5061026f61028c366004611ff6565b6107ca565b34801561029d57600080fd5b506002546102b1906001600160a01b031681565b6040516001600160a01b0390911681526020016101e0565b3480156102d557600080fd5b5061026f6102e4366004612053565b6107ef565b3480156102f557600080fd5b50610309610304366004611ff6565b6109c1565b6040516101e09190612075565b34801561032257600080fd5b50610336610331366004611ff6565b610bbc565b6040516101e091906121b0565b61026f61035136600461240a565b610caa565b34801561036257600080fd5b506101fe6112b1565b34801561037757600080fd5b506000546102b1906001600160a01b031681565b34801561039757600080fd5b5061026f6103a63660046124db565b6112c3565b3480156103b757600080fd5b506101fe600a5481565b3480156103cd57600080fd5b506101fe60045481565b3480156103e357600080fd5b506103f76103f2366004611ff6565b611487565b6040516101e0959493929190612507565b34801561041457600080fd5b5061026f6114ce565b34801561042957600080fd5b5061026f610438366004611ff6565b611841565b34801561044957600080fd5b506101fe60085481565b34801561045f57600080fd5b506003546102b1906001600160a01b031681565b34801561047f57600080fd5b5061049361048e366004612053565b6118d9565b6040516101e09493929190612539565b3480156104af57600080fd5b506104c36104be366004611ff6565b6119f3565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101e0565b34801561051057600080fd5b506101fe611a4f565b34801561052557600080fd5b5061026f610534366004612053565b611a5f565b34801561054557600080fd5b50600b546101fe565b34801561055a57600080fd5b5061026f610569366004612573565b611cb3565b34801561057a57600080fd5b506101fe60055481565b34801561059057600080fd5b506101fe60065481565b3480156105a657600080fd5b5061026f6105b53660046125c2565b611d72565b3480156105c657600080fd5b5061026f6105d5366004611ff6565b611e0e565b3480156105e657600080fd5b506101fe6105f5366004611ff6565b611e33565b34801561060657600080fd5b506101fe60095481565b6001805461061d9061261b565b80601f01602080910402602001604051908101604052809291908181526020018280546106499061261b565b80156106965780601f1061066b57610100808354040283529160200191610696565b820191906000526020600020905b81548152906001019060200180831161067957829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea9906106d0906001906004016126d2565b602060405180830381865afa1580156106ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071191906126e5565b60055461071e9190612714565b905090565b60606000600c838154811061073a5761073a61272d565b906000526020600020906006020190508060020180548060200260200160405190810160405280929190818152602001828054801561079857602002820191906000526020600020905b815481526020019060010190808311610784575b5050505050915050919050565b3033146107c557604051630b2db9b760e31b815260040160405180910390fd5b600855565b3033146107ea57604051630b2db9b760e31b815260040160405180910390fd5b600555565b600c80546000919061080390600190612743565b815481106108135761081361272d565b600091825260208220915460069190910290910191506001600160a01b031633146108515760405163381a2cb560e11b815260040160405180910390fd5b6001600482015460ff16600281111561086c5761086c612178565b1461088a576040516310cec38560e21b815260040160405180910390fd5b60028101548211156108af57604051631f6edbfd60e01b815260040160405180910390fd5b811561093f576000600b600283016108c8600186612743565b815481106108d8576108d861272d565b9060005260206000200154815481106108f3576108f361272d565b600091825260209091206005600890920201908101805460ff191660011790554260068201556003830154600254825492935061093d926001600160a01b03908116929116611e64565b505b8060030154600a60008282546109559190612743565b90915550506000600382018190554260095560048201805460ff19166002179055828255600c805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a1760405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600b8281548110610a2a57610a2a61272d565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610b76576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610ad39061261b565b80601f0160208091040260200160405190810160405280929190818152602001828054610aff9061261b565b8015610b4c5780601f10610b2157610100808354040283529160200191610b4c565b820191906000526020600020905b815481529060010190602001808311610b2f57829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610a80565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610bc4611f4f565b600c8281548110610bd757610bd761272d565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610c5357602002820191906000526020600020905b815481526020019060010190808311610c3f575b505050918352505060038201546020820152600482015460409091019060ff166002811115610c8457610c84612178565b6002811115610c9557610c95612178565b81526020016005820154815250509050919050565b600c805460009190610cbe90600190612743565b81548110610cce57610cce61272d565b906000526020600020906006020160050154905080600654610cf09190612714565b600954610cfd9042612743565b1115610d1c5760405163d5ac976d60e01b815260040160405180910390fd5b8451865114610d3e57604051638f32290560e01b815260040160405180910390fd5b8251865114610d6057604051633222108360e01b815260040160405180910390fd5b600c805460009190610d7490600190612743565b81548110610d8457610d8461272d565b60009182526020808320600b8054600181018255945260089093027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3b91906126e5565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610e71906001906004016126d2565b602060405180830381865afa158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb291906126e5565b600554610ebf9190612714565b60018201819055341015610ee65760405163070f6eed60e11b815260040160405180910390fd5b60008080805b8b518110156110f2576000898281518110610f0957610f0961272d565b60200260200101516001600160401b03811115610f2857610f28612243565b6040519080825280601f01601f191660200182016040528015610f52576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110610f8757610f8761272d565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d9084908110610fc057610fc061272d565b6020026020010151816001018190555060005b8b8481518110610fe557610fe561272d565b602002602001015181101561104b578c610fff8287612714565b8151811061100f5761100f61272d565b602001015160f81c60f81b83828151811061102c5761102c61272d565b60200101906001600160f81b031916908160001a905350600101610fd3565b506002810161105a83826127a7565b508a838151811061106d5761106d61272d565b6020026020010151846110809190612714565b815460018301546040519296506110aa926001600160a01b039092169160028501906020016128d9565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610eec565b50600c54600d9060009061110890600190612743565b81526020808201929092526040908101600090812086825290925290205460ff166111465760405163607cb3e760e01b815260040160405180910390fd5b6001600d60006001600c8054905061115e9190612743565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916111b2908490612714565b9091555050600b5460028601906111cb90600190612743565b815460018181018455600093845260209093200155600286015490036111fe576009546111f89042612743565b60058601555b600c5461120d90600190612743565b600b54339061121e90600190612743565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a60405161124d9190611fdc565b60405180910390a460008460010154346112679190612743565b905080156112885760025461128890339083906001600160a01b0316611e64565b8460010154600a600082825461129e9190612714565b9091555050505050505050505050505050565b600c5460009061071e90600190612743565b6000600b84815481106112d8576112d861272d565b60009182526020909120600890910201600581015490915060ff1661130f5760405162325f4560e91b815260040160405180910390fd5b60075460068201546113219042612743565b111561134057604051638b349aa560e01b815260040160405180910390fd5b825b600282015481108015611365575082158061136557506113628385612714565b81105b156114805760008260020182815481106113815761138161272d565b90600052602060002090600402019050600061139b611a4f565b600383015490915060ff161580156113b7575080826001015411155b1561146b57815460018301546040516000926001600160a01b031691906113e290600287019061290c565b60006040518083038185875af1925050503d806000811461141f576040519150601f19603f3d011682016040523d82523d6000602084013e611424565b606091505b509091505080151560010361146957600383015460ff161561145957604051630dc1019760e01b815260040160405180910390fd5b60038301805460ff191660011790555b505b5050808061147890612918565b915050611342565b5050505050565b600c818154811061149757600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600c8054600091906114e290600190612743565b815481106114f2576114f261272d565b9060005260206000209060060201600501549050806006546115149190612714565b6009546115219042612743565b1161153f57604051631875ed4760e21b815260040160405180910390fd5b600c80546000919061155390600190612743565b815481106115635761156361272d565b6000918252602082206006909102019150600482015460ff16600281111561158d5761158d612178565b146115ab576040516304ee891b60e11b815260040160405180910390fd5b60028101546000036115d85742600955600401805460ff1916600217905550600c80546001018155600052565b60028101546001036116a7576000600b826002016000815481106115fe576115fe61272d565b9060005260206000200154815481106116195761161961272d565b6000918252602082206005600890920201908101805460ff191660011790554260068201556003840180549290556002548154919350611667916001600160a01b0390811691849116611e64565b4260095560048301805460ff19166002179055600c805460010181556000908152600a805483929061169a908490612743565b9091555061183d92505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926116e992016126d2565b602060405180830381865afa158015611706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172a91906126e5565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e19184916117669190600190600401612931565b60206040518083038185885af1158015611784573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117a991906126e5565b6001830155600382015481106117c05760006117d0565b8082600301546117d09190612743565b6003830155600a5481106117e55760006117f3565b80600a546117f39190612743565b600a5560018201546000546004546040519081526001600160a01b03909116907fee1017dcbefba87397fcdaab31f187328533572b6a5568177fa2eb64026003b6906020016109b4565b5050565b30331461186157604051630b2db9b760e31b815260040160405180910390fd5b600c80546000919061187590600190612743565b815481106118855761188561272d565b9060005260206000209060060201600501549050806006546118a79190612714565b6009546118b49042612743565b11156118d35760405163d5ac976d60e01b815260040160405180910390fd5b50600655565b6000806060600080600b87815481106118f4576118f461272d565b90600052602060002090600802019050600081600201878154811061191b5761191b61272d565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff9091169082906119609061261b565b80601f016020809104026020016040519081016040528092919081815260200182805461198c9061261b565b80156119d95780601f106119ae576101008083540402835291602001916119d9565b820191906000526020600020905b8154815290600101906020018083116119bc57829003601f168201915b505050505091509550955095509550505092959194509250565b600b8181548110611a0357600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600a544761071e9190612743565b600c805460009190611a7390600190612743565b81548110611a8357611a8361272d565b906000526020600020906006020190506000600b826002018581548110611aac57611aac61272d565b906000526020600020015481548110611ac757611ac761272d565b906000526020600020906008020190506002600654611ae69190612952565b600954611af39042612743565b1115611b125760405163383f4af360e21b815260040160405180910390fd5b82816003015414611b36576040516306e671b760e31b815260040160405180910390fd5b80546001600160a01b03163314611b605760405163415360c560e11b815260040160405180910390fd5b6008546004820154611b729042612743565b1115611b915760405163603c988d60e11b815260040160405180910390fd5b600282018054611ba390600190612743565b81548110611bb357611bb361272d565b9060005260206000200154826002018581548110611bd357611bd361272d565b6000918252602082200191909155600c54600d908290611bf590600190612743565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611c3457611c34612974565b600190038181906000526020600020016000905590558060010154826003016000828254611c629190612743565b90915550506001810154600a8054600090611c7e908490612743565b90915550506001810154604051339180156108fc02916000818181858888f19350505050158015611480573d6000803e3d6000fd5b303314611cd357604051630b2db9b760e31b815260040160405180910390fd5b600c805460009190611ce790600190612743565b81548110611cf757611cf761272d565b906000526020600020906006020160050154905080600654611d199190612714565b600954611d269042612743565b1115611d455760405163d5ac976d60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0385161790556001611d6c83826127a7565b50505050565b303314611d9257604051630b2db9b760e31b815260040160405180910390fd5b6003546040516312a6505d60e21b81526001600160a01b0390911690634a99417490611dc4908590859060040161298a565b6020604051808303816000875af1158015611de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0791906126e5565b6004555050565b303314611e2e57604051630b2db9b760e31b815260040160405180910390fd5b600755565b600080600b8381548110611e4957611e4961272d565b60009182526020909120600260089092020101549392505050565b6040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015611e9357505050565b806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ece57600080fd5b505af1158015611ee2573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018790528516935063a9059cbb92506044019050600060405180830381600087803b158015611f3257600080fd5b505af1158015611f46573d6000803e3d6000fd5b50505050505050565b6040518060c001604052806000815260200160008152602001606081526020016000815260200160006002811115611f8957611f89612178565b8152602001600081525090565b6000815180845260005b81811015611fbc57602081850181015186830182015201611fa0565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611fef6020830184611f96565b9392505050565b60006020828403121561200857600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156120475783518352928401929184019160010161202b565b50909695505050505050565b6000806040838503121561206657600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156121295761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d0152612109828d0182611f96565b9287015115159b87019b909b5250985095890195918901916001016120d0565b5050505060608901516080890152608089015160a089015260a0890151955061215660c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b600381106121ac57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b8083101561220d57835182529284019260019290920191908401906121ed565b50606087015160808701526080870151935061222c60a087018561218e565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561228157612281612243565b604052919050565b60006001600160401b038211156122a2576122a2612243565b5060051b60200190565b6001600160a01b03811681146122c157600080fd5b50565b600082601f8301126122d557600080fd5b813560206122ea6122e583612289565b612259565b8083825260208201915060208460051b87010193508684111561230c57600080fd5b602086015b84811015612331578035612324816122ac565b8352918301918301612311565b509695505050505050565b600082601f83011261234d57600080fd5b8135602061235d6122e583612289565b8083825260208201915060208460051b87010193508684111561237f57600080fd5b602086015b848110156123315780358352918301918301612384565b600082601f8301126123ac57600080fd5b81356001600160401b038111156123c5576123c5612243565b6123d8601f8201601f1916602001612259565b8181528460208386010111156123ed57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561242257600080fd5b85356001600160401b038082111561243957600080fd5b61244589838a016122c4565b9650602088013591508082111561245b57600080fd5b61246789838a0161233c565b9550604088013591508082111561247d57600080fd5b61248989838a0161239b565b9450606088013591508082111561249f57600080fd5b6124ab89838a0161233c565b935060808801359150808211156124c157600080fd5b506124ce8882890161239b565b9150509295509295909350565b6000806000606084860312156124f057600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a08101612529606083018561218e565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006125606080830185611f96565b9050821515606083015295945050505050565b6000806040838503121561258657600080fd5b8235612591816122ac565b915060208301356001600160401b038111156125ac57600080fd5b6125b88582860161239b565b9150509250929050565b600080604083850312156125d557600080fd5b82356001600160401b03808211156125ec57600080fd5b6125f88683870161239b565b9350602085013591508082111561260e57600080fd5b506125b88582860161239b565b600181811c9082168061262f57607f821691505b60208210810361264f57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546126628161261b565b80855260206001838116801561267f5760018114612699576126c7565b60ff1985168884015283151560051b8801830195506126c7565b866000528260002060005b858110156126bf5781548a82018601529083019084016126a4565b890184019650505b505050505092915050565b602081526000611fef6020830184612655565b6000602082840312156126f757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115612727576127276126fe565b92915050565b634e487b7160e01b600052603260045260246000fd5b81810381811115612727576127276126fe565b601f8211156127a2576000816000526020600020601f850160051c8101602086101561277f5750805b601f850160051c820191505b8181101561279e5782815560010161278b565b5050505b505050565b81516001600160401b038111156127c0576127c0612243565b6127d4816127ce845461261b565b84612756565b602080601f83116001811461280957600084156127f15750858301515b600019600386901b1c1916600185901b17855561279e565b600085815260208120601f198616915b8281101561283857888601518255948401946001909101908401612819565b50858210156128565787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081546128738161261b565b6001828116801561288b57600181146128a0576128cf565b60ff19841687528215158302870194506128cf565b8560005260208060002060005b858110156128c65781548a8201529084019082016128ad565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b16815282601482015260006129036034830184612866565b95945050505050565b6000611fef8284612866565b60006001820161292a5761292a6126fe565b5060010190565b82815260406020820152600061294a6040830184612655565b949350505050565b60008261296f57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b60608152600060608201526080602082015260006129ab6080830185611f96565b82810360408401526129038185611f9656fea26469706673582212203eb0ce20128709ce0e25d07609542c5c1fd2df8b0d773b52b6377b98d8fada1f64736f6c63430008180033a26469706673582212208a8c8bf9d1e7493392661a016528e4a23e59e8481f5b2e6f93fa98c37412787964736f6c63430008180033", "devdoc": { "events": { "NewGovernor(address)": { @@ -120,7 +125,7 @@ }, "kind": "dev", "methods": { - "deploy(address,bytes,address,string,string,uint256,uint256,uint256,uint256)": { + "deploy(address,bytes,address,string,string,uint256,uint256,uint256,uint256,address)": { "details": "Deploy the arbitrable kleros.", "params": { "_arbitrator": "The arbitrator of the contract.", @@ -151,17 +156,17 @@ "label": "instances", "offset": 0, "slot": "0", - "type": "t_array(t_contract(KlerosGovernor)1712)dyn_storage" + "type": "t_array(t_contract(KlerosGovernor)1762)dyn_storage" } ], "types": { - "t_array(t_contract(KlerosGovernor)1712)dyn_storage": { - "base": "t_contract(KlerosGovernor)1712", + "t_array(t_contract(KlerosGovernor)1762)dyn_storage": { + "base": "t_contract(KlerosGovernor)1762", "encoding": "dynamic_array", "label": "contract KlerosGovernor[]", "numberOfBytes": "32" }, - "t_contract(KlerosGovernor)1712": { + "t_contract(KlerosGovernor)1762": { "encoding": "inplace", "label": "contract KlerosGovernor", "numberOfBytes": "20" diff --git a/contracts/deployments/arbitrumSepoliaDevnet/KlerosGovernor.json b/contracts/deployments/arbitrumSepoliaDevnet/KlerosGovernor.json index c6daae5..742fa38 100644 --- a/contracts/deployments/arbitrumSepoliaDevnet/KlerosGovernor.json +++ b/contracts/deployments/arbitrumSepoliaDevnet/KlerosGovernor.json @@ -1,5 +1,5 @@ { - "address": "0x5a6dAe69c24FFDc67d47C08F7b19b71793779F1a", + "address": "0xCac020AD8BfBB9f32eC2802489aa571a218025b4", "abi": [ { "inputs": [ @@ -47,11 +47,106 @@ "internalType": "uint256", "name": "_withdrawTimeout", "type": "uint256" + }, + { + "internalType": "address", + "name": "_wNative", + "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "AlreadyDisputed", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyExecuted", + "type": "error" + }, + { + "inputs": [], + "name": "ApprovalTimeNotStarted", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientDeposit", + "type": "error" + }, + { + "inputs": [], + "name": "ListAlreadySubmitted", + "type": "error" + }, + { + "inputs": [], + "name": "NotDisputed", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyArbitratorAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "OnlySubmitterCanWithdraw", + "type": "error" + }, + { + "inputs": [], + "name": "OwnerOnly", + "type": "error" + }, + { + "inputs": [], + "name": "RulingOutOfBounds", + "type": "error" + }, + { + "inputs": [], + "name": "ShouldOnlyWithdrawInFirstHalf", + "type": "error" + }, + { + "inputs": [], + "name": "SubmissionNotApproved", + "type": "error" + }, + { + "inputs": [], + "name": "SubmissionTimeHasEnded", + "type": "error" + }, + { + "inputs": [], + "name": "TimeToExecuteHasPassed", + "type": "error" + }, + { + "inputs": [], + "name": "WithdrawingTimeHasPassed", + "type": "error" + }, + { + "inputs": [], + "name": "WrongInputTargetAndDatasize", + "type": "error" + }, + { + "inputs": [], + "name": "WrongInputTargetAndValue", + "type": "error" + }, + { + "inputs": [], + "name": "WrongListHash", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -67,23 +162,11 @@ "name": "_arbitratorDisputeID", "type": "uint256" }, - { - "indexed": false, - "internalType": "uint256", - "name": "_externalDisputeID", - "type": "uint256" - }, { "indexed": false, "internalType": "uint256", "name": "_templateId", "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "_templateUri", - "type": "string" } ], "name": "DisputeRequest", @@ -782,6 +865,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "wNative", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "withdrawTimeout", @@ -818,67 +914,65 @@ "type": "receive" } ], - "transactionHash": "0x457dc7ec0cecdc1237dde0148163a6b2a5595ef4a3b8b8386f5bece52e916594", + "transactionHash": "0x0bf761c3e70dbaef24d9664ca0af2922b51a3298031dbf7da7284ff8864cb496", "receipt": { "to": null, "from": "0x88AB19C0c7b57EeBa545acbD4368748194cd796B", - "contractAddress": "0x5a6dAe69c24FFDc67d47C08F7b19b71793779F1a", - "transactionIndex": 2, - "gasUsed": "2846297", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000208000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000008000000000000000000100000000001000000000000000000000000000000080000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000400000000000100000000000000000000000000000000000000", - "blockHash": "0x1e4b247b78e353708f7606ec772d586ba6ceabfcc82ca377664b84bfe81259e0", - "transactionHash": "0x457dc7ec0cecdc1237dde0148163a6b2a5595ef4a3b8b8386f5bece52e916594", + "contractAddress": "0xCac020AD8BfBB9f32eC2802489aa571a218025b4", + "transactionIndex": 1, + "gasUsed": "2745395", + "logsBloom": "0x04000000400000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000400000000000100000000000000008000000000000000000800", + "blockHash": "0x690e8659299ce902f1e3a6c88b93d0195d6fa9f99e7fa7100cf2c078092df9fc", + "transactionHash": "0x0bf761c3e70dbaef24d9664ca0af2922b51a3298031dbf7da7284ff8864cb496", "logs": [ { - "transactionIndex": 2, - "blockNumber": 164055132, - "transactionHash": "0x457dc7ec0cecdc1237dde0148163a6b2a5595ef4a3b8b8386f5bece52e916594", - "address": "0x45f0662ec4aA4164b187c1bd39D35D0E3168787a", + "transactionIndex": 1, + "blockNumber": 216122794, + "transactionHash": "0x0bf761c3e70dbaef24d9664ca0af2922b51a3298031dbf7da7284ff8864cb496", + "address": "0xa28cA6364B40537B3e73c395cc2B1Bb6de1F1161", "topics": [ "0x00f7cd7255d1073b4e136dd477c38ea0020c051ab17110cc5bfab0c840ff9924", - "0x0000000000000000000000000000000000000000000000000000000000000076", + "0x0000000000000000000000000000000000000000000000000000000000000002", "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000004127b0a20202224736368656d61223a20222e2e2f4e65774469737075746554656d706c6174652e736368656d612e6a736f6e222c0a2020227469746c65223a2022457865637574652061207472616e73616374696f6e206c69737420696e204b6c65726f7320476f7665726e6f72222c0a2020226465736372697074696f6e223a20224d756c7469706c65207472616e73616374696f6e206c697374732077657265207375626d697474656420696e204b6c65726f7320476f7665726e6f722073657373696f6e207b7b65787465726e616c4469737075746549447d7d2c20706c6561736520766f746520666f72207768696368206c697374207472616e73616374696f6e206c6973742073686f756c642062652065786563757465642e222c0a2020227175657374696f6e223a20225768696368207472616e73616374696f6e206c6973742073686f756c642062652065786563757465643f222c0a20202022616e7377657273223a205b0a2020202020207b7b236c6973744964737d7d0a2020202020207b0a20202020202020202020226964223a20227b7b236865787d7d7b7b2e7d7d7b7b2f6865787d7d222c0a20202020202020202020227469746c65223a20224c697374202d207b7b202e207d7d222c0a20202020202020202020226465736372697074696f6e223a202245786563757465204c697374207b7b202e207d7d220a202020202020202020200a2020202020207d2c0a2020202020207b7b2f206c697374496473207d7d0a2020202020207b0a2020202020202020226964223a2230783030222c0a2020202020202020227469746c65223a202252656675736520746f20417262697472617465222c0a2020202020202020226465736372697074696f6e223a20224e6f206c6973742077696c6c2062652065786563757465642e220a2020202020207d0a0a202020205d2c0a202022706f6c696379555249223a20222f697066732f516d5074326f544843595a59555368754c78694b3451574836735850486a76675854714d44704353684b6f6751592f4b6c65726f73476f7665726e6f725072696d617279446f63756d656e742e706466222c0a20202266726f6e74656e6455726c223a202268747470733a2f2f676f7665726e6f722d76322e6b6c65726f732e6275696c646572732f676f7665726e6f722f7b7b61726269747261626c65416464726573737d7d222c0a20202261726269747261746f72436861696e4944223a2022343231363134222c0a20202261726269747261746f7241646472657373223a2022307834383338653331453065613331353233326334333135393831313046453637376341463244364536222c0a20202263617465676f7279223a20224b6c65726f7320476f7665726e6f72222c0a20202276657273696f6e223a2022312e30220a7d0a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001620a5b0a20207b0a202020202274797065223a20226162692f63616c6c222c0a2020202022616269223a202266756e6374696f6e2067657453657373696f6e2875696e743235362920766965772072657475726e7320282875696e74323536202c2075696e74323536202c2075696e743235365b5d202c2075696e74323536202c2075696e7438202c2075696e74323536202929222c0a202020202261646472657373223a20227b7b7b61726269747261626c65416464726573737d7d7d222c0a202020202266756e6374696f6e4e616d65223a202267657453657373696f6e222c0a202020202261726773223a205b0a202020202020227b7b7b65787465726e616c4469737075746549447d7d7d220a202020205d2c0a20202020227365656b223a205b0a202020202232220a202020205d2c0a2020202022706f70756c617465223a205b0a202020202020226c697374496473220a202020205d0a20207d0a5d0a000000000000000000000000000000000000000000000000000000000000", - "logIndex": 1, - "blockHash": "0x1e4b247b78e353708f7606ec772d586ba6ceabfcc82ca377664b84bfe81259e0" + "data": "0x0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000004127b0a20202224736368656d61223a20222e2e2f4e65774469737075746554656d706c6174652e736368656d612e6a736f6e222c0a2020227469746c65223a2022457865637574652061207472616e73616374696f6e206c69737420696e204b6c65726f7320476f7665726e6f72222c0a2020226465736372697074696f6e223a20224d756c7469706c65207472616e73616374696f6e206c697374732077657265207375626d697474656420696e204b6c65726f7320476f7665726e6f722073657373696f6e207b7b65787465726e616c4469737075746549447d7d2c20706c6561736520766f746520666f72207768696368206c697374207472616e73616374696f6e206c6973742073686f756c642062652065786563757465642e222c0a2020227175657374696f6e223a20225768696368207472616e73616374696f6e206c6973742073686f756c642062652065786563757465643f222c0a20202022616e7377657273223a205b0a2020202020207b7b236c6973744964737d7d0a2020202020207b0a20202020202020202020226964223a20227b7b236865787d7d7b7b2e7d7d7b7b2f6865787d7d222c0a20202020202020202020227469746c65223a20224c697374202d207b7b202e207d7d222c0a20202020202020202020226465736372697074696f6e223a202245786563757465204c697374207b7b202e207d7d220a202020202020202020200a2020202020207d2c0a2020202020207b7b2f206c697374496473207d7d0a2020202020207b0a2020202020202020226964223a2230783030222c0a2020202020202020227469746c65223a202252656675736520746f20417262697472617465222c0a2020202020202020226465736372697074696f6e223a20224e6f206c6973742077696c6c2062652065786563757465642e220a2020202020207d0a0a202020205d2c0a202022706f6c696379555249223a20222f697066732f516d5074326f544843595a59555368754c78694b3451574836735850486a76675854714d44704353684b6f6751592f4b6c65726f73476f7665726e6f725072696d617279446f63756d656e742e706466222c0a20202266726f6e74656e6455726c223a202268747470733a2f2f676f7665726e6f722d76322e6b6c65726f732e6275696c646572732f676f7665726e6f722f7b7b61726269747261626c65416464726573737d7d222c0a20202261726269747261746f72436861696e4944223a2022343231363134222c0a20202261726269747261746f7241646472657373223a2022307839456643616546373837643062353364376132346664654142303637413442414643446238393246222c0a20202263617465676f7279223a20224b6c65726f7320476f7665726e6f72222c0a20202276657273696f6e223a2022312e30220a7d0a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001620a5b0a20207b0a202020202274797065223a20226162692f63616c6c222c0a2020202022616269223a202266756e6374696f6e2067657453657373696f6e2875696e743235362920766965772072657475726e7320282875696e74323536202c2075696e74323536202c2075696e743235365b5d202c2075696e74323536202c2075696e7438202c2075696e74323536202929222c0a202020202261646472657373223a20227b7b7b61726269747261626c65416464726573737d7d7d222c0a202020202266756e6374696f6e4e616d65223a202267657453657373696f6e222c0a202020202261726773223a205b0a202020202020227b7b7b65787465726e616c4469737075746549447d7d7d220a202020205d2c0a20202020227365656b223a205b0a202020202232220a202020205d2c0a2020202022706f70756c617465223a205b0a202020202020226c697374496473220a202020205d0a20207d0a5d0a000000000000000000000000000000000000000000000000000000000000", + "logIndex": 0, + "blockHash": "0x690e8659299ce902f1e3a6c88b93d0195d6fa9f99e7fa7100cf2c078092df9fc" } ], - "blockNumber": 164055132, - "cumulativeGasUsed": "2892668", + "blockNumber": 216122794, + "cumulativeGasUsed": "2745395", "status": 1, "byzantium": true }, "args": [ - "0x4838e31E0ea315232c431598110FE677cAF2D6E6", + "0x9EfCaeF787d0b53d7a24fdeAB067A4BAFCDb892F", "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003", - "0x45f0662ec4aA4164b187c1bd39D35D0E3168787a", - "{\n \"$schema\": \"../NewDisputeTemplate.schema.json\",\n \"title\": \"Execute a transaction list in Kleros Governor\",\n \"description\": \"Multiple transaction lists were submitted in Kleros Governor session {{externalDisputeID}}, please vote for which list transaction list should be executed.\",\n \"question\": \"Which transaction list should be executed?\",\n \"answers\": [\n {{#listIds}}\n {\n \"id\": \"{{#hex}}{{.}}{{/hex}}\",\n \"title\": \"List - {{ . }}\",\n \"description\": \"Execute List {{ . }}\"\n \n },\n {{/ listIds }}\n {\n \"id\":\"0x00\",\n \"title\": \"Refuse to Arbitrate\",\n \"description\": \"No list will be executed.\"\n }\n\n ],\n \"policyURI\": \"/ipfs/QmPt2oTHCYZYUShuLxiK4QWH6sXPHjvgXTqMDpCShKogQY/KlerosGovernorPrimaryDocument.pdf\",\n \"frontendUrl\": \"https://governor-v2.kleros.builders/governor/{{arbitrableAddress}}\",\n \"arbitratorChainID\": \"421614\",\n \"arbitratorAddress\": \"0x4838e31E0ea315232c431598110FE677cAF2D6E6\",\n \"category\": \"Kleros Governor\",\n \"version\": \"1.0\"\n}\n", + "0xa28cA6364B40537B3e73c395cc2B1Bb6de1F1161", + "{\n \"$schema\": \"../NewDisputeTemplate.schema.json\",\n \"title\": \"Execute a transaction list in Kleros Governor\",\n \"description\": \"Multiple transaction lists were submitted in Kleros Governor session {{externalDisputeID}}, please vote for which list transaction list should be executed.\",\n \"question\": \"Which transaction list should be executed?\",\n \"answers\": [\n {{#listIds}}\n {\n \"id\": \"{{#hex}}{{.}}{{/hex}}\",\n \"title\": \"List - {{ . }}\",\n \"description\": \"Execute List {{ . }}\"\n \n },\n {{/ listIds }}\n {\n \"id\":\"0x00\",\n \"title\": \"Refuse to Arbitrate\",\n \"description\": \"No list will be executed.\"\n }\n\n ],\n \"policyURI\": \"/ipfs/QmPt2oTHCYZYUShuLxiK4QWH6sXPHjvgXTqMDpCShKogQY/KlerosGovernorPrimaryDocument.pdf\",\n \"frontendUrl\": \"https://governor-v2.kleros.builders/governor/{{arbitrableAddress}}\",\n \"arbitratorChainID\": \"421614\",\n \"arbitratorAddress\": \"0x9EfCaeF787d0b53d7a24fdeAB067A4BAFCDb892F\",\n \"category\": \"Kleros Governor\",\n \"version\": \"1.0\"\n}\n", "\n[\n {\n \"type\": \"abi/call\",\n \"abi\": \"function getSession(uint256) view returns ((uint256 , uint256 , uint256[] , uint256 , uint8 , uint256 ))\",\n \"address\": \"{{{arbitrableAddress}}}\",\n \"functionName\": \"getSession\",\n \"args\": [\n \"{{{externalDisputeID}}}\"\n ],\n \"seek\": [\n \"2\"\n ],\n \"populate\": [\n \"listIds\"\n ]\n }\n]\n", 0, 600, 600, - 600 + 600, + "0x3829A2486d53ee984a0ca2D76552715726b77138" ], - "numDeployments": 17, - "solcInputHash": "2b0d0fdba984395deae7da9f7f5e9dd6", - "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_arbitratorExtraData\",\"type\":\"bytes\"},{\"internalType\":\"contract IDisputeTemplateRegistry\",\"name\":\"_templateRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_templateData\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_templateDataMappings\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_submissionBaseDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_submissionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_executionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_withdrawTimeout\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_arbitratorDisputeID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_externalDisputeID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_templateId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_templateUri\",\"type\":\"string\"}],\"name\":\"DisputeRequest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_submitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_session\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"}],\"name\":\"ListSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_disputeID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_ruling\",\"type\":\"uint256\"}],\"name\":\"Ruling\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"arbitrator\",\"outputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"arbitratorExtraData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_arbitratorExtraData\",\"type\":\"bytes\"}],\"name\":\"changeArbitrator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_templateData\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_templateDataMappings\",\"type\":\"string\"}],\"name\":\"changeDisputeTemplate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_executionTimeout\",\"type\":\"uint256\"}],\"name\":\"changeExecutionTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionBaseDeposit\",\"type\":\"uint256\"}],\"name\":\"changeSubmissionDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionTimeout\",\"type\":\"uint256\"}],\"name\":\"changeSubmissionTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_withdrawTimeout\",\"type\":\"uint256\"}],\"name\":\"changeWithdrawTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executeSubmissions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_cursor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"executeTransactionList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentSessionNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpendableFunds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumberOfCreatedLists\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"}],\"name\":\"getNumberOfTransactions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"txCount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_sessionIndex\",\"type\":\"uint256\"}],\"name\":\"getSession\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"ruling\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"disputeID\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"submittedLists\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"sumDeposit\",\"type\":\"uint256\"},{\"internalType\":\"enum KlerosGovernor.Status\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"durationOffset\",\"type\":\"uint256\"}],\"internalType\":\"struct KlerosGovernor.Session\",\"name\":\"_session\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listId\",\"type\":\"uint256\"}],\"name\":\"getSubmission\",\"outputs\":[{\"components\":[{\"internalType\":\"address payable\",\"name\":\"submitter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"executed\",\"type\":\"bool\"}],\"internalType\":\"struct KlerosGovernor.Transaction[]\",\"name\":\"txs\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes32\",\"name\":\"listHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"submissionTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"approvalTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"submissionBlock\",\"type\":\"uint256\"}],\"internalType\":\"struct KlerosGovernor.Submission\",\"name\":\"submission\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_session\",\"type\":\"uint256\"}],\"name\":\"getSubmittedLists\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"submittedLists\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalSubmissionDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_requiredDeposit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_transactionIndex\",\"type\":\"uint256\"}],\"name\":\"getTransactionInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"executed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastApprovalTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reservedETH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_disputeID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ruling\",\"type\":\"uint256\"}],\"name\":\"rule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"sessions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ruling\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"disputeID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sumDeposit\",\"type\":\"uint256\"},{\"internalType\":\"enum KlerosGovernor.Status\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"durationOffset\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"submissionBaseDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"submissionTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"submissions\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"submitter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"listHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"submissionTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"approvalTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"submissionBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_target\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_value\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"uint256[]\",\"name\":\"_dataSize\",\"type\":\"uint256[]\"},{\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"}],\"name\":\"submitList\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"templateId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"templateRegistry\",\"outputs\":[{\"internalType\":\"contract IDisputeTemplateRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionID\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_listHash\",\"type\":\"bytes32\"}],\"name\":\"withdrawTransactionList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"events\":{\"DisputeRequest(address,uint256,uint256,uint256,string)\":{\"details\":\"To be emitted when a dispute is created to link the correct meta-evidence to the disputeID.\",\"params\":{\"_arbitrator\":\"The arbitrator of the contract.\",\"_arbitratorDisputeID\":\"The identifier of the dispute in the Arbitrator contract.\",\"_externalDisputeID\":\"An identifier created outside Kleros by the protocol requesting arbitration.\",\"_templateId\":\"The identifier of the dispute template. Should not be used with _templateUri.\",\"_templateUri\":\"The URI to the dispute template. For example on IPFS: starting with '/ipfs/'. Should not be used with _templateId.\"}},\"ListSubmitted(uint256,address,uint256,string)\":{\"details\":\"Emitted when a new list is submitted.\",\"params\":{\"_description\":\"The string in CSV format that contains labels of list's transactions. Note that the submitter may give bad descriptions of correct actions, but this is to be seen as UI enhancement, not a critical feature and that would play against him in case of dispute.\",\"_listID\":\"The index of the transaction list in the array of lists.\",\"_session\":\"The number of the current session.\",\"_submitter\":\"The address that submitted the list.\"}},\"Ruling(address,uint256,uint256)\":{\"details\":\"To be raised when a ruling is given.\",\"params\":{\"_arbitrator\":\"The arbitrator giving the ruling.\",\"_disputeID\":\"The identifier of the dispute in the Arbitrator contract.\",\"_ruling\":\"The ruling which was given.\"}}},\"kind\":\"dev\",\"methods\":{\"changeArbitrator(address,bytes)\":{\"details\":\"Changes the arbitrator of the contract. Note that it can't be changed during approval period because there can be an active dispute in the old arbitrator contract.\",\"params\":{\"_arbitrator\":\"The new trusted arbitrator.\",\"_arbitratorExtraData\":\"The extra data used by the new arbitrator.\"}},\"changeDisputeTemplate(string,string)\":{\"details\":\"Update the dispute template data.\",\"params\":{\"_templateData\":\"The new dispute template data.\",\"_templateDataMappings\":\"The new dispute template data mappings.\"}},\"changeExecutionTimeout(uint256)\":{\"details\":\"Changes the time allocated for list's execution.\",\"params\":{\"_executionTimeout\":\"The new duration of the execution timeout, in seconds.\"}},\"changeSubmissionDeposit(uint256)\":{\"details\":\"Changes the value of the base deposit required for submitting a list.\",\"params\":{\"_submissionBaseDeposit\":\"The new value of the base deposit, in wei.\"}},\"changeSubmissionTimeout(uint256)\":{\"details\":\"Changes the time allocated for submission. Note that it can't be changed during approval period because there can be an active dispute in the old arbitrator contract and prolonging submission timeout might switch it back to submission period.\",\"params\":{\"_submissionTimeout\":\"The new duration of the submission period, in seconds.\"}},\"changeWithdrawTimeout(uint256)\":{\"details\":\"Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period.\",\"params\":{\"_withdrawTimeout\":\"The new duration of withdraw period, in seconds.\"}},\"constructor\":{\"details\":\"Constructor.\",\"params\":{\"_arbitrator\":\"The arbitrator of the contract.\",\"_arbitratorExtraData\":\"Extra data for the arbitrator.\",\"_executionTimeout\":\"Time in seconds after approval that allows to execute transactions of the approved list.\",\"_submissionBaseDeposit\":\"The base deposit required for submission.\",\"_submissionTimeout\":\"Time in seconds allocated for submitting transaction list.\",\"_templateData\":\"The dispute template data.\",\"_templateDataMappings\":\"The dispute template data mappings.\",\"_templateRegistry\":\"Dispute Template registry address\",\"_withdrawTimeout\":\"Time in seconds after submission that allows to withdraw submitted list.\"}},\"executeSubmissions()\":{\"details\":\"Approves a transaction list or creates a dispute if more than one list was submitted. If nothing was submitted changes session.\"},\"executeTransactionList(uint256,uint256,uint256)\":{\"details\":\"Executes selected transactions of the list.\",\"params\":{\"_count\":\"Number of transactions to execute. Executes until the end if set to \\\"0\\\" or number higher than number of transactions in the list.\",\"_cursor\":\"Index of the transaction from which to start executing.\",\"_listID\":\"The index of the transaction list in the array of lists.\"}},\"getCurrentSessionNumber()\":{\"details\":\"Gets the number of the ongoing session.\",\"returns\":{\"_0\":\"The number of the ongoing session.\"}},\"getExpendableFunds()\":{\"details\":\"Gets the sum of contract funds that are used for the execution of transactions.\",\"returns\":{\"_0\":\"Contract balance without reserved ETH.\"}},\"getNumberOfCreatedLists()\":{\"details\":\"Gets the number of lists created in contract's lifetime.\",\"returns\":{\"_0\":\"The number of created lists.\"}},\"getNumberOfTransactions(uint256)\":{\"details\":\"Gets the number of transactions in the list.\",\"params\":{\"_listID\":\"The index of the transaction list in the array of lists.\"},\"returns\":{\"txCount\":\"The number of transactions in the list.\"}},\"getSession(uint256)\":{\"details\":\"Gets the session from the session index.\",\"returns\":{\"_session\":\"The session info.\"}},\"getSubmission(uint256)\":{\"details\":\"Gets the submission from listId.\",\"params\":{\"_listId\":\"The index of the transaction list in the array of lists.\"},\"returns\":{\"submission\":\"List belonging to that listId.\"}},\"getSubmittedLists(uint256)\":{\"details\":\"Gets the array of submitted lists in the session. Note that this function is O(n), where n is the number of submissions in the session. This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts.\",\"params\":{\"_session\":\"The ID of the session.\"},\"returns\":{\"submittedLists\":\"Indexes of lists that were submitted during the session.\"}},\"getTotalSubmissionDeposit()\":{\"details\":\"Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost).\",\"returns\":{\"_requiredDeposit\":\"required deposit value\"}},\"getTransactionInfo(uint256,uint256)\":{\"details\":\"Gets the info of the specific transaction in the specific list.\",\"params\":{\"_listID\":\"The index of the transaction list in the array of lists.\",\"_transactionIndex\":\"The index of the transaction.\"},\"returns\":{\"data\":\"The data of the transaction.\",\"executed\":\"Whether the transaction was executed or not.\",\"target\":\"The target of the transaction.\",\"value\":\"The value of the transaction.\"}},\"rule(uint256,uint256)\":{\"details\":\"Gives a ruling for a dispute. Must be called by the arbitrator.\",\"params\":{\"_disputeID\":\"ID of the dispute in the Arbitrator contract.\",\"_ruling\":\"Ruling given by the arbitrator. Note that 0 is reserved for \\\"Refuse to arbitrate\\\". Note If the final ruling is \\\"0\\\" nothing is approved and deposits will stay locked in the contract.\"}},\"submitList(address[],uint256[],bytes,uint256[],string)\":{\"details\":\"Creates transaction list based on input parameters and submits it for potential approval and execution.\",\"params\":{\"_data\":\"Concatenated calldata of all transactions of this list.\",\"_dataSize\":\"List of lengths in bytes required to split calldata for its respective targets.\",\"_description\":\"String in CSV format that describes list's transactions.\",\"_target\":\"List of addresses to call.\",\"_value\":\"List of values required for respective addresses.\"}},\"withdrawTransactionList(uint256,bytes32)\":{\"details\":\"Withdraws submitted transaction list. Reimburses submission deposit. Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made.\",\"params\":{\"_listHash\":\"Hash of a withdrawing list.\",\"_submissionID\":\"Submission's index in the array of submitted lists of the current session.\"}}},\"title\":\"KlerosGovernor for V2. Note that appeal functionality and evidence submission will be handled by the court.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KlerosGovernor.sol\":\"KlerosGovernor\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[]},\"sources\":{\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.24;\\n\\nimport \\\"./IArbitratorV2.sol\\\";\\n\\n/// @title IArbitrableV2\\n/// @notice Arbitrable interface.\\n/// @dev When developing arbitrable contracts, we need to:\\n/// - Define the action taken when a ruling is received by the contract.\\n/// - Allow dispute creation. For this a function must call arbitrator.createDispute{value: _fee}(_choices,_extraData);\\ninterface IArbitrableV2 {\\n /// @dev To be emitted when a dispute is created to link the correct meta-evidence to the disputeID.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorDisputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _externalDisputeID An identifier created outside Kleros by the protocol requesting arbitration.\\n /// @param _templateId The identifier of the dispute template. Should not be used with _templateUri.\\n /// @param _templateUri The URI to the dispute template. For example on IPFS: starting with '/ipfs/'. Should not be used with _templateId.\\n event DisputeRequest(\\n IArbitratorV2 indexed _arbitrator,\\n uint256 indexed _arbitratorDisputeID,\\n uint256 _externalDisputeID,\\n uint256 _templateId,\\n string _templateUri\\n );\\n\\n /// @dev To be raised when a ruling is given.\\n /// @param _arbitrator The arbitrator giving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitratorV2 indexed _arbitrator, uint256 indexed _disputeID, uint256 _ruling);\\n\\n /// @dev Give a ruling for a dispute.\\n /// Must be called by the arbitrator.\\n /// The purpose of this function is to ensure that the address calling it has the right to rule on the contract.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator.\\n /// Note that 0 is reserved for \\\"Not able/wanting to make a decision\\\".\\n function rule(uint256 _disputeID, uint256 _ruling) external;\\n}\\n\",\"keccak256\":\"0xe841a4fe8ec109ce17dde4457bf1583c8b499109b05887c53a49a3207fc6e80b\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitratorV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.24;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"./IArbitrableV2.sol\\\";\\n\\n/// @title Arbitrator\\n/// Arbitrator interface that implements the new arbitration standard.\\n/// Unlike the ERC-792 this standard is not concerned with appeals, so each arbitrator can implement an appeal system that suits it the most.\\n/// When developing arbitrator contracts we need to:\\n/// - Define the functions for dispute creation (createDispute). Don't forget to store the arbitrated contract and the disputeID (which should be unique, may nbDisputes).\\n/// - Define the functions for cost display (arbitrationCost).\\n/// - Allow giving rulings. For this a function must call arbitrable.rule(disputeID, ruling).\\ninterface IArbitratorV2 {\\n /// @dev To be emitted when a dispute is created.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _arbitrable The contract which created the dispute.\\n event DisputeCreation(uint256 indexed _disputeID, IArbitrableV2 indexed _arbitrable);\\n\\n /// @dev To be raised when a ruling is given.\\n /// @param _arbitrable The arbitrable receiving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitrableV2 indexed _arbitrable, uint256 indexed _disputeID, uint256 _ruling);\\n\\n /// @dev To be emitted when an ERC20 token is added or removed as a method to pay fees.\\n /// @param _token The ERC20 token.\\n /// @param _accepted Whether the token is accepted or not.\\n event AcceptedFeeToken(IERC20 indexed _token, bool indexed _accepted);\\n\\n /// @dev To be emitted when the fee for a particular ERC20 token is updated.\\n /// @param _feeToken The ERC20 token.\\n /// @param _rateInEth The new rate of the fee token in ETH.\\n /// @param _rateDecimals The new decimals of the fee token rate.\\n event NewCurrencyRate(IERC20 indexed _feeToken, uint64 _rateInEth, uint8 _rateDecimals);\\n\\n /// @dev Create a dispute and pay for the fees in the native currency, typically ETH.\\n /// Must be called by the arbitrable contract.\\n /// Must pay at least arbitrationCost(_extraData).\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData\\n ) external payable returns (uint256 disputeID);\\n\\n /// @dev Create a dispute and pay for the fees in a supported ERC20 token.\\n /// Must be called by the arbitrable contract.\\n /// Must pay at least arbitrationCost(_extraData).\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @param _feeAmount Amount of the ERC20 token used to pay fees.\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData,\\n IERC20 _feeToken,\\n uint256 _feeAmount\\n ) external returns (uint256 disputeID);\\n\\n /// @dev Compute the cost of arbitration denominated in the native currency, typically ETH.\\n /// It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return cost The arbitration cost in ETH.\\n function arbitrationCost(bytes calldata _extraData) external view returns (uint256 cost);\\n\\n /// @dev Compute the cost of arbitration denominated in `_feeToken`.\\n /// It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @return cost The arbitration cost in `_feeToken`.\\n function arbitrationCost(bytes calldata _extraData, IERC20 _feeToken) external view returns (uint256 cost);\\n\\n /// @dev Gets the current ruling of a specified dispute.\\n /// @param _disputeID The ID of the dispute.\\n /// @return ruling The current ruling.\\n /// @return tied Whether it's a tie or not.\\n /// @return overridden Whether the ruling was overridden by appeal funding or not.\\n function currentRuling(uint256 _disputeID) external view returns (uint256 ruling, bool tied, bool overridden);\\n}\\n\",\"keccak256\":\"0xa4dc6b958197adead238de4246cd04e7389c3dc1b9f968acd10985f8fc5b74cf\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.24;\\n\\n/// @title IDisputeTemplate\\n/// @notice Dispute Template interface.\\ninterface IDisputeTemplateRegistry {\\n /// @dev To be emitted when a new dispute template is created.\\n /// @param _templateId The identifier of the dispute template.\\n /// @param _templateTag An optional tag for the dispute template, such as \\\"registration\\\" or \\\"removal\\\".\\n /// @param _templateData The template data.\\n /// @param _templateDataMappings The data mappings.\\n event DisputeTemplate(\\n uint256 indexed _templateId,\\n string indexed _templateTag,\\n string _templateData,\\n string _templateDataMappings\\n );\\n\\n function setDisputeTemplate(\\n string memory _templateTag,\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external returns (uint256 templateId);\\n}\\n\",\"keccak256\":\"0xb46ff71c32a524a865fe8ca99d94c9daeb690bc9d7d49d963a45b06f60af19f3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\"},\"src/KlerosGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.24;\\n\\nimport {IArbitrableV2, IArbitratorV2} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\\\";\\nimport \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\\\";\\nimport \\\"./interfaces/IArbSys.sol\\\";\\n\\n/// @title KlerosGovernor for V2. Note that appeal functionality and evidence submission will be handled by the court.\\ncontract KlerosGovernor is IArbitrableV2 {\\n // ************************************* //\\n // * Enums / Structs * //\\n // ************************************* //\\n\\n enum Status {\\n NoDispute,\\n DisputeCreated,\\n Resolved\\n }\\n\\n struct Session {\\n uint256 ruling; // The ruling that was given in this session, if any.\\n uint256 disputeID; // ID given to the dispute of the session, if any.\\n uint256[] submittedLists; // Tracks all lists that were submitted in a session in the form submittedLists[submissionID].\\n uint256 sumDeposit; // Sum of all submission deposits in a session (minus arbitration fees). This is used to calculate the reward.\\n Status status; // Status of a session.\\n uint256 durationOffset; // Time in seconds that prolongs the submission period after the first submission, to give other submitters time to react.\\n }\\n\\n struct Transaction {\\n address target; // The address to call.\\n uint256 value; // Value paid by governor contract that will be used as msg.value in the execution.\\n bytes data; // Calldata of the transaction.\\n bool executed; // Whether the transaction was already executed or not.\\n }\\n\\n struct Submission {\\n address payable submitter; // The one who submits the list.\\n uint256 deposit; // Value of the deposit paid upon submission of the list.\\n Transaction[] txs; // Transactions stored in the list in the form txs[_transactionIndex].\\n bytes32 listHash; // A hash chain of all transactions stored in the list. This is used as a unique identifier within a session.\\n uint256 submissionTime; // The time when the list was submitted.\\n bool approved; // Whether the list was approved for execution or not.\\n uint256 approvalTime; // The time when the list was approved.\\n uint256 submissionBlock; // Block of list submission.\\n }\\n\\n ArbSys constant arbSys = ArbSys(address(100)); // ArbSys implementation https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference#arbsys\\n IArbitratorV2 public arbitrator; // Arbitrator contract.\\n bytes public arbitratorExtraData; // Extra data for arbitrator.\\n IDisputeTemplateRegistry public templateRegistry; // The dispute template registry.\\n uint256 public templateId; // The current dispute template identifier.\\n\\n uint256 public submissionBaseDeposit; // The base deposit in wei that needs to be paid in order to submit the list.\\n uint256 public submissionTimeout; // Time in seconds allowed for submitting the lists. Once it's passed the contract enters the approval period.\\n uint256 public executionTimeout; // Time in seconds allowed for the execution of approved lists.\\n uint256 public withdrawTimeout; // Time in seconds allowed to withdraw a submitted list.\\n\\n uint256 public lastApprovalTime; // The time of the last approval of a transaction list.\\n uint256 public reservedETH; // Sum of contract's submission deposits. These funds are not to be used in the execution of transactions.\\n\\n Submission[] public submissions; // Stores all created transaction lists. submissions[_listID].\\n Session[] public sessions; // Stores all submitting sessions. sessions[_session].\\n mapping(uint256 sessionIndex => mapping(bytes32 listHash => bool)) alreadySubmitted; // Indicates whether or not the transaction list was already submitted in order to catch duplicates in the form alreadySubmitted[listHash].\\n // ************************************* //\\n // * Function Modifiers * //\\n // ************************************* //\\n\\n modifier duringSubmissionPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n require(block.timestamp - lastApprovalTime <= submissionTimeout + offset, \\\"Submission time has ended.\\\");\\n _;\\n }\\n\\n modifier duringApprovalPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n require(block.timestamp - lastApprovalTime > submissionTimeout + offset, \\\"Approval time not started yet.\\\");\\n _;\\n }\\n\\n modifier onlyByGovernor() {\\n require(address(this) == msg.sender, \\\"Only the governor allowed.\\\");\\n _;\\n }\\n\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @dev Emitted when a new list is submitted.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _submitter The address that submitted the list.\\n /// @param _session The number of the current session.\\n /// @param _description The string in CSV format that contains labels of list's transactions.\\n /// Note that the submitter may give bad descriptions of correct actions, but this is to be seen as UI enhancement, not a critical feature and that would play against him in case of dispute.\\n event ListSubmitted(\\n uint256 indexed _listID,\\n address indexed _submitter,\\n uint256 indexed _session,\\n string _description\\n );\\n\\n // ************************************* //\\n // * Constructor * //\\n // ************************************* //\\n\\n /// @dev Constructor.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorExtraData Extra data for the arbitrator.\\n /// @param _templateRegistry Dispute Template registry address\\n /// @param _templateData The dispute template data.\\n /// @param _templateDataMappings The dispute template data mappings.\\n /// @param _submissionBaseDeposit The base deposit required for submission.\\n /// @param _submissionTimeout Time in seconds allocated for submitting transaction list.\\n /// @param _executionTimeout Time in seconds after approval that allows to execute transactions of the approved list.\\n /// @param _withdrawTimeout Time in seconds after submission that allows to withdraw submitted list.\\n constructor(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData,\\n IDisputeTemplateRegistry _templateRegistry,\\n string memory _templateData,\\n string memory _templateDataMappings,\\n uint256 _submissionBaseDeposit,\\n uint256 _submissionTimeout,\\n uint256 _executionTimeout,\\n uint256 _withdrawTimeout\\n ) {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n\\n lastApprovalTime = block.timestamp;\\n submissionBaseDeposit = _submissionBaseDeposit;\\n submissionTimeout = _submissionTimeout;\\n executionTimeout = _executionTimeout;\\n withdrawTimeout = _withdrawTimeout;\\n sessions.push();\\n submissions.push();\\n\\n templateRegistry = _templateRegistry;\\n templateId = IDisputeTemplateRegistry(templateRegistry).setDisputeTemplate(\\n \\\"\\\",\\n _templateData,\\n _templateDataMappings\\n );\\n }\\n\\n // ************************************* //\\n // * Governance * //\\n // ************************************* //\\n\\n /// @dev Changes the value of the base deposit required for submitting a list.\\n /// @param _submissionBaseDeposit The new value of the base deposit, in wei.\\n function changeSubmissionDeposit(uint256 _submissionBaseDeposit) external onlyByGovernor {\\n submissionBaseDeposit = _submissionBaseDeposit;\\n }\\n\\n /// @dev Changes the time allocated for submission. Note that it can't be changed during approval period because there can be an active dispute in the old arbitrator contract\\n /// and prolonging submission timeout might switch it back to submission period.\\n /// @param _submissionTimeout The new duration of the submission period, in seconds.\\n function changeSubmissionTimeout(uint256 _submissionTimeout) external onlyByGovernor duringSubmissionPeriod {\\n submissionTimeout = _submissionTimeout;\\n }\\n\\n /// @dev Changes the time allocated for list's execution.\\n /// @param _executionTimeout The new duration of the execution timeout, in seconds.\\n function changeExecutionTimeout(uint256 _executionTimeout) external onlyByGovernor {\\n executionTimeout = _executionTimeout;\\n }\\n\\n /// @dev Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period.\\n /// @param _withdrawTimeout The new duration of withdraw period, in seconds.\\n function changeWithdrawTimeout(uint256 _withdrawTimeout) external onlyByGovernor {\\n withdrawTimeout = _withdrawTimeout;\\n }\\n\\n /// @dev Changes the arbitrator of the contract. Note that it can't be changed during approval period because there can be an active dispute in the old arbitrator contract.\\n /// @param _arbitrator The new trusted arbitrator.\\n /// @param _arbitratorExtraData The extra data used by the new arbitrator.\\n function changeArbitrator(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData\\n ) external onlyByGovernor duringSubmissionPeriod {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n }\\n\\n /// @dev Update the dispute template data.\\n /// @param _templateData The new dispute template data.\\n /// @param _templateDataMappings The new dispute template data mappings.\\n function changeDisputeTemplate(\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external onlyByGovernor {\\n templateId = templateRegistry.setDisputeTemplate(\\\"\\\", _templateData, _templateDataMappings);\\n }\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @dev Creates transaction list based on input parameters and submits it for potential approval and execution.\\n /// @param _target List of addresses to call.\\n /// @param _value List of values required for respective addresses.\\n /// @param _data Concatenated calldata of all transactions of this list.\\n /// @param _dataSize List of lengths in bytes required to split calldata for its respective targets.\\n /// @param _description String in CSV format that describes list's transactions.\\n function submitList(\\n address[] memory _target,\\n uint256[] memory _value,\\n bytes memory _data,\\n uint256[] memory _dataSize,\\n string memory _description\\n ) external payable duringSubmissionPeriod {\\n require(_target.length == _value.length, \\\"Wrong input: target and value\\\");\\n require(_target.length == _dataSize.length, \\\"Wrong input: target and datasize\\\");\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions.push();\\n submission.submitter = payable(msg.sender);\\n\\n // https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/block-numbers-and-time\\n submission.submissionBlock = arbSys.arbBlockNumber();\\n\\n // Do the assignment first to avoid creating a new variable and bypass a 'stack too deep' error.\\n submission.deposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n require(msg.value >= submission.deposit, \\\"Not enough ETH to cover deposit\\\");\\n\\n bytes32 listHash;\\n bytes32 currentTxHash;\\n uint256 readingPosition;\\n for (uint256 i = 0; i < _target.length; i++) {\\n bytes memory readData = new bytes(_dataSize[i]);\\n Transaction storage transaction = submission.txs.push();\\n transaction.target = _target[i];\\n transaction.value = _value[i];\\n for (uint256 j = 0; j < _dataSize[i]; j++) {\\n readData[j] = _data[readingPosition + j];\\n }\\n transaction.data = readData;\\n readingPosition += _dataSize[i];\\n currentTxHash = keccak256(abi.encodePacked(transaction.target, transaction.value, transaction.data));\\n listHash = keccak256(abi.encodePacked(currentTxHash, listHash));\\n }\\n require(!alreadySubmitted[sessions.length - 1][listHash], \\\"List already submitted\\\");\\n alreadySubmitted[sessions.length - 1][listHash] = true;\\n submission.listHash = listHash;\\n submission.submissionTime = block.timestamp;\\n session.sumDeposit += submission.deposit;\\n session.submittedLists.push(submissions.length - 1);\\n if (session.submittedLists.length == 1) session.durationOffset = block.timestamp - lastApprovalTime;\\n\\n emit ListSubmitted(submissions.length - 1, msg.sender, sessions.length - 1, _description);\\n\\n uint256 remainder = msg.value - submission.deposit;\\n if (remainder > 0) payable(msg.sender).send(remainder);\\n\\n reservedETH += submission.deposit;\\n }\\n\\n /// @dev Withdraws submitted transaction list. Reimburses submission deposit.\\n /// Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made.\\n /// @param _submissionID Submission's index in the array of submitted lists of the current session.\\n /// @param _listHash Hash of a withdrawing list.\\n function withdrawTransactionList(uint256 _submissionID, bytes32 _listHash) external {\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions[session.submittedLists[_submissionID]];\\n require(block.timestamp - lastApprovalTime <= submissionTimeout / 2, \\\"Should be in first half\\\");\\n // This require statement is an extra check to prevent _submissionID linking to the wrong list because of index swap during withdrawal.\\n require(submission.listHash == _listHash, \\\"Wrong list hash\\\");\\n require(submission.submitter == msg.sender, \\\"Only submitter can withdraw\\\");\\n require(block.timestamp - submission.submissionTime <= withdrawTimeout, \\\"Withdrawing time has passed.\\\");\\n session.submittedLists[_submissionID] = session.submittedLists[session.submittedLists.length - 1];\\n alreadySubmitted[sessions.length - 1][_listHash] = false;\\n session.submittedLists.pop();\\n session.sumDeposit -= submission.deposit;\\n reservedETH -= submission.deposit;\\n payable(msg.sender).transfer(submission.deposit);\\n }\\n\\n /// @dev Approves a transaction list or creates a dispute if more than one list was submitted.\\n /// If nothing was submitted changes session.\\n function executeSubmissions() external duringApprovalPeriod {\\n Session storage session = sessions[sessions.length - 1];\\n require(session.status == Status.NoDispute, \\\"Already disputed\\\");\\n if (session.submittedLists.length == 0) {\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n } else if (session.submittedLists.length == 1) {\\n Submission storage submission = submissions[session.submittedLists[0]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n uint256 sumDeposit = session.sumDeposit;\\n session.sumDeposit = 0;\\n submission.submitter.send(sumDeposit);\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n\\n reservedETH -= sumDeposit;\\n } else {\\n session.status = Status.DisputeCreated;\\n uint256 arbitrationCost = arbitrator.arbitrationCost(arbitratorExtraData);\\n session.disputeID = arbitrator.createDispute{value: arbitrationCost}(\\n session.submittedLists.length,\\n arbitratorExtraData\\n );\\n // Check in case arbitration cost increased after the submission. It's unlikely that its increase won't be covered by the base deposit, but technically possible.\\n session.sumDeposit = session.sumDeposit > arbitrationCost ? session.sumDeposit - arbitrationCost : 0;\\n reservedETH = reservedETH > arbitrationCost ? reservedETH - arbitrationCost : 0;\\n emit DisputeRequest(arbitrator, session.disputeID, sessions.length - 1, templateId, \\\"\\\");\\n }\\n }\\n\\n /// @dev Gives a ruling for a dispute. Must be called by the arbitrator.\\n /// @param _disputeID ID of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator. Note that 0 is reserved for \\\"Refuse to arbitrate\\\".\\n /// Note If the final ruling is \\\"0\\\" nothing is approved and deposits will stay locked in the contract.\\n function rule(uint256 _disputeID, uint256 _ruling) external override {\\n Session storage session = sessions[sessions.length - 1];\\n require(msg.sender == address(arbitrator), \\\"Only arbitrator allowed\\\");\\n require(session.status == Status.DisputeCreated, \\\"Wrong status\\\");\\n require(_ruling <= session.submittedLists.length, \\\"Ruling is out of bounds.\\\");\\n\\n if (_ruling != 0) {\\n Submission storage submission = submissions[session.submittedLists[_ruling - 1]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n submission.submitter.send(session.sumDeposit);\\n }\\n // If the ruling is \\\"0\\\" the reserved funds of this session become expendable.\\n reservedETH -= session.sumDeposit;\\n\\n session.sumDeposit = 0;\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n session.ruling = _ruling;\\n sessions.push();\\n\\n emit Ruling(IArbitratorV2(msg.sender), _disputeID, _ruling);\\n }\\n\\n /// @dev Executes selected transactions of the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _cursor Index of the transaction from which to start executing.\\n /// @param _count Number of transactions to execute. Executes until the end if set to \\\"0\\\" or number higher than number of transactions in the list.\\n function executeTransactionList(uint256 _listID, uint256 _cursor, uint256 _count) external {\\n Submission storage submission = submissions[_listID];\\n require(submission.approved, \\\"Should be approved\\\");\\n require(block.timestamp - submission.approvalTime <= executionTimeout, \\\"Time to execute has passed\\\");\\n for (uint256 i = _cursor; i < submission.txs.length && (_count == 0 || i < _cursor + _count); i++) {\\n Transaction storage transaction = submission.txs[i];\\n uint256 expendableFunds = getExpendableFunds();\\n if (!transaction.executed && transaction.value <= expendableFunds) {\\n (bool callResult, ) = transaction.target.call{value: transaction.value}(transaction.data);\\n // An extra check to prevent re-entrancy through target call.\\n if (callResult == true) {\\n require(!transaction.executed, \\\"Already executed\\\");\\n transaction.executed = true;\\n }\\n }\\n }\\n }\\n\\n /// @dev Receive function to receive funds for the execution of transactions.\\n receive() external payable {}\\n\\n /// @dev Gets the sum of contract funds that are used for the execution of transactions.\\n /// @return Contract balance without reserved ETH.\\n function getExpendableFunds() public view returns (uint256) {\\n return address(this).balance - reservedETH;\\n }\\n\\n /// @dev Gets the info of the specific transaction in the specific list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _transactionIndex The index of the transaction.\\n /// @return target The target of the transaction.\\n /// @return value The value of the transaction.\\n /// @return data The data of the transaction.\\n /// @return executed Whether the transaction was executed or not.\\n function getTransactionInfo(\\n uint256 _listID,\\n uint256 _transactionIndex\\n ) external view returns (address target, uint256 value, bytes memory data, bool executed) {\\n Submission storage submission = submissions[_listID];\\n Transaction storage transaction = submission.txs[_transactionIndex];\\n return (transaction.target, transaction.value, transaction.data, transaction.executed);\\n }\\n\\n /// @dev Gets the array of submitted lists in the session.\\n /// Note that this function is O(n), where n is the number of submissions in the session. This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts.\\n /// @param _session The ID of the session.\\n /// @return submittedLists Indexes of lists that were submitted during the session.\\n function getSubmittedLists(uint256 _session) external view returns (uint256[] memory submittedLists) {\\n Session storage session = sessions[_session];\\n submittedLists = session.submittedLists;\\n }\\n\\n /// @dev Gets the submission from listId.\\n /// @param _listId The index of the transaction list in the array of lists.\\n /// @return submission List belonging to that listId.\\n function getSubmission(uint256 _listId) external view returns (Submission memory submission) {\\n submission = submissions[_listId];\\n }\\n\\n /// @dev Gets the number of transactions in the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @return txCount The number of transactions in the list.\\n function getNumberOfTransactions(uint256 _listID) external view returns (uint256 txCount) {\\n Submission storage submission = submissions[_listID];\\n return submission.txs.length;\\n }\\n\\n /// @dev Gets the number of lists created in contract's lifetime.\\n /// @return The number of created lists.\\n function getNumberOfCreatedLists() external view returns (uint256) {\\n return submissions.length;\\n }\\n\\n /// @dev Gets the number of the ongoing session.\\n /// @return The number of the ongoing session.\\n function getCurrentSessionNumber() external view returns (uint256) {\\n return sessions.length - 1;\\n }\\n\\n /// @dev Gets the session from the session index.\\n /// @return _session The session info.\\n function getSession(uint256 _sessionIndex) external view returns (Session memory _session) {\\n _session = sessions[_sessionIndex];\\n }\\n\\n /// @dev Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost).\\n /// @return _requiredDeposit required deposit value\\n function getTotalSubmissionDeposit() external view returns (uint256 _requiredDeposit) {\\n _requiredDeposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n }\\n}\\n\",\"keccak256\":\"0x5e285214a17b65e7b0fa8c1a5520852eb587be96bcf5413d1ed59993d2da99cf\",\"license\":\"MIT\"},\"src/interfaces/IArbSys.sol\":{\"content\":\"// https://github.com/OffchainLabs/nitro-contracts/blob/bdb8f8c68b2229fe9309fe9c03b37017abd1a2cd/src/precompiles/ArbSys.sol\\n// Copyright 2021-2022, Offchain Labs, Inc.\\n// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE\\n// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity >=0.4.21 <0.9.0;\\n\\n/**\\n * @title System level functionality\\n * @notice For use by contracts to interact with core L2-specific functionality.\\n * Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064.\\n */\\ninterface ArbSys {\\n /**\\n * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)\\n * @return block number as int\\n */\\n function arbBlockNumber() external view returns (uint256);\\n\\n /**\\n * @notice Get Arbitrum block hash (reverts unless currentBlockNum-256 <= arbBlockNum < currentBlockNum)\\n * @return block hash\\n */\\n function arbBlockHash(uint256 arbBlockNum) external view returns (bytes32);\\n\\n /**\\n * @notice Gets the rollup's unique chain identifier\\n * @return Chain identifier as int\\n */\\n function arbChainID() external view returns (uint256);\\n\\n /**\\n * @notice Get internal version number identifying an ArbOS build, this is `55 + nitroArbOS version number`\\n * e.g. on ArbOS 31 this would return 86. This is the only function that have the 55 offset.\\n * @return version number as int\\n */\\n function arbOSVersion() external view returns (uint256);\\n\\n /**\\n * @notice Returns 0 since Nitro has no concept of storage gas\\n * @return uint 0\\n */\\n function getStorageGasAvailable() external view returns (uint256);\\n\\n /**\\n * @notice (deprecated) check if current call is top level (meaning it was triggered by an EoA or a L1 contract)\\n * @dev this call has been deprecated and may be removed in a future release\\n * @return true if current execution frame is not a call by another L2 contract\\n */\\n function isTopLevelCall() external view returns (bool);\\n\\n /**\\n * @notice map L1 sender contract address to its L2 alias\\n * @param sender sender address\\n * @param unused argument no longer used\\n * @return aliased sender address\\n */\\n function mapL1SenderContractAddressToL2Alias(address sender, address unused) external pure returns (address);\\n\\n /**\\n * @notice check if the caller (of this caller of this) is an aliased L1 contract address\\n * @return true iff the caller's address is an alias for an L1 contract address\\n */\\n function wasMyCallersAddressAliased() external view returns (bool);\\n\\n /**\\n * @notice return the address of the caller (of this caller of this), without applying L1 contract address aliasing\\n * @return address of the caller's caller, without applying L1 contract address aliasing\\n */\\n function myCallersAddressWithoutAliasing() external view returns (address);\\n\\n /**\\n * @notice Send given amount of Eth to dest from sender.\\n * This is a convenience function, which is equivalent to calling sendTxToL1 with empty data.\\n * @param destination recipient address on L1\\n * @return unique identifier for this L2-to-L1 transaction.\\n */\\n function withdrawEth(address destination) external payable returns (uint256);\\n\\n /**\\n * @notice Send a transaction to L1\\n * @dev it is not possible to execute on the L1 any L2-to-L1 transaction which contains data\\n * to a contract address without any code (as enforced by the Bridge contract).\\n * @param destination recipient address on L1\\n * @param data (optional) calldata for L1 contract call\\n * @return a unique identifier for this L2-to-L1 transaction.\\n */\\n function sendTxToL1(address destination, bytes calldata data) external payable returns (uint256);\\n\\n /**\\n * @notice Get send Merkle tree state\\n * @return size number of sends in the history\\n * @return root root hash of the send history\\n * @return partials hashes of partial subtrees in the send history tree\\n */\\n function sendMerkleTreeState() external view returns (uint256 size, bytes32 root, bytes32[] memory partials);\\n\\n /**\\n * @notice creates a send txn from L2 to L1\\n * @param position = (level << 192) + leaf = (0 << 192) + leaf = leaf\\n */\\n event L2ToL1Tx(\\n address caller,\\n address indexed destination,\\n uint256 indexed hash,\\n uint256 indexed position,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /// @dev DEPRECATED in favour of the new L2ToL1Tx event above after the nitro upgrade\\n event L2ToL1Transaction(\\n address caller,\\n address indexed destination,\\n uint256 indexed uniqueId,\\n uint256 indexed batchNumber,\\n uint256 indexInBatch,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /**\\n * @notice logs a merkle branch for proof synthesis\\n * @param reserved an index meant only to align the 4th index with L2ToL1Transaction's 4th event\\n * @param hash the merkle hash\\n * @param position = (level << 192) + leaf\\n */\\n event SendMerkleUpdate(uint256 indexed reserved, bytes32 indexed hash, uint256 indexed position);\\n\\n error InvalidBlockNumber(uint256 requested, uint256 current);\\n}\\n\",\"keccak256\":\"0x9f2e1c9d8d19db1d3c6baa0549d14a68d09526764f4bd6f3bf030f0af7fd12fe\",\"license\":\"BUSL-1.1\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040516200310a3803806200310a833981016040819052620000349162000214565b600080546001600160a01b0319166001600160a01b038b1617905560016200005d898262000384565b50426008556004848155600584905560068390556007829055600b80546001908101909155600a80549091018155600052600280546001600160a01b0319166001600160a01b038a169081179091556040516312a6505d60e21b81529091634a99417491620000d1918a918a91016200047e565b6020604051808303816000875af1158015620000f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001179190620004be565b60035550620004d8975050505050505050565b80516001600160a01b03811681146200014257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200017a57818101518382015260200162000160565b50506000910152565b600082601f8301126200019557600080fd5b81516001600160401b0380821115620001b257620001b262000147565b604051601f8301601f19908116603f01168101908282118183101715620001dd57620001dd62000147565b81604052838152866020858801011115620001f757600080fd5b6200020a8460208301602089016200015d565b9695505050505050565b60008060008060008060008060006101208a8c0312156200023457600080fd5b6200023f8a6200012a565b60208b01519099506001600160401b03808211156200025d57600080fd5b6200026b8d838e0162000183565b99506200027b60408d016200012a565b985060608c01519150808211156200029257600080fd5b620002a08d838e0162000183565b975060808c0151915080821115620002b757600080fd5b50620002c68c828d0162000183565b95505060a08a0151935060c08a0151925060e08a015191506101008a015190509295985092959850929598565b600181811c908216806200030857607f821691505b6020821081036200032957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200037f576000816000526020600020601f850160051c810160208610156200035a5750805b601f850160051c820191505b818110156200037b5782815560010162000366565b5050505b505050565b81516001600160401b03811115620003a057620003a062000147565b620003b881620003b18454620002f3565b846200032f565b602080601f831160018114620003f05760008415620003d75750858301515b600019600386901b1c1916600185901b1785556200037b565b600085815260208120601f198616915b82811015620004215788860151825594840194600190910190840162000400565b5085821015620004405787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526200046a8160208601602086016200015d565b601f01601f19169290920160200192915050565b6060815260006060820152608060208201526000620004a1608083018562000450565b8281036040840152620004b5818562000450565b95945050505050565b600060208284031215620004d157600080fd5b5051919050565b612c2280620004e86000396000f3fe6080604052600436106101a75760003560e01c80639244c704116100e2578063b6dc775411610085578063b6dc77541461050e578063ba7079ca14610523578063bb0b86ff14610543578063c4bd851914610559578063c5d552881461056f578063cc2bcdb41461058f578063dc17bbdb146105af578063f730c07f146105cf57600080fd5b80639244c704146103dd578063953d6651146103f25780639c15d1a214610412578063a0af81f014610428578063a3c595c914610448578063ad73349e14610478578063b5125700146104d9578063b6cd08c6146104ee57600080fd5b8063402ff0db1161014a578063402ff0db146102d357806346047838146103005780636c0b7e71146103135780636cc6cde1146103285780636cf39c2b1461036057806377b9fda8146103805780637aa77f291461039657806383c4b7a3146103ac57600080fd5b80630c7ac7b6146101b35780631b1f5e7b146101de57806321cea5381461020157806322b52d661461022e578063246c76df1461024457806324baacc714610266578063311a6c56146102865780633e8686cc146102a657600080fd5b366101ae57005b600080fd5b3480156101bf57600080fd5b506101c86105e5565b6040516101d5919061219d565b60405180910390f35b3480156101ea57600080fd5b506101f3610673565b6040519081526020016101d5565b34801561020d57600080fd5b5061022161021c3660046121b7565b6106f8565b6040516101d591906121d0565b34801561023a57600080fd5b506101f360065481565b34801561025057600080fd5b5061026461025f3660046121b7565b61077a565b005b34801561027257600080fd5b506102646102813660046121b7565b6107a7565b34801561029257600080fd5b506102646102a1366004612214565b6107cb565b3480156102b257600080fd5b506102c66102c13660046121b7565b610a16565b6040516101d59190612236565b3480156102df57600080fd5b506102f36102ee3660046121b7565b610c11565b6040516101d59190612371565b61026461030e3660046125cb565b610cff565b34801561031f57600080fd5b506101f36113bf565b34801561033457600080fd5b50600054610348906001600160a01b031681565b6040516001600160a01b0390911681526020016101d5565b34801561036c57600080fd5b5061026461037b36600461269c565b6113d1565b34801561038c57600080fd5b506101f360095481565b3480156103a257600080fd5b506101f360035481565b3480156103b857600080fd5b506103cc6103c73660046121b7565b61160c565b6040516101d59594939291906126c8565b3480156103e957600080fd5b50610264611653565b3480156103fe57600080fd5b5061026461040d3660046121b7565b611a4b565b34801561041e57600080fd5b506101f360075481565b34801561043457600080fd5b50600254610348906001600160a01b031681565b34801561045457600080fd5b50610468610463366004612214565b611ae1565b6040516101d594939291906126fa565b34801561048457600080fd5b506104986104933660046121b7565b611bfb565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101d5565b3480156104e557600080fd5b506101f3611c57565b3480156104fa57600080fd5b50610264610509366004612214565b611c67565b34801561051a57600080fd5b50600a546101f3565b34801561052f57600080fd5b5061026461053e366004612734565b611f63565b34801561054f57600080fd5b506101f360045481565b34801561056557600080fd5b506101f360055481565b34801561057b57600080fd5b5061026461058a366004612783565b612020565b34801561059b57600080fd5b506102646105aa3660046121b7565b6120bb565b3480156105bb57600080fd5b506101f36105ca3660046121b7565b6120df565b3480156105db57600080fd5b506101f360085481565b600180546105f2906127dc565b80601f016020809104026020016040519081016040528092919081815260200182805461061e906127dc565b801561066b5780601f106106405761010080835404028352916020019161066b565b820191906000526020600020905b81548152906001019060200180831161064e57829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea9906106a590600190600401612893565b602060405180830381865afa1580156106c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e691906128a6565b6004546106f391906128d5565b905090565b60606000600b838154811061070f5761070f6128ee565b906000526020600020906006020190508060020180548060200260200160405190810160405280929190818152602001828054801561076d57602002820191906000526020600020905b815481526020019060010190808311610759575b5050505050915050919050565b3033146107a25760405162461bcd60e51b815260040161079990612904565b60405180910390fd5b600755565b3033146107c65760405162461bcd60e51b815260040161079990612904565b600455565b600b8054600091906107df9060019061293b565b815481106107ef576107ef6128ee565b600091825260208220915460069190910290910191506001600160a01b031633146108565760405162461bcd60e51b815260206004820152601760248201527613db9b1e48185c989a5d1c985d1bdc88185b1b1bddd959604a1b6044820152606401610799565b6001600482015460ff16600281111561087157610871612339565b146108ad5760405162461bcd60e51b815260206004820152600c60248201526b57726f6e672073746174757360a01b6044820152606401610799565b60028101548211156108fc5760405162461bcd60e51b8152602060048201526018602482015277293ab634b7339034b99037baba1037b3103137bab732399760411b6044820152606401610799565b8115610994576000600a6002830161091560018661293b565b81548110610925576109256128ee565b906000526020600020015481548110610940576109406128ee565b6000918252602082206005600890920201908101805460ff19166001179055426006820155805460038501546040519294506001600160a01b039091169281156108fc029290818181858888f15050505050505b8060030154600960008282546109aa919061293b565b90915550506000600382018190554260085560048201805460ff19166002179055828255600b805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a6c60405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600a8281548110610a7f57610a7f6128ee565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610bcb576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610b28906127dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b54906127dc565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610ad5565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610c19612110565b600b8281548110610c2c57610c2c6128ee565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610ca857602002820191906000526020600020905b815481526020019060010190808311610c94575b505050918352505060038201546020820152600482015460409091019060ff166002811115610cd957610cd9612339565b6002811115610cea57610cea612339565b81526020016005820154815250509050919050565b600b805460009190610d139060019061293b565b81548110610d2357610d236128ee565b906000526020600020906006020160050154905080600554610d4591906128d5565b600854610d52904261293b565b1115610d705760405162461bcd60e51b81526004016107999061294e565b8451865114610dc15760405162461bcd60e51b815260206004820152601d60248201527f57726f6e6720696e7075743a2074617267657420616e642076616c75650000006044820152606401610799565b8251865114610e125760405162461bcd60e51b815260206004820181905260248201527f57726f6e6720696e7075743a2074617267657420616e64206461746173697a656044820152606401610799565b600b805460009190610e269060019061293b565b81548110610e3657610e366128ee565b60009182526020808320600a8054600181018255945260089093027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610ec9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eed91906128a6565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610f2390600190600401612893565b602060405180830381865afa158015610f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6491906128a6565b600454610f7191906128d5565b60018201819055341015610fc75760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420656e6f7567682045544820746f20636f766572206465706f736974006044820152606401610799565b60008080805b8b518110156111d3576000898281518110610fea57610fea6128ee565b60200260200101516001600160401b0381111561100957611009612404565b6040519080825280601f01601f191660200182016040528015611033576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110611068576110686128ee565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d90849081106110a1576110a16128ee565b6020026020010151816001018190555060005b8b84815181106110c6576110c66128ee565b602002602001015181101561112c578c6110e082876128d5565b815181106110f0576110f06128ee565b602001015160f81c60f81b83828151811061110d5761110d6128ee565b60200101906001600160f81b031916908160001a9053506001016110b4565b506002810161113b83826129d6565b508a838151811061114e5761114e6128ee565b60200260200101518461116191906128d5565b8154600183015460405192965061118b926001600160a01b03909216916002850190602001612b08565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610fcd565b50600b54600c906000906111e99060019061293b565b81526020808201929092526040908101600090812086825290925290205460ff16156112505760405162461bcd60e51b8152602060048201526016602482015275131a5cdd08185b1c9958591e481cdd589b5a5d1d195960521b6044820152606401610799565b6001600c60006001600b80549050611268919061293b565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916112bc9084906128d5565b9091555050600a5460028601906112d59060019061293b565b8154600181810184556000938452602090932001556002860154900361130857600854611302904261293b565b60058601555b600b546113179060019061293b565b600a5433906113289060019061293b565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a604051611357919061219d565b60405180910390a46000846001015434611371919061293b565b9050801561139657604051339082156108fc029083906000818181858888f150505050505b8460010154600960008282546113ac91906128d5565b9091555050505050505050505050505050565b600b546000906106f39060019061293b565b6000600a84815481106113e6576113e66128ee565b60009182526020909120600890910201600581015490915060ff166114425760405162461bcd60e51b815260206004820152601260248201527114da1bdd5b1908189948185c1c1c9bdd995960721b6044820152606401610799565b600654816006015442611455919061293b565b11156114a35760405162461bcd60e51b815260206004820152601a60248201527f54696d6520746f206578656375746520686173207061737365640000000000006044820152606401610799565b825b6002820154811080156114c857508215806114c857506114c583856128d5565b81105b156116055760008260020182815481106114e4576114e46128ee565b9060005260206000209060040201905060006114fe611c57565b600383015490915060ff1615801561151a575080826001015411155b156115f057815460018301546040516000926001600160a01b03169190611545906002870190612b3b565b60006040518083038185875af1925050503d8060008114611582576040519150601f19603f3d011682016040523d82523d6000602084013e611587565b606091505b50909150508015156001036115ee57600383015460ff16156115de5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48195e1958dd5d195960821b6044820152606401610799565b60038301805460ff191660011790555b505b505080806115fd90612b47565b9150506114a5565b5050505050565b600b818154811061161c57600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600b8054600091906116679060019061293b565b81548110611677576116776128ee565b90600052602060002090600602016005015490508060055461169991906128d5565b6008546116a6904261293b565b116116f35760405162461bcd60e51b815260206004820152601e60248201527f417070726f76616c2074696d65206e6f742073746172746564207965742e00006044820152606401610799565b600b8054600091906117079060019061293b565b81548110611717576117176128ee565b6000918252602082206006909102019150600482015460ff16600281111561174157611741612339565b146117815760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48191a5cdc1d5d195960821b6044820152606401610799565b60028101546000036117ae5742600855600401805460ff1916600217905550600b80546001018155600052565b600281015460010361188a576000600a826002016000815481106117d4576117d46128ee565b9060005260206000200154815481106117ef576117ef6128ee565b6000918252602082206005600890920201908101805460ff1916600117905542600682015560038401805490839055815460405192945090926001600160a01b039091169183156108fc0291849190818181858888f150504260085550505060048301805460ff19166002179055600b8054600101815560009081526009805483929061187d90849061293b565b90915550611a4792505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926118cc9201612893565b602060405180830381865afa1580156118e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190d91906128a6565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e19184916119499190600190600401612b60565b60206040518083038185885af1158015611967573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061198c91906128a6565b6001830155600382015481106119a35760006119b3565b8082600301546119b3919061293b565b600383015560095481106119c85760006119d6565b806009546119d6919061293b565b600955600180830154600054600b5491926001600160a01b03909116917f8bd32f430ff060e6bd204709b3790c9807987263d3230c580dc80b5f89e2718691611a1e9161293b565b600354604051610a09929190918252602082015260606040820181905260009082015260800190565b5050565b303314611a6a5760405162461bcd60e51b815260040161079990612904565b600b805460009190611a7e9060019061293b565b81548110611a8e57611a8e6128ee565b906000526020600020906006020160050154905080600554611ab091906128d5565b600854611abd904261293b565b1115611adb5760405162461bcd60e51b81526004016107999061294e565b50600555565b6000806060600080600a8781548110611afc57611afc6128ee565b906000526020600020906008020190506000816002018781548110611b2357611b236128ee565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff909116908290611b68906127dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b94906127dc565b8015611be15780601f10611bb657610100808354040283529160200191611be1565b820191906000526020600020905b815481529060010190602001808311611bc457829003601f168201915b505050505091509550955095509550505092959194509250565b600a8181548110611c0b57600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600954476106f3919061293b565b600b805460009190611c7b9060019061293b565b81548110611c8b57611c8b6128ee565b906000526020600020906006020190506000600a826002018581548110611cb457611cb46128ee565b906000526020600020015481548110611ccf57611ccf6128ee565b906000526020600020906008020190506002600554611cee9190612b81565b600854611cfb904261293b565b1115611d435760405162461bcd60e51b815260206004820152601760248201527629b437bab6321031329034b7103334b939ba103430b63360491b6044820152606401610799565b82816003015414611d885760405162461bcd60e51b815260206004820152600f60248201526e0aee4dedcce40d8d2e6e840d0c2e6d608b1b6044820152606401610799565b80546001600160a01b03163314611de15760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79207375626d69747465722063616e20776974686472617700000000006044820152606401610799565b6007546004820154611df3904261293b565b1115611e415760405162461bcd60e51b815260206004820152601c60248201527f5769746864726177696e672074696d6520686173207061737365642e000000006044820152606401610799565b600282018054611e539060019061293b565b81548110611e6357611e636128ee565b9060005260206000200154826002018581548110611e8357611e836128ee565b6000918252602082200191909155600b54600c908290611ea59060019061293b565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611ee457611ee4612ba3565b600190038181906000526020600020016000905590558060010154826003016000828254611f12919061293b565b9091555050600181015460098054600090611f2e90849061293b565b90915550506001810154604051339180156108fc02916000818181858888f19350505050158015611605573d6000803e3d6000fd5b303314611f825760405162461bcd60e51b815260040161079990612904565b600b805460009190611f969060019061293b565b81548110611fa657611fa66128ee565b906000526020600020906006020160050154905080600554611fc891906128d5565b600854611fd5904261293b565b1115611ff35760405162461bcd60e51b81526004016107999061294e565b600080546001600160a01b0319166001600160a01b038516179055600161201a83826129d6565b50505050565b30331461203f5760405162461bcd60e51b815260040161079990612904565b6002546040516312a6505d60e21b81526001600160a01b0390911690634a994174906120719085908590600401612bb9565b6020604051808303816000875af1158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b491906128a6565b6003555050565b3033146120da5760405162461bcd60e51b815260040161079990612904565b600655565b600080600a83815481106120f5576120f56128ee565b60009182526020909120600260089092020101549392505050565b6040518060c00160405280600081526020016000815260200160608152602001600081526020016000600281111561214a5761214a612339565b8152602001600081525090565b6000815180845260005b8181101561217d57602081850181015186830182015201612161565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006121b06020830184612157565b9392505050565b6000602082840312156121c957600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015612208578351835292840192918401916001016121ec565b50909695505050505050565b6000806040838503121561222757600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156122ea5761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d01526122ca828d0182612157565b9287015115159b87019b909b525098509589019591890191600101612291565b5050505060608901516080890152608089015160a089015260a0890151955061231760c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b6003811061236d57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b808310156123ce57835182529284019260019290920191908401906123ae565b5060608701516080870152608087015193506123ed60a087018561234f565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561244257612442612404565b604052919050565b60006001600160401b0382111561246357612463612404565b5060051b60200190565b6001600160a01b038116811461248257600080fd5b50565b600082601f83011261249657600080fd5b813560206124ab6124a68361244a565b61241a565b8083825260208201915060208460051b8701019350868411156124cd57600080fd5b602086015b848110156124f25780356124e58161246d565b83529183019183016124d2565b509695505050505050565b600082601f83011261250e57600080fd5b8135602061251e6124a68361244a565b8083825260208201915060208460051b87010193508684111561254057600080fd5b602086015b848110156124f25780358352918301918301612545565b600082601f83011261256d57600080fd5b81356001600160401b0381111561258657612586612404565b612599601f8201601f191660200161241a565b8181528460208386010111156125ae57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156125e357600080fd5b85356001600160401b03808211156125fa57600080fd5b61260689838a01612485565b9650602088013591508082111561261c57600080fd5b61262889838a016124fd565b9550604088013591508082111561263e57600080fd5b61264a89838a0161255c565b9450606088013591508082111561266057600080fd5b61266c89838a016124fd565b9350608088013591508082111561268257600080fd5b5061268f8882890161255c565b9150509295509295909350565b6000806000606084860312156126b157600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a081016126ea606083018561234f565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006127216080830185612157565b9050821515606083015295945050505050565b6000806040838503121561274757600080fd5b82356127528161246d565b915060208301356001600160401b0381111561276d57600080fd5b6127798582860161255c565b9150509250929050565b6000806040838503121561279657600080fd5b82356001600160401b03808211156127ad57600080fd5b6127b98683870161255c565b935060208501359150808211156127cf57600080fd5b506127798582860161255c565b600181811c908216806127f057607f821691505b60208210810361281057634e487b7160e01b600052602260045260246000fd5b50919050565b60008154612823816127dc565b808552602060018381168015612840576001811461285a57612888565b60ff1985168884015283151560051b880183019550612888565b866000528260002060005b858110156128805781548a8201860152908301908401612865565b890184019650505b505050505092915050565b6020815260006121b06020830184612816565b6000602082840312156128b857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156128e8576128e86128bf565b92915050565b634e487b7160e01b600052603260045260246000fd5b6020808252601a908201527f4f6e6c792074686520676f7665726e6f7220616c6c6f7765642e000000000000604082015260600190565b818103818111156128e8576128e86128bf565b6020808252601a908201527f5375626d697373696f6e2074696d652068617320656e6465642e000000000000604082015260600190565b601f8211156129d1576000816000526020600020601f850160051c810160208610156129ae5750805b601f850160051c820191505b818110156129cd578281556001016129ba565b5050505b505050565b81516001600160401b038111156129ef576129ef612404565b612a03816129fd84546127dc565b84612985565b602080601f831160018114612a385760008415612a205750858301515b600019600386901b1c1916600185901b1785556129cd565b600085815260208120601f198616915b82811015612a6757888601518255948401946001909101908401612a48565b5085821015612a855787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008154612aa2816127dc565b60018281168015612aba5760018114612acf57612afe565b60ff1984168752821515830287019450612afe565b8560005260208060002060005b85811015612af55781548a820152908401908201612adc565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b1681528260148201526000612b326034830184612a95565b95945050505050565b60006121b08284612a95565b600060018201612b5957612b596128bf565b5060010190565b828152604060208201526000612b796040830184612816565b949350505050565b600082612b9e57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b6060815260006060820152608060208201526000612bda6080830185612157565b8281036040840152612b32818561215756fea26469706673582212209c0c5fcddd41b1e2b82bb12b3932cc4e4e9cc6436b435232731efd8374c795a964736f6c63430008180033", - "deployedBytecode": "0x6080604052600436106101a75760003560e01c80639244c704116100e2578063b6dc775411610085578063b6dc77541461050e578063ba7079ca14610523578063bb0b86ff14610543578063c4bd851914610559578063c5d552881461056f578063cc2bcdb41461058f578063dc17bbdb146105af578063f730c07f146105cf57600080fd5b80639244c704146103dd578063953d6651146103f25780639c15d1a214610412578063a0af81f014610428578063a3c595c914610448578063ad73349e14610478578063b5125700146104d9578063b6cd08c6146104ee57600080fd5b8063402ff0db1161014a578063402ff0db146102d357806346047838146103005780636c0b7e71146103135780636cc6cde1146103285780636cf39c2b1461036057806377b9fda8146103805780637aa77f291461039657806383c4b7a3146103ac57600080fd5b80630c7ac7b6146101b35780631b1f5e7b146101de57806321cea5381461020157806322b52d661461022e578063246c76df1461024457806324baacc714610266578063311a6c56146102865780633e8686cc146102a657600080fd5b366101ae57005b600080fd5b3480156101bf57600080fd5b506101c86105e5565b6040516101d5919061219d565b60405180910390f35b3480156101ea57600080fd5b506101f3610673565b6040519081526020016101d5565b34801561020d57600080fd5b5061022161021c3660046121b7565b6106f8565b6040516101d591906121d0565b34801561023a57600080fd5b506101f360065481565b34801561025057600080fd5b5061026461025f3660046121b7565b61077a565b005b34801561027257600080fd5b506102646102813660046121b7565b6107a7565b34801561029257600080fd5b506102646102a1366004612214565b6107cb565b3480156102b257600080fd5b506102c66102c13660046121b7565b610a16565b6040516101d59190612236565b3480156102df57600080fd5b506102f36102ee3660046121b7565b610c11565b6040516101d59190612371565b61026461030e3660046125cb565b610cff565b34801561031f57600080fd5b506101f36113bf565b34801561033457600080fd5b50600054610348906001600160a01b031681565b6040516001600160a01b0390911681526020016101d5565b34801561036c57600080fd5b5061026461037b36600461269c565b6113d1565b34801561038c57600080fd5b506101f360095481565b3480156103a257600080fd5b506101f360035481565b3480156103b857600080fd5b506103cc6103c73660046121b7565b61160c565b6040516101d59594939291906126c8565b3480156103e957600080fd5b50610264611653565b3480156103fe57600080fd5b5061026461040d3660046121b7565b611a4b565b34801561041e57600080fd5b506101f360075481565b34801561043457600080fd5b50600254610348906001600160a01b031681565b34801561045457600080fd5b50610468610463366004612214565b611ae1565b6040516101d594939291906126fa565b34801561048457600080fd5b506104986104933660046121b7565b611bfb565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101d5565b3480156104e557600080fd5b506101f3611c57565b3480156104fa57600080fd5b50610264610509366004612214565b611c67565b34801561051a57600080fd5b50600a546101f3565b34801561052f57600080fd5b5061026461053e366004612734565b611f63565b34801561054f57600080fd5b506101f360045481565b34801561056557600080fd5b506101f360055481565b34801561057b57600080fd5b5061026461058a366004612783565b612020565b34801561059b57600080fd5b506102646105aa3660046121b7565b6120bb565b3480156105bb57600080fd5b506101f36105ca3660046121b7565b6120df565b3480156105db57600080fd5b506101f360085481565b600180546105f2906127dc565b80601f016020809104026020016040519081016040528092919081815260200182805461061e906127dc565b801561066b5780601f106106405761010080835404028352916020019161066b565b820191906000526020600020905b81548152906001019060200180831161064e57829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea9906106a590600190600401612893565b602060405180830381865afa1580156106c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e691906128a6565b6004546106f391906128d5565b905090565b60606000600b838154811061070f5761070f6128ee565b906000526020600020906006020190508060020180548060200260200160405190810160405280929190818152602001828054801561076d57602002820191906000526020600020905b815481526020019060010190808311610759575b5050505050915050919050565b3033146107a25760405162461bcd60e51b815260040161079990612904565b60405180910390fd5b600755565b3033146107c65760405162461bcd60e51b815260040161079990612904565b600455565b600b8054600091906107df9060019061293b565b815481106107ef576107ef6128ee565b600091825260208220915460069190910290910191506001600160a01b031633146108565760405162461bcd60e51b815260206004820152601760248201527613db9b1e48185c989a5d1c985d1bdc88185b1b1bddd959604a1b6044820152606401610799565b6001600482015460ff16600281111561087157610871612339565b146108ad5760405162461bcd60e51b815260206004820152600c60248201526b57726f6e672073746174757360a01b6044820152606401610799565b60028101548211156108fc5760405162461bcd60e51b8152602060048201526018602482015277293ab634b7339034b99037baba1037b3103137bab732399760411b6044820152606401610799565b8115610994576000600a6002830161091560018661293b565b81548110610925576109256128ee565b906000526020600020015481548110610940576109406128ee565b6000918252602082206005600890920201908101805460ff19166001179055426006820155805460038501546040519294506001600160a01b039091169281156108fc029290818181858888f15050505050505b8060030154600960008282546109aa919061293b565b90915550506000600382018190554260085560048201805460ff19166002179055828255600b805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a6c60405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600a8281548110610a7f57610a7f6128ee565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610bcb576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610b28906127dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b54906127dc565b8015610ba15780601f10610b7657610100808354040283529160200191610ba1565b820191906000526020600020905b815481529060010190602001808311610b8457829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610ad5565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610c19612110565b600b8281548110610c2c57610c2c6128ee565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610ca857602002820191906000526020600020905b815481526020019060010190808311610c94575b505050918352505060038201546020820152600482015460409091019060ff166002811115610cd957610cd9612339565b6002811115610cea57610cea612339565b81526020016005820154815250509050919050565b600b805460009190610d139060019061293b565b81548110610d2357610d236128ee565b906000526020600020906006020160050154905080600554610d4591906128d5565b600854610d52904261293b565b1115610d705760405162461bcd60e51b81526004016107999061294e565b8451865114610dc15760405162461bcd60e51b815260206004820152601d60248201527f57726f6e6720696e7075743a2074617267657420616e642076616c75650000006044820152606401610799565b8251865114610e125760405162461bcd60e51b815260206004820181905260248201527f57726f6e6720696e7075743a2074617267657420616e64206461746173697a656044820152606401610799565b600b805460009190610e269060019061293b565b81548110610e3657610e366128ee565b60009182526020808320600a8054600181018255945260089093027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610ec9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eed91906128a6565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610f2390600190600401612893565b602060405180830381865afa158015610f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6491906128a6565b600454610f7191906128d5565b60018201819055341015610fc75760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420656e6f7567682045544820746f20636f766572206465706f736974006044820152606401610799565b60008080805b8b518110156111d3576000898281518110610fea57610fea6128ee565b60200260200101516001600160401b0381111561100957611009612404565b6040519080825280601f01601f191660200182016040528015611033576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110611068576110686128ee565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d90849081106110a1576110a16128ee565b6020026020010151816001018190555060005b8b84815181106110c6576110c66128ee565b602002602001015181101561112c578c6110e082876128d5565b815181106110f0576110f06128ee565b602001015160f81c60f81b83828151811061110d5761110d6128ee565b60200101906001600160f81b031916908160001a9053506001016110b4565b506002810161113b83826129d6565b508a838151811061114e5761114e6128ee565b60200260200101518461116191906128d5565b8154600183015460405192965061118b926001600160a01b03909216916002850190602001612b08565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610fcd565b50600b54600c906000906111e99060019061293b565b81526020808201929092526040908101600090812086825290925290205460ff16156112505760405162461bcd60e51b8152602060048201526016602482015275131a5cdd08185b1c9958591e481cdd589b5a5d1d195960521b6044820152606401610799565b6001600c60006001600b80549050611268919061293b565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916112bc9084906128d5565b9091555050600a5460028601906112d59060019061293b565b8154600181810184556000938452602090932001556002860154900361130857600854611302904261293b565b60058601555b600b546113179060019061293b565b600a5433906113289060019061293b565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a604051611357919061219d565b60405180910390a46000846001015434611371919061293b565b9050801561139657604051339082156108fc029083906000818181858888f150505050505b8460010154600960008282546113ac91906128d5565b9091555050505050505050505050505050565b600b546000906106f39060019061293b565b6000600a84815481106113e6576113e66128ee565b60009182526020909120600890910201600581015490915060ff166114425760405162461bcd60e51b815260206004820152601260248201527114da1bdd5b1908189948185c1c1c9bdd995960721b6044820152606401610799565b600654816006015442611455919061293b565b11156114a35760405162461bcd60e51b815260206004820152601a60248201527f54696d6520746f206578656375746520686173207061737365640000000000006044820152606401610799565b825b6002820154811080156114c857508215806114c857506114c583856128d5565b81105b156116055760008260020182815481106114e4576114e46128ee565b9060005260206000209060040201905060006114fe611c57565b600383015490915060ff1615801561151a575080826001015411155b156115f057815460018301546040516000926001600160a01b03169190611545906002870190612b3b565b60006040518083038185875af1925050503d8060008114611582576040519150601f19603f3d011682016040523d82523d6000602084013e611587565b606091505b50909150508015156001036115ee57600383015460ff16156115de5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48195e1958dd5d195960821b6044820152606401610799565b60038301805460ff191660011790555b505b505080806115fd90612b47565b9150506114a5565b5050505050565b600b818154811061161c57600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600b8054600091906116679060019061293b565b81548110611677576116776128ee565b90600052602060002090600602016005015490508060055461169991906128d5565b6008546116a6904261293b565b116116f35760405162461bcd60e51b815260206004820152601e60248201527f417070726f76616c2074696d65206e6f742073746172746564207965742e00006044820152606401610799565b600b8054600091906117079060019061293b565b81548110611717576117176128ee565b6000918252602082206006909102019150600482015460ff16600281111561174157611741612339565b146117815760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48191a5cdc1d5d195960821b6044820152606401610799565b60028101546000036117ae5742600855600401805460ff1916600217905550600b80546001018155600052565b600281015460010361188a576000600a826002016000815481106117d4576117d46128ee565b9060005260206000200154815481106117ef576117ef6128ee565b6000918252602082206005600890920201908101805460ff1916600117905542600682015560038401805490839055815460405192945090926001600160a01b039091169183156108fc0291849190818181858888f150504260085550505060048301805460ff19166002179055600b8054600101815560009081526009805483929061187d90849061293b565b90915550611a4792505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926118cc9201612893565b602060405180830381865afa1580156118e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190d91906128a6565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e19184916119499190600190600401612b60565b60206040518083038185885af1158015611967573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061198c91906128a6565b6001830155600382015481106119a35760006119b3565b8082600301546119b3919061293b565b600383015560095481106119c85760006119d6565b806009546119d6919061293b565b600955600180830154600054600b5491926001600160a01b03909116917f8bd32f430ff060e6bd204709b3790c9807987263d3230c580dc80b5f89e2718691611a1e9161293b565b600354604051610a09929190918252602082015260606040820181905260009082015260800190565b5050565b303314611a6a5760405162461bcd60e51b815260040161079990612904565b600b805460009190611a7e9060019061293b565b81548110611a8e57611a8e6128ee565b906000526020600020906006020160050154905080600554611ab091906128d5565b600854611abd904261293b565b1115611adb5760405162461bcd60e51b81526004016107999061294e565b50600555565b6000806060600080600a8781548110611afc57611afc6128ee565b906000526020600020906008020190506000816002018781548110611b2357611b236128ee565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff909116908290611b68906127dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b94906127dc565b8015611be15780601f10611bb657610100808354040283529160200191611be1565b820191906000526020600020905b815481529060010190602001808311611bc457829003601f168201915b505050505091509550955095509550505092959194509250565b600a8181548110611c0b57600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600954476106f3919061293b565b600b805460009190611c7b9060019061293b565b81548110611c8b57611c8b6128ee565b906000526020600020906006020190506000600a826002018581548110611cb457611cb46128ee565b906000526020600020015481548110611ccf57611ccf6128ee565b906000526020600020906008020190506002600554611cee9190612b81565b600854611cfb904261293b565b1115611d435760405162461bcd60e51b815260206004820152601760248201527629b437bab6321031329034b7103334b939ba103430b63360491b6044820152606401610799565b82816003015414611d885760405162461bcd60e51b815260206004820152600f60248201526e0aee4dedcce40d8d2e6e840d0c2e6d608b1b6044820152606401610799565b80546001600160a01b03163314611de15760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79207375626d69747465722063616e20776974686472617700000000006044820152606401610799565b6007546004820154611df3904261293b565b1115611e415760405162461bcd60e51b815260206004820152601c60248201527f5769746864726177696e672074696d6520686173207061737365642e000000006044820152606401610799565b600282018054611e539060019061293b565b81548110611e6357611e636128ee565b9060005260206000200154826002018581548110611e8357611e836128ee565b6000918252602082200191909155600b54600c908290611ea59060019061293b565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611ee457611ee4612ba3565b600190038181906000526020600020016000905590558060010154826003016000828254611f12919061293b565b9091555050600181015460098054600090611f2e90849061293b565b90915550506001810154604051339180156108fc02916000818181858888f19350505050158015611605573d6000803e3d6000fd5b303314611f825760405162461bcd60e51b815260040161079990612904565b600b805460009190611f969060019061293b565b81548110611fa657611fa66128ee565b906000526020600020906006020160050154905080600554611fc891906128d5565b600854611fd5904261293b565b1115611ff35760405162461bcd60e51b81526004016107999061294e565b600080546001600160a01b0319166001600160a01b038516179055600161201a83826129d6565b50505050565b30331461203f5760405162461bcd60e51b815260040161079990612904565b6002546040516312a6505d60e21b81526001600160a01b0390911690634a994174906120719085908590600401612bb9565b6020604051808303816000875af1158015612090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b491906128a6565b6003555050565b3033146120da5760405162461bcd60e51b815260040161079990612904565b600655565b600080600a83815481106120f5576120f56128ee565b60009182526020909120600260089092020101549392505050565b6040518060c00160405280600081526020016000815260200160608152602001600081526020016000600281111561214a5761214a612339565b8152602001600081525090565b6000815180845260005b8181101561217d57602081850181015186830182015201612161565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006121b06020830184612157565b9392505050565b6000602082840312156121c957600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015612208578351835292840192918401916001016121ec565b50909695505050505050565b6000806040838503121561222757600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156122ea5761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d01526122ca828d0182612157565b9287015115159b87019b909b525098509589019591890191600101612291565b5050505060608901516080890152608089015160a089015260a0890151955061231760c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b6003811061236d57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b808310156123ce57835182529284019260019290920191908401906123ae565b5060608701516080870152608087015193506123ed60a087018561234f565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561244257612442612404565b604052919050565b60006001600160401b0382111561246357612463612404565b5060051b60200190565b6001600160a01b038116811461248257600080fd5b50565b600082601f83011261249657600080fd5b813560206124ab6124a68361244a565b61241a565b8083825260208201915060208460051b8701019350868411156124cd57600080fd5b602086015b848110156124f25780356124e58161246d565b83529183019183016124d2565b509695505050505050565b600082601f83011261250e57600080fd5b8135602061251e6124a68361244a565b8083825260208201915060208460051b87010193508684111561254057600080fd5b602086015b848110156124f25780358352918301918301612545565b600082601f83011261256d57600080fd5b81356001600160401b0381111561258657612586612404565b612599601f8201601f191660200161241a565b8181528460208386010111156125ae57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156125e357600080fd5b85356001600160401b03808211156125fa57600080fd5b61260689838a01612485565b9650602088013591508082111561261c57600080fd5b61262889838a016124fd565b9550604088013591508082111561263e57600080fd5b61264a89838a0161255c565b9450606088013591508082111561266057600080fd5b61266c89838a016124fd565b9350608088013591508082111561268257600080fd5b5061268f8882890161255c565b9150509295509295909350565b6000806000606084860312156126b157600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a081016126ea606083018561234f565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006127216080830185612157565b9050821515606083015295945050505050565b6000806040838503121561274757600080fd5b82356127528161246d565b915060208301356001600160401b0381111561276d57600080fd5b6127798582860161255c565b9150509250929050565b6000806040838503121561279657600080fd5b82356001600160401b03808211156127ad57600080fd5b6127b98683870161255c565b935060208501359150808211156127cf57600080fd5b506127798582860161255c565b600181811c908216806127f057607f821691505b60208210810361281057634e487b7160e01b600052602260045260246000fd5b50919050565b60008154612823816127dc565b808552602060018381168015612840576001811461285a57612888565b60ff1985168884015283151560051b880183019550612888565b866000528260002060005b858110156128805781548a8201860152908301908401612865565b890184019650505b505050505092915050565b6020815260006121b06020830184612816565b6000602082840312156128b857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156128e8576128e86128bf565b92915050565b634e487b7160e01b600052603260045260246000fd5b6020808252601a908201527f4f6e6c792074686520676f7665726e6f7220616c6c6f7765642e000000000000604082015260600190565b818103818111156128e8576128e86128bf565b6020808252601a908201527f5375626d697373696f6e2074696d652068617320656e6465642e000000000000604082015260600190565b601f8211156129d1576000816000526020600020601f850160051c810160208610156129ae5750805b601f850160051c820191505b818110156129cd578281556001016129ba565b5050505b505050565b81516001600160401b038111156129ef576129ef612404565b612a03816129fd84546127dc565b84612985565b602080601f831160018114612a385760008415612a205750858301515b600019600386901b1c1916600185901b1785556129cd565b600085815260208120601f198616915b82811015612a6757888601518255948401946001909101908401612a48565b5085821015612a855787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008154612aa2816127dc565b60018281168015612aba5760018114612acf57612afe565b60ff1984168752821515830287019450612afe565b8560005260208060002060005b85811015612af55781548a820152908401908201612adc565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b1681528260148201526000612b326034830184612a95565b95945050505050565b60006121b08284612a95565b600060018201612b5957612b596128bf565b5060010190565b828152604060208201526000612b796040830184612816565b949350505050565b600082612b9e57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b6060815260006060820152608060208201526000612bda6080830185612157565b8281036040840152612b32818561215756fea26469706673582212209c0c5fcddd41b1e2b82bb12b3932cc4e4e9cc6436b435232731efd8374c795a964736f6c63430008180033", + "numDeployments": 18, + "solcInputHash": "334f9bb4703835bd27add7ada7992ca0", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_arbitratorExtraData\",\"type\":\"bytes\"},{\"internalType\":\"contract IDisputeTemplateRegistry\",\"name\":\"_templateRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_templateData\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_templateDataMappings\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_submissionBaseDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_submissionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_executionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_withdrawTimeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_wNative\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyDisputed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalTimeNotStarted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientDeposit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ListAlreadySubmitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotDisputed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyArbitratorAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySubmitterCanWithdraw\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerOnly\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RulingOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ShouldOnlyWithdrawInFirstHalf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubmissionNotApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubmissionTimeHasEnded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TimeToExecuteHasPassed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WithdrawingTimeHasPassed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongInputTargetAndDatasize\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongInputTargetAndValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongListHash\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_arbitratorDisputeID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_templateId\",\"type\":\"uint256\"}],\"name\":\"DisputeRequest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_submitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_session\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"}],\"name\":\"ListSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_disputeID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_ruling\",\"type\":\"uint256\"}],\"name\":\"Ruling\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"arbitrator\",\"outputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"arbitratorExtraData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_arbitratorExtraData\",\"type\":\"bytes\"}],\"name\":\"changeArbitrator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_templateData\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_templateDataMappings\",\"type\":\"string\"}],\"name\":\"changeDisputeTemplate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_executionTimeout\",\"type\":\"uint256\"}],\"name\":\"changeExecutionTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionBaseDeposit\",\"type\":\"uint256\"}],\"name\":\"changeSubmissionDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionTimeout\",\"type\":\"uint256\"}],\"name\":\"changeSubmissionTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_withdrawTimeout\",\"type\":\"uint256\"}],\"name\":\"changeWithdrawTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executeSubmissions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_cursor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"executeTransactionList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentSessionNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpendableFunds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumberOfCreatedLists\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"}],\"name\":\"getNumberOfTransactions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"txCount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_sessionIndex\",\"type\":\"uint256\"}],\"name\":\"getSession\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"ruling\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"disputeID\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"submittedLists\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"sumDeposit\",\"type\":\"uint256\"},{\"internalType\":\"enum KlerosGovernor.Status\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"durationOffset\",\"type\":\"uint256\"}],\"internalType\":\"struct KlerosGovernor.Session\",\"name\":\"_session\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listId\",\"type\":\"uint256\"}],\"name\":\"getSubmission\",\"outputs\":[{\"components\":[{\"internalType\":\"address payable\",\"name\":\"submitter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"executed\",\"type\":\"bool\"}],\"internalType\":\"struct KlerosGovernor.Transaction[]\",\"name\":\"txs\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes32\",\"name\":\"listHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"submissionTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"approvalTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"submissionBlock\",\"type\":\"uint256\"}],\"internalType\":\"struct KlerosGovernor.Submission\",\"name\":\"submission\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_session\",\"type\":\"uint256\"}],\"name\":\"getSubmittedLists\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"submittedLists\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalSubmissionDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_requiredDeposit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_transactionIndex\",\"type\":\"uint256\"}],\"name\":\"getTransactionInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"executed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastApprovalTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reservedETH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_disputeID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ruling\",\"type\":\"uint256\"}],\"name\":\"rule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"sessions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ruling\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"disputeID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sumDeposit\",\"type\":\"uint256\"},{\"internalType\":\"enum KlerosGovernor.Status\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"durationOffset\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"submissionBaseDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"submissionTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"submissions\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"submitter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"listHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"submissionTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"approvalTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"submissionBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_target\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_value\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"uint256[]\",\"name\":\"_dataSize\",\"type\":\"uint256[]\"},{\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"}],\"name\":\"submitList\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"templateId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"templateRegistry\",\"outputs\":[{\"internalType\":\"contract IDisputeTemplateRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wNative\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionID\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_listHash\",\"type\":\"bytes32\"}],\"name\":\"withdrawTransactionList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"Appeal and evidence submission is handled by the court.\",\"events\":{\"DisputeRequest(address,uint256,uint256)\":{\"params\":{\"_arbitrator\":\"The arbitrator of the contract.\",\"_arbitratorDisputeID\":\"The identifier of the dispute in the Arbitrator contract.\",\"_templateId\":\"The identifier of the dispute template.\"}},\"ListSubmitted(uint256,address,uint256,string)\":{\"params\":{\"_description\":\"The string in CSV format that contains labels of list's transactions. Note that the submitter may give bad descriptions of correct actions, but this is to be seen as UI enhancement, not a critical feature and that would play against him in case of dispute.\",\"_listID\":\"The index of the transaction list in the array of lists.\",\"_session\":\"The number of the current session.\",\"_submitter\":\"The address that submitted the list.\"}},\"Ruling(address,uint256,uint256)\":{\"params\":{\"_arbitrator\":\"The arbitrator giving the ruling.\",\"_disputeID\":\"The identifier of the dispute in the Arbitrator contract.\",\"_ruling\":\"The ruling which was given.\"}}},\"kind\":\"dev\",\"methods\":{\"changeArbitrator(address,bytes)\":{\"details\":\"It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract.\",\"params\":{\"_arbitrator\":\"The new trusted arbitrator.\",\"_arbitratorExtraData\":\"The extra data used by the new arbitrator.\"}},\"changeDisputeTemplate(string,string)\":{\"params\":{\"_templateData\":\"The new dispute template data.\",\"_templateDataMappings\":\"The new dispute template data mappings.\"}},\"changeExecutionTimeout(uint256)\":{\"params\":{\"_executionTimeout\":\"The new duration of the execution timeout, in seconds.\"}},\"changeSubmissionDeposit(uint256)\":{\"params\":{\"_submissionBaseDeposit\":\"The new value of the base deposit, in wei.\"}},\"changeSubmissionTimeout(uint256)\":{\"details\":\"It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract and prolonging submission timeout might switch it back to submission period.\",\"params\":{\"_submissionTimeout\":\"The new duration of the submission period, in seconds.\"}},\"changeWithdrawTimeout(uint256)\":{\"params\":{\"_withdrawTimeout\":\"The new duration of withdraw period, in seconds.\"}},\"constructor\":{\"params\":{\"_arbitrator\":\"The arbitrator of the contract.\",\"_arbitratorExtraData\":\"Extra data for the arbitrator.\",\"_executionTimeout\":\"Time in seconds after approval that allows to execute transactions of the approved list.\",\"_submissionBaseDeposit\":\"The base deposit required for submission.\",\"_submissionTimeout\":\"Time in seconds allocated for submitting transaction list.\",\"_templateData\":\"The dispute template data.\",\"_templateDataMappings\":\"The dispute template data mappings.\",\"_templateRegistry\":\"Dispute Template registry address\",\"_wNative\":\"The wrapped native token address, typically wETH.\",\"_withdrawTimeout\":\"Time in seconds after submission that allows to withdraw submitted list.\"}},\"executeSubmissions()\":{\"details\":\"If nothing was submitted changes session.\"},\"executeTransactionList(uint256,uint256,uint256)\":{\"params\":{\"_count\":\"Number of transactions to execute. Executes until the end if set to \\\"0\\\" or number higher than number of transactions in the list.\",\"_cursor\":\"Index of the transaction from which to start executing.\",\"_listID\":\"The index of the transaction list in the array of lists.\"}},\"getCurrentSessionNumber()\":{\"returns\":{\"_0\":\"The number of the ongoing session.\"}},\"getExpendableFunds()\":{\"returns\":{\"_0\":\"Contract balance without reserved ETH.\"}},\"getNumberOfCreatedLists()\":{\"returns\":{\"_0\":\"The number of created lists.\"}},\"getNumberOfTransactions(uint256)\":{\"params\":{\"_listID\":\"The index of the transaction list in the array of lists.\"},\"returns\":{\"txCount\":\"The number of transactions in the list.\"}},\"getSession(uint256)\":{\"returns\":{\"_session\":\"The session info.\"}},\"getSubmission(uint256)\":{\"params\":{\"_listId\":\"The index of the transaction list in the array of lists.\"},\"returns\":{\"submission\":\"List belonging to that listId.\"}},\"getSubmittedLists(uint256)\":{\"details\":\"This function is O(n), where `n` is the number of submissions in the session. This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts.\",\"params\":{\"_session\":\"The ID of the session.\"},\"returns\":{\"submittedLists\":\"Indexes of lists that were submitted during the session.\"}},\"getTotalSubmissionDeposit()\":{\"returns\":{\"_requiredDeposit\":\"required deposit value\"}},\"getTransactionInfo(uint256,uint256)\":{\"params\":{\"_listID\":\"The index of the transaction list in the array of lists.\",\"_transactionIndex\":\"The index of the transaction.\"},\"returns\":{\"data\":\"The data of the transaction.\",\"executed\":\"Whether the transaction was executed or not.\",\"target\":\"The target of the transaction.\",\"value\":\"The value of the transaction.\"}},\"rule(uint256,uint256)\":{\"details\":\"Must be called by the arbitrator.\",\"params\":{\"_disputeID\":\"ID of the dispute in the Arbitrator contract.\",\"_ruling\":\"Ruling given by the arbitrator. Note that 0 is reserved for \\\"Refuse to arbitrate\\\". Note If the final ruling is \\\"0\\\" nothing is approved and deposits will stay locked in the contract.\"}},\"submitList(address[],uint256[],bytes,uint256[],string)\":{\"params\":{\"_data\":\"Concatenated calldata of all transactions of this list.\",\"_dataSize\":\"List of lengths in bytes required to split calldata for its respective targets.\",\"_description\":\"String in CSV format that describes list's transactions.\",\"_target\":\"List of addresses to call.\",\"_value\":\"List of values required for respective addresses.\"}},\"withdrawTransactionList(uint256,bytes32)\":{\"details\":\"Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made.\",\"params\":{\"_listHash\":\"Hash of a withdrawing list.\",\"_submissionID\":\"Submission's index in the array of submitted lists of the current session.\"}}},\"title\":\"KlerosGovernor for V2.\",\"version\":1},\"userdoc\":{\"events\":{\"DisputeRequest(address,uint256,uint256)\":{\"notice\":\"To be emitted when a dispute is created to link the correct template to the disputeID.\"},\"ListSubmitted(uint256,address,uint256,string)\":{\"notice\":\"Emitted when a new list is submitted.\"},\"Ruling(address,uint256,uint256)\":{\"notice\":\"To be raised when a ruling is given.\"}},\"kind\":\"user\",\"methods\":{\"changeArbitrator(address,bytes)\":{\"notice\":\"Changes the arbitrator of the contract.\"},\"changeDisputeTemplate(string,string)\":{\"notice\":\"Update the dispute template data.\"},\"changeExecutionTimeout(uint256)\":{\"notice\":\"Changes the time allocated for list's execution.\"},\"changeSubmissionDeposit(uint256)\":{\"notice\":\"Changes the value of the base deposit required for submitting a list.\"},\"changeSubmissionTimeout(uint256)\":{\"notice\":\"Changes the time allocated for submission.\"},\"changeWithdrawTimeout(uint256)\":{\"notice\":\"Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period.\"},\"constructor\":{\"notice\":\"Constructor.\"},\"executeSubmissions()\":{\"notice\":\"Approves a transaction list or creates a dispute if more than one list was submitted.\"},\"executeTransactionList(uint256,uint256,uint256)\":{\"notice\":\"Executes selected transactions of the list.\"},\"getCurrentSessionNumber()\":{\"notice\":\"Gets the number of the ongoing session.\"},\"getExpendableFunds()\":{\"notice\":\"Gets the sum of contract funds that are used for the execution of transactions.\"},\"getNumberOfCreatedLists()\":{\"notice\":\"Gets the number of lists created in contract's lifetime.\"},\"getNumberOfTransactions(uint256)\":{\"notice\":\"Gets the number of transactions in the list.\"},\"getSession(uint256)\":{\"notice\":\"Gets the session from the session index.\"},\"getSubmission(uint256)\":{\"notice\":\"Gets the submission from listId.\"},\"getSubmittedLists(uint256)\":{\"notice\":\"Gets the array of submitted lists in the session.\"},\"getTotalSubmissionDeposit()\":{\"notice\":\"Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost).\"},\"getTransactionInfo(uint256,uint256)\":{\"notice\":\"Gets the info of the specific transaction in the specific list.\"},\"rule(uint256,uint256)\":{\"notice\":\"Gives a ruling for a dispute.\"},\"submitList(address[],uint256[],bytes,uint256[],string)\":{\"notice\":\"Creates transaction list based on input parameters and submits it for potential approval and execution.\"},\"withdrawTransactionList(uint256,bytes32)\":{\"notice\":\"Withdraws submitted transaction list. Reimburses submission deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KlerosGovernor.sol\":\"KlerosGovernor\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[]},\"sources\":{\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport {IArbitratorV2} from \\\"./IArbitratorV2.sol\\\";\\n\\n/// @title IArbitrableV2\\n/// @notice Arbitrable interface.\\n/// @dev When developing arbitrable contracts, we need to:\\n/// - Define the action taken when a ruling is received by the contract.\\n/// - Allow dispute creation which calls `arbitrator.createDispute{value: _fee}(_choices,_extraData)`.\\ninterface IArbitrableV2 {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a dispute is created to link the correct template to the disputeID.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorDisputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _templateId The identifier of the dispute template.\\n event DisputeRequest(IArbitratorV2 indexed _arbitrator, uint256 indexed _arbitratorDisputeID, uint256 _templateId);\\n\\n /// @notice To be raised when a ruling is given.\\n /// @param _arbitrator The arbitrator giving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitratorV2 indexed _arbitrator, uint256 indexed _disputeID, uint256 _ruling);\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Give a ruling for a dispute.\\n ///\\n /// @dev This is a callback function for the arbitrator to provide the ruling to this contract.\\n /// Only the arbitrator must be allowed to call this function.\\n /// Ruling 0 is reserved for \\\"Not able/wanting to make a decision\\\".\\n ///\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator.\\n function rule(uint256 _disputeID, uint256 _ruling) external;\\n}\\n\",\"keccak256\":\"0x97c6455e4b9f57e76f338f43eea612ea47ac933dda85c08ef29d418e34879a9b\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitratorV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport {IArbitrableV2} from \\\"./IArbitrableV2.sol\\\";\\n\\n/// @title Arbitrator\\n/// @notice Arbitrator interface for the Kleros V2 protocol.\\n/// @dev Unlike the ERC-792 this standard is not concerned with appeals, so each arbitrator can implement an appeal system that suits it the most.\\ninterface IArbitratorV2 {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a dispute is created.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _arbitrable The contract which created the dispute.\\n event DisputeCreation(uint256 indexed _disputeID, IArbitrableV2 indexed _arbitrable);\\n\\n /// @notice To be raised when a ruling is given.\\n /// @param _arbitrable The arbitrable receiving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitrableV2 indexed _arbitrable, uint256 indexed _disputeID, uint256 _ruling);\\n\\n /// @notice To be emitted when an ERC20 token is added or removed as a method to pay fees.\\n /// @param _token The ERC20 token.\\n /// @param _accepted Whether the token is accepted or not.\\n event AcceptedFeeToken(IERC20 indexed _token, bool indexed _accepted);\\n\\n /// @notice To be emitted when the fee for a particular ERC20 token is updated.\\n /// @param _feeToken The ERC20 token.\\n /// @param _rateInEth The new rate of the fee token in ETH.\\n /// @param _rateDecimals The new decimals of the fee token rate.\\n event NewCurrencyRate(IERC20 indexed _feeToken, uint64 _rateInEth, uint8 _rateDecimals);\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Create a dispute and pay for the fees in the native currency, typically ETH.\\n /// @dev Must be called by the arbitrable contract and pay at least `arbitrationCost(_extraData)` in ETH.\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData\\n ) external payable returns (uint256 disputeID);\\n\\n /// @notice Create a dispute and pay for the fees in a supported ERC20 token.\\n /// @dev Must be called by the arbitrable contract and pay at least `arbitrationCost(_extraData, _feeToken)` in the supported ERC20 token.\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @param _feeAmount Amount of the ERC20 token used to pay fees.\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData,\\n IERC20 _feeToken,\\n uint256 _feeAmount\\n ) external returns (uint256 disputeID);\\n\\n // ************************************* //\\n // * Public Views * //\\n // ************************************* //\\n\\n /// @notice Compute the cost of arbitration denominated in the native currency, typically ETH.\\n /// @dev It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return cost The arbitration cost in ETH.\\n function arbitrationCost(bytes calldata _extraData) external view returns (uint256 cost);\\n\\n /// @notice Compute the cost of arbitration denominated in `_feeToken`.\\n /// @dev It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @return cost The arbitration cost in `_feeToken`.\\n function arbitrationCost(bytes calldata _extraData, IERC20 _feeToken) external view returns (uint256 cost);\\n\\n /// @notice Gets the current ruling of a specified dispute.\\n /// @param _disputeID The ID of the dispute.\\n /// @return ruling The current ruling.\\n /// @return tied Whether it's a tie or not.\\n /// @return overridden Whether the ruling was overridden by appeal funding or not.\\n function currentRuling(uint256 _disputeID) external view returns (uint256 ruling, bool tied, bool overridden);\\n}\\n\",\"keccak256\":\"0x1f4e84e23034f3a291e305e8c69f283c9c97354a49a24f8c02ca366b3eaae00f\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\n/// @title IDisputeTemplateRegistry\\n/// @notice Dispute Template Registry interface.\\ninterface IDisputeTemplateRegistry {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a new dispute template is created.\\n /// @param _templateId The identifier of the dispute template.\\n /// @param _templateTag An optional tag for the dispute template, such as \\\"registration\\\" or \\\"removal\\\".\\n /// @param _templateData The template data.\\n /// @param _templateDataMappings The data mappings.\\n event DisputeTemplate(\\n uint256 indexed _templateId,\\n string indexed _templateTag,\\n string _templateData,\\n string _templateDataMappings\\n );\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Registers a new dispute template.\\n /// @param _templateTag An optional tag for the dispute template, such as \\\"registration\\\" or \\\"removal\\\".\\n /// @param _templateData The template data.\\n /// @param _templateDataMappings The data mappings for the template.\\n /// @return templateId The identifier of the dispute template.\\n function setDisputeTemplate(\\n string memory _templateTag,\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external returns (uint256 templateId);\\n}\\n\",\"keccak256\":\"0x1d6ad6549baabcbfe306ac3a9a3c339bb2d5dcb67fa9f3c5eaed0c9bd3548b12\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\"},\"src/KlerosGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.24;\\n\\nimport {IArbitrableV2, IArbitratorV2} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\\\";\\nimport \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\\\";\\nimport {SafeSend} from \\\"./libraries/SafeSend.sol\\\";\\nimport \\\"./interfaces/IArbSys.sol\\\";\\n\\n/// @title KlerosGovernor for V2.\\n/// @dev Appeal and evidence submission is handled by the court.\\ncontract KlerosGovernor is IArbitrableV2 {\\n using SafeSend for address payable;\\n\\n // ************************************* //\\n // * Enums / Structs * //\\n // ************************************* //\\n\\n enum Status {\\n NoDispute,\\n DisputeCreated,\\n Resolved\\n }\\n\\n struct Session {\\n uint256 ruling; // The ruling that was given in this session, if any.\\n uint256 disputeID; // ID given to the dispute of the session, if any.\\n uint256[] submittedLists; // Tracks all lists that were submitted in a session in the form submittedLists[submissionID].\\n uint256 sumDeposit; // Sum of all submission deposits in a session (minus arbitration fees). This is used to calculate the reward.\\n Status status; // Status of a session.\\n uint256 durationOffset; // Time in seconds that prolongs the submission period after the first submission, to give other submitters time to react.\\n }\\n\\n struct Transaction {\\n address target; // The address to call.\\n uint256 value; // Value paid by governor contract that will be used as msg.value in the execution.\\n bytes data; // Calldata of the transaction.\\n bool executed; // Whether the transaction was already executed or not.\\n }\\n\\n struct Submission {\\n address payable submitter; // The one who submits the list.\\n uint256 deposit; // Value of the deposit paid upon submission of the list.\\n Transaction[] txs; // Transactions stored in the list in the form txs[_transactionIndex].\\n bytes32 listHash; // A hash chain of all transactions stored in the list. This is used as a unique identifier within a session.\\n uint256 submissionTime; // The time when the list was submitted.\\n bool approved; // Whether the list was approved for execution or not.\\n uint256 approvalTime; // The time when the list was approved.\\n uint256 submissionBlock; // Block of list submission.\\n }\\n\\n ArbSys constant arbSys = ArbSys(address(100)); // ArbSys implementation https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference#arbsys\\n IArbitratorV2 public arbitrator; // Arbitrator contract.\\n bytes public arbitratorExtraData; // Extra data for arbitrator.\\n address public wNative; // The wrapped native token for safeSend().\\n IDisputeTemplateRegistry public templateRegistry; // The dispute template registry.\\n uint256 public templateId; // The current dispute template identifier.\\n\\n uint256 public submissionBaseDeposit; // The base deposit in wei that needs to be paid in order to submit the list.\\n uint256 public submissionTimeout; // Time in seconds allowed for submitting the lists. Once it's passed the contract enters the approval period.\\n uint256 public executionTimeout; // Time in seconds allowed for the execution of approved lists.\\n uint256 public withdrawTimeout; // Time in seconds allowed to withdraw a submitted list.\\n\\n uint256 public lastApprovalTime; // The time of the last approval of a transaction list.\\n uint256 public reservedETH; // Sum of contract's submission deposits. These funds are not to be used in the execution of transactions.\\n\\n Submission[] public submissions; // Stores all created transaction lists. submissions[_listID].\\n Session[] public sessions; // Stores all submitting sessions. sessions[_session].\\n mapping(uint256 sessionIndex => mapping(bytes32 listHash => bool)) alreadySubmitted; // Indicates whether or not the transaction list was already submitted in order to catch duplicates in the form alreadySubmitted[listHash].\\n\\n // ************************************* //\\n // * Function Modifiers * //\\n // ************************************* //\\n\\n modifier duringSubmissionPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n if (block.timestamp - lastApprovalTime > submissionTimeout + offset) revert SubmissionTimeHasEnded();\\n _;\\n }\\n\\n modifier duringApprovalPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n if (block.timestamp - lastApprovalTime <= submissionTimeout + offset) revert ApprovalTimeNotStarted();\\n _;\\n }\\n\\n modifier onlyByOwner() {\\n if (address(this) != msg.sender) revert OwnerOnly();\\n _;\\n }\\n\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice Emitted when a new list is submitted.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _submitter The address that submitted the list.\\n /// @param _session The number of the current session.\\n /// @param _description The string in CSV format that contains labels of list's transactions.\\n /// Note that the submitter may give bad descriptions of correct actions, but this is to be seen as UI enhancement, not a critical feature and that would play against him in case of dispute.\\n event ListSubmitted(\\n uint256 indexed _listID,\\n address indexed _submitter,\\n uint256 indexed _session,\\n string _description\\n );\\n\\n // ************************************* //\\n // * Constructor * //\\n // ************************************* //\\n\\n /// @notice Constructor.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorExtraData Extra data for the arbitrator.\\n /// @param _templateRegistry Dispute Template registry address\\n /// @param _templateData The dispute template data.\\n /// @param _templateDataMappings The dispute template data mappings.\\n /// @param _submissionBaseDeposit The base deposit required for submission.\\n /// @param _submissionTimeout Time in seconds allocated for submitting transaction list.\\n /// @param _executionTimeout Time in seconds after approval that allows to execute transactions of the approved list.\\n /// @param _withdrawTimeout Time in seconds after submission that allows to withdraw submitted list.\\n /// @param _wNative The wrapped native token address, typically wETH.\\n constructor(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData,\\n IDisputeTemplateRegistry _templateRegistry,\\n string memory _templateData,\\n string memory _templateDataMappings,\\n uint256 _submissionBaseDeposit,\\n uint256 _submissionTimeout,\\n uint256 _executionTimeout,\\n uint256 _withdrawTimeout,\\n address _wNative\\n ) {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n wNative = _wNative;\\n\\n lastApprovalTime = block.timestamp;\\n submissionBaseDeposit = _submissionBaseDeposit;\\n submissionTimeout = _submissionTimeout;\\n executionTimeout = _executionTimeout;\\n withdrawTimeout = _withdrawTimeout;\\n sessions.push();\\n submissions.push();\\n\\n templateRegistry = _templateRegistry;\\n templateId = IDisputeTemplateRegistry(templateRegistry).setDisputeTemplate(\\n \\\"\\\",\\n _templateData,\\n _templateDataMappings\\n );\\n }\\n\\n // ************************************* //\\n // * Governance * //\\n // ************************************* //\\n\\n /// @notice Changes the value of the base deposit required for submitting a list.\\n /// @param _submissionBaseDeposit The new value of the base deposit, in wei.\\n function changeSubmissionDeposit(uint256 _submissionBaseDeposit) external onlyByOwner {\\n submissionBaseDeposit = _submissionBaseDeposit;\\n }\\n\\n /// @notice Changes the time allocated for submission.\\n /// @dev It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract\\n /// and prolonging submission timeout might switch it back to submission period.\\n /// @param _submissionTimeout The new duration of the submission period, in seconds.\\n function changeSubmissionTimeout(uint256 _submissionTimeout) external onlyByOwner duringSubmissionPeriod {\\n submissionTimeout = _submissionTimeout;\\n }\\n\\n /// @notice Changes the time allocated for list's execution.\\n /// @param _executionTimeout The new duration of the execution timeout, in seconds.\\n function changeExecutionTimeout(uint256 _executionTimeout) external onlyByOwner {\\n executionTimeout = _executionTimeout;\\n }\\n\\n /// @notice Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period.\\n /// @param _withdrawTimeout The new duration of withdraw period, in seconds.\\n function changeWithdrawTimeout(uint256 _withdrawTimeout) external onlyByOwner {\\n withdrawTimeout = _withdrawTimeout;\\n }\\n\\n /// @notice Changes the arbitrator of the contract.\\n /// @dev It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract.\\n /// @param _arbitrator The new trusted arbitrator.\\n /// @param _arbitratorExtraData The extra data used by the new arbitrator.\\n function changeArbitrator(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData\\n ) external onlyByOwner duringSubmissionPeriod {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n }\\n\\n /// @notice Update the dispute template data.\\n /// @param _templateData The new dispute template data.\\n /// @param _templateDataMappings The new dispute template data mappings.\\n function changeDisputeTemplate(\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external onlyByOwner {\\n templateId = templateRegistry.setDisputeTemplate(\\\"\\\", _templateData, _templateDataMappings);\\n }\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Creates transaction list based on input parameters and submits it for potential approval and execution.\\n /// @param _target List of addresses to call.\\n /// @param _value List of values required for respective addresses.\\n /// @param _data Concatenated calldata of all transactions of this list.\\n /// @param _dataSize List of lengths in bytes required to split calldata for its respective targets.\\n /// @param _description String in CSV format that describes list's transactions.\\n function submitList(\\n address[] memory _target,\\n uint256[] memory _value,\\n bytes memory _data,\\n uint256[] memory _dataSize,\\n string memory _description\\n ) external payable duringSubmissionPeriod {\\n if (_target.length != _value.length) revert WrongInputTargetAndValue();\\n if (_target.length != _dataSize.length) revert WrongInputTargetAndDatasize();\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions.push();\\n submission.submitter = payable(msg.sender);\\n\\n // https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/block-numbers-and-time\\n submission.submissionBlock = arbSys.arbBlockNumber();\\n\\n // Do the assignment first to avoid creating a new variable and bypass a 'stack too deep' error.\\n submission.deposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n if (msg.value < submission.deposit) revert InsufficientDeposit();\\n\\n bytes32 listHash;\\n bytes32 currentTxHash;\\n uint256 readingPosition;\\n for (uint256 i = 0; i < _target.length; i++) {\\n bytes memory readData = new bytes(_dataSize[i]);\\n Transaction storage transaction = submission.txs.push();\\n transaction.target = _target[i];\\n transaction.value = _value[i];\\n for (uint256 j = 0; j < _dataSize[i]; j++) {\\n readData[j] = _data[readingPosition + j];\\n }\\n transaction.data = readData;\\n readingPosition += _dataSize[i];\\n currentTxHash = keccak256(abi.encodePacked(transaction.target, transaction.value, transaction.data));\\n listHash = keccak256(abi.encodePacked(currentTxHash, listHash));\\n }\\n if (!alreadySubmitted[sessions.length - 1][listHash]) revert ListAlreadySubmitted();\\n alreadySubmitted[sessions.length - 1][listHash] = true;\\n submission.listHash = listHash;\\n submission.submissionTime = block.timestamp;\\n session.sumDeposit += submission.deposit;\\n session.submittedLists.push(submissions.length - 1);\\n if (session.submittedLists.length == 1) session.durationOffset = block.timestamp - lastApprovalTime;\\n\\n emit ListSubmitted(submissions.length - 1, msg.sender, sessions.length - 1, _description);\\n\\n uint256 remainder = msg.value - submission.deposit;\\n if (remainder > 0) payable(msg.sender).safeSend(remainder, wNative);\\n\\n reservedETH += submission.deposit;\\n }\\n\\n /// @notice Withdraws submitted transaction list. Reimburses submission deposit.\\n /// @dev Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made.\\n /// @param _submissionID Submission's index in the array of submitted lists of the current session.\\n /// @param _listHash Hash of a withdrawing list.\\n function withdrawTransactionList(uint256 _submissionID, bytes32 _listHash) external {\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions[session.submittedLists[_submissionID]];\\n if (block.timestamp - lastApprovalTime > submissionTimeout / 2) revert ShouldOnlyWithdrawInFirstHalf();\\n // This is an extra check to prevent _submissionID linking to the wrong list because of index swap during withdrawal.\\n if (submission.listHash != _listHash) revert WrongListHash();\\n if (submission.submitter != msg.sender) revert OnlySubmitterCanWithdraw();\\n if (block.timestamp - submission.submissionTime > withdrawTimeout) revert WithdrawingTimeHasPassed();\\n session.submittedLists[_submissionID] = session.submittedLists[session.submittedLists.length - 1];\\n alreadySubmitted[sessions.length - 1][_listHash] = false;\\n session.submittedLists.pop();\\n session.sumDeposit -= submission.deposit;\\n reservedETH -= submission.deposit;\\n payable(msg.sender).transfer(submission.deposit);\\n }\\n\\n /// @notice Approves a transaction list or creates a dispute if more than one list was submitted.\\n /// @dev If nothing was submitted changes session.\\n function executeSubmissions() external duringApprovalPeriod {\\n Session storage session = sessions[sessions.length - 1];\\n if (session.status != Status.NoDispute) revert AlreadyDisputed();\\n if (session.submittedLists.length == 0) {\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n } else if (session.submittedLists.length == 1) {\\n Submission storage submission = submissions[session.submittedLists[0]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n uint256 sumDeposit = session.sumDeposit;\\n session.sumDeposit = 0;\\n submission.submitter.safeSend(sumDeposit, wNative);\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n\\n reservedETH -= sumDeposit;\\n } else {\\n session.status = Status.DisputeCreated;\\n uint256 arbitrationCost = arbitrator.arbitrationCost(arbitratorExtraData);\\n session.disputeID = arbitrator.createDispute{value: arbitrationCost}(\\n session.submittedLists.length,\\n arbitratorExtraData\\n );\\n // Check in case arbitration cost increased after the submission. It's unlikely that its increase won't be covered by the base deposit, but technically possible.\\n session.sumDeposit = session.sumDeposit > arbitrationCost ? session.sumDeposit - arbitrationCost : 0;\\n reservedETH = reservedETH > arbitrationCost ? reservedETH - arbitrationCost : 0;\\n emit DisputeRequest(arbitrator, session.disputeID, templateId);\\n }\\n }\\n\\n /// @notice Gives a ruling for a dispute.\\n /// @dev Must be called by the arbitrator.\\n /// @param _disputeID ID of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator. Note that 0 is reserved for \\\"Refuse to arbitrate\\\".\\n /// Note If the final ruling is \\\"0\\\" nothing is approved and deposits will stay locked in the contract.\\n function rule(uint256 _disputeID, uint256 _ruling) external override {\\n Session storage session = sessions[sessions.length - 1];\\n if (msg.sender != address(arbitrator)) revert OnlyArbitratorAllowed();\\n if (session.status != Status.DisputeCreated) revert NotDisputed();\\n if (_ruling > session.submittedLists.length) revert RulingOutOfBounds();\\n\\n if (_ruling != 0) {\\n Submission storage submission = submissions[session.submittedLists[_ruling - 1]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n submission.submitter.safeSend(session.sumDeposit, wNative);\\n }\\n // If the ruling is \\\"0\\\" the reserved funds of this session become expendable.\\n reservedETH -= session.sumDeposit;\\n\\n session.sumDeposit = 0;\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n session.ruling = _ruling;\\n sessions.push();\\n\\n emit Ruling(IArbitratorV2(msg.sender), _disputeID, _ruling);\\n }\\n\\n /// @notice Executes selected transactions of the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _cursor Index of the transaction from which to start executing.\\n /// @param _count Number of transactions to execute. Executes until the end if set to \\\"0\\\" or number higher than number of transactions in the list.\\n function executeTransactionList(uint256 _listID, uint256 _cursor, uint256 _count) external {\\n Submission storage submission = submissions[_listID];\\n if (!submission.approved) revert SubmissionNotApproved();\\n if (block.timestamp - submission.approvalTime > executionTimeout) revert TimeToExecuteHasPassed();\\n for (uint256 i = _cursor; i < submission.txs.length && (_count == 0 || i < _cursor + _count); i++) {\\n Transaction storage transaction = submission.txs[i];\\n uint256 expendableFunds = getExpendableFunds();\\n if (!transaction.executed && transaction.value <= expendableFunds) {\\n (bool callResult, ) = transaction.target.call{value: transaction.value}(transaction.data);\\n // An extra check to prevent re-entrancy through target call.\\n if (callResult == true) {\\n if (transaction.executed) revert AlreadyExecuted();\\n transaction.executed = true;\\n }\\n }\\n }\\n }\\n\\n /// @notice Receive function to receive funds for the execution of transactions.\\n receive() external payable {}\\n\\n /// @notice Gets the sum of contract funds that are used for the execution of transactions.\\n /// @return Contract balance without reserved ETH.\\n function getExpendableFunds() public view returns (uint256) {\\n return address(this).balance - reservedETH;\\n }\\n\\n /// @notice Gets the info of the specific transaction in the specific list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _transactionIndex The index of the transaction.\\n /// @return target The target of the transaction.\\n /// @return value The value of the transaction.\\n /// @return data The data of the transaction.\\n /// @return executed Whether the transaction was executed or not.\\n function getTransactionInfo(\\n uint256 _listID,\\n uint256 _transactionIndex\\n ) external view returns (address target, uint256 value, bytes memory data, bool executed) {\\n Submission storage submission = submissions[_listID];\\n Transaction storage transaction = submission.txs[_transactionIndex];\\n return (transaction.target, transaction.value, transaction.data, transaction.executed);\\n }\\n\\n /// @notice Gets the array of submitted lists in the session.\\n ///\\n /// @dev This function is O(n), where `n` is the number of submissions in the session.\\n /// This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts.\\n ///\\n /// @param _session The ID of the session.\\n /// @return submittedLists Indexes of lists that were submitted during the session.\\n function getSubmittedLists(uint256 _session) external view returns (uint256[] memory submittedLists) {\\n Session storage session = sessions[_session];\\n submittedLists = session.submittedLists;\\n }\\n\\n /// @notice Gets the submission from listId.\\n /// @param _listId The index of the transaction list in the array of lists.\\n /// @return submission List belonging to that listId.\\n function getSubmission(uint256 _listId) external view returns (Submission memory submission) {\\n submission = submissions[_listId];\\n }\\n\\n /// @notice Gets the number of transactions in the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @return txCount The number of transactions in the list.\\n function getNumberOfTransactions(uint256 _listID) external view returns (uint256 txCount) {\\n Submission storage submission = submissions[_listID];\\n return submission.txs.length;\\n }\\n\\n /// @notice Gets the number of lists created in contract's lifetime.\\n /// @return The number of created lists.\\n function getNumberOfCreatedLists() external view returns (uint256) {\\n return submissions.length;\\n }\\n\\n /// @notice Gets the number of the ongoing session.\\n /// @return The number of the ongoing session.\\n function getCurrentSessionNumber() external view returns (uint256) {\\n return sessions.length - 1;\\n }\\n\\n /// @notice Gets the session from the session index.\\n /// @return _session The session info.\\n function getSession(uint256 _sessionIndex) external view returns (Session memory _session) {\\n _session = sessions[_sessionIndex];\\n }\\n\\n /// @notice Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost).\\n /// @return _requiredDeposit required deposit value\\n function getTotalSubmissionDeposit() external view returns (uint256 _requiredDeposit) {\\n _requiredDeposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n }\\n\\n // ************************************* //\\n // * Errors * //\\n // ************************************* //\\n\\n error SubmissionTimeHasEnded();\\n error ApprovalTimeNotStarted();\\n error OwnerOnly();\\n error WrongInputTargetAndValue();\\n error WrongInputTargetAndDatasize();\\n error InsufficientDeposit();\\n error ListAlreadySubmitted();\\n error ShouldOnlyWithdrawInFirstHalf();\\n error WrongListHash();\\n error OnlySubmitterCanWithdraw();\\n error WithdrawingTimeHasPassed();\\n error AlreadyDisputed();\\n error OnlyArbitratorAllowed();\\n error NotDisputed();\\n error RulingOutOfBounds();\\n error SubmissionNotApproved();\\n error TimeToExecuteHasPassed();\\n error AlreadyExecuted();\\n}\\n\",\"keccak256\":\"0xe43c23fe08e7022e619a9514d2a7dc5d05e454919a0ed51ca91164d95e04b028\",\"license\":\"MIT\"},\"src/interfaces/IArbSys.sol\":{\"content\":\"// https://github.com/OffchainLabs/nitro-contracts/blob/bdb8f8c68b2229fe9309fe9c03b37017abd1a2cd/src/precompiles/ArbSys.sol\\n// Copyright 2021-2022, Offchain Labs, Inc.\\n// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE\\n// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity >=0.4.21 <0.9.0;\\n\\n/**\\n * @title System level functionality\\n * @notice For use by contracts to interact with core L2-specific functionality.\\n * Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064.\\n */\\ninterface ArbSys {\\n /**\\n * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)\\n * @return block number as int\\n */\\n function arbBlockNumber() external view returns (uint256);\\n\\n /**\\n * @notice Get Arbitrum block hash (reverts unless currentBlockNum-256 <= arbBlockNum < currentBlockNum)\\n * @return block hash\\n */\\n function arbBlockHash(uint256 arbBlockNum) external view returns (bytes32);\\n\\n /**\\n * @notice Gets the rollup's unique chain identifier\\n * @return Chain identifier as int\\n */\\n function arbChainID() external view returns (uint256);\\n\\n /**\\n * @notice Get internal version number identifying an ArbOS build, this is `55 + nitroArbOS version number`\\n * e.g. on ArbOS 31 this would return 86. This is the only function that have the 55 offset.\\n * @return version number as int\\n */\\n function arbOSVersion() external view returns (uint256);\\n\\n /**\\n * @notice Returns 0 since Nitro has no concept of storage gas\\n * @return uint 0\\n */\\n function getStorageGasAvailable() external view returns (uint256);\\n\\n /**\\n * @notice (deprecated) check if current call is top level (meaning it was triggered by an EoA or a L1 contract)\\n * @dev this call has been deprecated and may be removed in a future release\\n * @return true if current execution frame is not a call by another L2 contract\\n */\\n function isTopLevelCall() external view returns (bool);\\n\\n /**\\n * @notice map L1 sender contract address to its L2 alias\\n * @param sender sender address\\n * @param unused argument no longer used\\n * @return aliased sender address\\n */\\n function mapL1SenderContractAddressToL2Alias(address sender, address unused) external pure returns (address);\\n\\n /**\\n * @notice check if the caller (of this caller of this) is an aliased L1 contract address\\n * @return true iff the caller's address is an alias for an L1 contract address\\n */\\n function wasMyCallersAddressAliased() external view returns (bool);\\n\\n /**\\n * @notice return the address of the caller (of this caller of this), without applying L1 contract address aliasing\\n * @return address of the caller's caller, without applying L1 contract address aliasing\\n */\\n function myCallersAddressWithoutAliasing() external view returns (address);\\n\\n /**\\n * @notice Send given amount of Eth to dest from sender.\\n * This is a convenience function, which is equivalent to calling sendTxToL1 with empty data.\\n * @param destination recipient address on L1\\n * @return unique identifier for this L2-to-L1 transaction.\\n */\\n function withdrawEth(address destination) external payable returns (uint256);\\n\\n /**\\n * @notice Send a transaction to L1\\n * @dev it is not possible to execute on the L1 any L2-to-L1 transaction which contains data\\n * to a contract address without any code (as enforced by the Bridge contract).\\n * @param destination recipient address on L1\\n * @param data (optional) calldata for L1 contract call\\n * @return a unique identifier for this L2-to-L1 transaction.\\n */\\n function sendTxToL1(address destination, bytes calldata data) external payable returns (uint256);\\n\\n /**\\n * @notice Get send Merkle tree state\\n * @return size number of sends in the history\\n * @return root root hash of the send history\\n * @return partials hashes of partial subtrees in the send history tree\\n */\\n function sendMerkleTreeState() external view returns (uint256 size, bytes32 root, bytes32[] memory partials);\\n\\n /**\\n * @notice creates a send txn from L2 to L1\\n * @param position = (level << 192) + leaf = (0 << 192) + leaf = leaf\\n */\\n event L2ToL1Tx(\\n address caller,\\n address indexed destination,\\n uint256 indexed hash,\\n uint256 indexed position,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /// @dev DEPRECATED in favour of the new L2ToL1Tx event above after the nitro upgrade\\n event L2ToL1Transaction(\\n address caller,\\n address indexed destination,\\n uint256 indexed uniqueId,\\n uint256 indexed batchNumber,\\n uint256 indexInBatch,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /**\\n * @notice logs a merkle branch for proof synthesis\\n * @param reserved an index meant only to align the 4th index with L2ToL1Transaction's 4th event\\n * @param hash the merkle hash\\n * @param position = (level << 192) + leaf\\n */\\n event SendMerkleUpdate(uint256 indexed reserved, bytes32 indexed hash, uint256 indexed position);\\n\\n error InvalidBlockNumber(uint256 requested, uint256 current);\\n}\\n\",\"keccak256\":\"0x9f2e1c9d8d19db1d3c6baa0549d14a68d09526764f4bd6f3bf030f0af7fd12fe\",\"license\":\"BUSL-1.1\"},\"src/libraries/SafeSend.sol\":{\"content\":\"/**\\n * @authors: [@andreimvp]\\n * @reviewers: [@divyangchauhan, @wadader, @fcanela, @unknownunknown1]\\n * @auditors: []\\n * @bounties: []\\n * SPDX-License-Identifier: MIT\\n */\\n\\npragma solidity ^0.8.24;\\n\\ninterface WethLike {\\n function deposit() external payable;\\n\\n function transfer(address dst, uint256 wad) external;\\n}\\n\\nlibrary SafeSend {\\n function safeSend(address payable _to, uint256 _value, address _wethLike) internal {\\n if (_to.send(_value)) return;\\n\\n WethLike(_wethLike).deposit{value: _value}();\\n WethLike(_wethLike).transfer(_to, _value); /// forge-lint: disable-line(erc20-unchecked-transfer)\\n }\\n}\\n\",\"keccak256\":\"0xd4d5b25d0eb7f7965ea7a9e3d3d6bc13368de9aaf882543a75dc9c57c85e9283\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162002f0038038062002f00833981016040819052620000349162000225565b600080546001600160a01b0319166001600160a01b038c1617905560016200005d8a82620003a9565b50600280546001600160a01b038084166001600160a01b031992831617909255426009556005879055600686905560078590556008849055600c80546001908101909155600b8054909101815560005260038054928b1692909116821790556040516312a6505d60e21b8152634a99417490620000e1908a908a90600401620004a3565b6020604051808303816000875af115801562000101573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001279190620004e3565b60045550620004fd98505050505050505050565b80516001600160a01b03811681146200015357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200018b57818101518382015260200162000171565b50506000910152565b600082601f830112620001a657600080fd5b81516001600160401b0380821115620001c357620001c362000158565b604051601f8301601f19908116603f01168101908282118183101715620001ee57620001ee62000158565b816040528381528660208588010111156200020857600080fd5b6200021b8460208301602089016200016e565b9695505050505050565b6000806000806000806000806000806101408b8d0312156200024657600080fd5b620002518b6200013b565b60208c0151909a506001600160401b03808211156200026f57600080fd5b6200027d8e838f0162000194565b9a506200028d60408e016200013b565b995060608d0151915080821115620002a457600080fd5b620002b28e838f0162000194565b985060808d0151915080821115620002c957600080fd5b50620002d88d828e0162000194565b96505060a08b0151945060c08b0151935060e08b015192506101008b01519150620003076101208c016200013b565b90509295989b9194979a5092959850565b600181811c908216806200032d57607f821691505b6020821081036200034e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a4576000816000526020600020601f850160051c810160208610156200037f5750805b601f850160051c820191505b81811015620003a0578281556001016200038b565b5050505b505050565b81516001600160401b03811115620003c557620003c562000158565b620003dd81620003d6845462000318565b8462000354565b602080601f831160018114620004155760008415620003fc5750858301515b600019600386901b1c1916600185901b178555620003a0565b600085815260208120601f198616915b82811015620004465788860151825594840194600190910190840162000425565b5085821015620004655787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526200048f8160208601602086016200016e565b601f01601f19169290920160200192915050565b6060815260006060820152608060208201526000620004c6608083018562000475565b8281036040840152620004da818562000475565b95945050505050565b600060208284031215620004f657600080fd5b5051919050565b6129f3806200050d6000396000f3fe6080604052600436106101b25760003560e01c806383c4b7a3116100ed578063b6cd08c611610090578063b6cd08c614610519578063b6dc775414610539578063ba7079ca1461054e578063bb0b86ff1461056e578063c4bd851914610584578063c5d552881461059a578063cc2bcdb4146105ba578063dc17bbdb146105da578063f730c07f146105fa57600080fd5b806383c4b7a3146103d75780639244c70414610408578063953d66511461041d5780639c15d1a21461043d578063a0af81f014610453578063a3c595c914610473578063ad73349e146104a3578063b51257001461050457600080fd5b80633e8686cc116101555780633e8686cc146102e9578063402ff0db1461031657806346047838146103435780636c0b7e71146103565780636cc6cde11461036b5780636cf39c2b1461038b57806377b9fda8146103ab5780637aa77f29146103c157600080fd5b80630c7ac7b6146101be5780631b1f5e7b146101e957806321cea5381461020c57806322b52d6614610239578063246c76df1461024f57806324baacc7146102715780632d68efc914610291578063311a6c56146102c957600080fd5b366101b957005b600080fd5b3480156101ca57600080fd5b506101d3610610565b6040516101e09190611fdc565b60405180910390f35b3480156101f557600080fd5b506101fe61069e565b6040519081526020016101e0565b34801561021857600080fd5b5061022c610227366004611ff6565b610723565b6040516101e0919061200f565b34801561024557600080fd5b506101fe60075481565b34801561025b57600080fd5b5061026f61026a366004611ff6565b6107a5565b005b34801561027d57600080fd5b5061026f61028c366004611ff6565b6107ca565b34801561029d57600080fd5b506002546102b1906001600160a01b031681565b6040516001600160a01b0390911681526020016101e0565b3480156102d557600080fd5b5061026f6102e4366004612053565b6107ef565b3480156102f557600080fd5b50610309610304366004611ff6565b6109c1565b6040516101e09190612075565b34801561032257600080fd5b50610336610331366004611ff6565b610bbc565b6040516101e091906121b0565b61026f61035136600461240a565b610caa565b34801561036257600080fd5b506101fe6112b1565b34801561037757600080fd5b506000546102b1906001600160a01b031681565b34801561039757600080fd5b5061026f6103a63660046124db565b6112c3565b3480156103b757600080fd5b506101fe600a5481565b3480156103cd57600080fd5b506101fe60045481565b3480156103e357600080fd5b506103f76103f2366004611ff6565b611487565b6040516101e0959493929190612507565b34801561041457600080fd5b5061026f6114ce565b34801561042957600080fd5b5061026f610438366004611ff6565b611841565b34801561044957600080fd5b506101fe60085481565b34801561045f57600080fd5b506003546102b1906001600160a01b031681565b34801561047f57600080fd5b5061049361048e366004612053565b6118d9565b6040516101e09493929190612539565b3480156104af57600080fd5b506104c36104be366004611ff6565b6119f3565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101e0565b34801561051057600080fd5b506101fe611a4f565b34801561052557600080fd5b5061026f610534366004612053565b611a5f565b34801561054557600080fd5b50600b546101fe565b34801561055a57600080fd5b5061026f610569366004612573565b611cb3565b34801561057a57600080fd5b506101fe60055481565b34801561059057600080fd5b506101fe60065481565b3480156105a657600080fd5b5061026f6105b53660046125c2565b611d72565b3480156105c657600080fd5b5061026f6105d5366004611ff6565b611e0e565b3480156105e657600080fd5b506101fe6105f5366004611ff6565b611e33565b34801561060657600080fd5b506101fe60095481565b6001805461061d9061261b565b80601f01602080910402602001604051908101604052809291908181526020018280546106499061261b565b80156106965780601f1061066b57610100808354040283529160200191610696565b820191906000526020600020905b81548152906001019060200180831161067957829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea9906106d0906001906004016126d2565b602060405180830381865afa1580156106ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071191906126e5565b60055461071e9190612714565b905090565b60606000600c838154811061073a5761073a61272d565b906000526020600020906006020190508060020180548060200260200160405190810160405280929190818152602001828054801561079857602002820191906000526020600020905b815481526020019060010190808311610784575b5050505050915050919050565b3033146107c557604051630b2db9b760e31b815260040160405180910390fd5b600855565b3033146107ea57604051630b2db9b760e31b815260040160405180910390fd5b600555565b600c80546000919061080390600190612743565b815481106108135761081361272d565b600091825260208220915460069190910290910191506001600160a01b031633146108515760405163381a2cb560e11b815260040160405180910390fd5b6001600482015460ff16600281111561086c5761086c612178565b1461088a576040516310cec38560e21b815260040160405180910390fd5b60028101548211156108af57604051631f6edbfd60e01b815260040160405180910390fd5b811561093f576000600b600283016108c8600186612743565b815481106108d8576108d861272d565b9060005260206000200154815481106108f3576108f361272d565b600091825260209091206005600890920201908101805460ff191660011790554260068201556003830154600254825492935061093d926001600160a01b03908116929116611e64565b505b8060030154600a60008282546109559190612743565b90915550506000600382018190554260095560048201805460ff19166002179055828255600c805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a1760405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600b8281548110610a2a57610a2a61272d565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610b76576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610ad39061261b565b80601f0160208091040260200160405190810160405280929190818152602001828054610aff9061261b565b8015610b4c5780601f10610b2157610100808354040283529160200191610b4c565b820191906000526020600020905b815481529060010190602001808311610b2f57829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610a80565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610bc4611f4f565b600c8281548110610bd757610bd761272d565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610c5357602002820191906000526020600020905b815481526020019060010190808311610c3f575b505050918352505060038201546020820152600482015460409091019060ff166002811115610c8457610c84612178565b6002811115610c9557610c95612178565b81526020016005820154815250509050919050565b600c805460009190610cbe90600190612743565b81548110610cce57610cce61272d565b906000526020600020906006020160050154905080600654610cf09190612714565b600954610cfd9042612743565b1115610d1c5760405163d5ac976d60e01b815260040160405180910390fd5b8451865114610d3e57604051638f32290560e01b815260040160405180910390fd5b8251865114610d6057604051633222108360e01b815260040160405180910390fd5b600c805460009190610d7490600190612743565b81548110610d8457610d8461272d565b60009182526020808320600b8054600181018255945260089093027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3b91906126e5565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610e71906001906004016126d2565b602060405180830381865afa158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb291906126e5565b600554610ebf9190612714565b60018201819055341015610ee65760405163070f6eed60e11b815260040160405180910390fd5b60008080805b8b518110156110f2576000898281518110610f0957610f0961272d565b60200260200101516001600160401b03811115610f2857610f28612243565b6040519080825280601f01601f191660200182016040528015610f52576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110610f8757610f8761272d565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d9084908110610fc057610fc061272d565b6020026020010151816001018190555060005b8b8481518110610fe557610fe561272d565b602002602001015181101561104b578c610fff8287612714565b8151811061100f5761100f61272d565b602001015160f81c60f81b83828151811061102c5761102c61272d565b60200101906001600160f81b031916908160001a905350600101610fd3565b506002810161105a83826127a7565b508a838151811061106d5761106d61272d565b6020026020010151846110809190612714565b815460018301546040519296506110aa926001600160a01b039092169160028501906020016128d9565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610eec565b50600c54600d9060009061110890600190612743565b81526020808201929092526040908101600090812086825290925290205460ff166111465760405163607cb3e760e01b815260040160405180910390fd5b6001600d60006001600c8054905061115e9190612743565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916111b2908490612714565b9091555050600b5460028601906111cb90600190612743565b815460018181018455600093845260209093200155600286015490036111fe576009546111f89042612743565b60058601555b600c5461120d90600190612743565b600b54339061121e90600190612743565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a60405161124d9190611fdc565b60405180910390a460008460010154346112679190612743565b905080156112885760025461128890339083906001600160a01b0316611e64565b8460010154600a600082825461129e9190612714565b9091555050505050505050505050505050565b600c5460009061071e90600190612743565b6000600b84815481106112d8576112d861272d565b60009182526020909120600890910201600581015490915060ff1661130f5760405162325f4560e91b815260040160405180910390fd5b60075460068201546113219042612743565b111561134057604051638b349aa560e01b815260040160405180910390fd5b825b600282015481108015611365575082158061136557506113628385612714565b81105b156114805760008260020182815481106113815761138161272d565b90600052602060002090600402019050600061139b611a4f565b600383015490915060ff161580156113b7575080826001015411155b1561146b57815460018301546040516000926001600160a01b031691906113e290600287019061290c565b60006040518083038185875af1925050503d806000811461141f576040519150601f19603f3d011682016040523d82523d6000602084013e611424565b606091505b509091505080151560010361146957600383015460ff161561145957604051630dc1019760e01b815260040160405180910390fd5b60038301805460ff191660011790555b505b5050808061147890612918565b915050611342565b5050505050565b600c818154811061149757600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600c8054600091906114e290600190612743565b815481106114f2576114f261272d565b9060005260206000209060060201600501549050806006546115149190612714565b6009546115219042612743565b1161153f57604051631875ed4760e21b815260040160405180910390fd5b600c80546000919061155390600190612743565b815481106115635761156361272d565b6000918252602082206006909102019150600482015460ff16600281111561158d5761158d612178565b146115ab576040516304ee891b60e11b815260040160405180910390fd5b60028101546000036115d85742600955600401805460ff1916600217905550600c80546001018155600052565b60028101546001036116a7576000600b826002016000815481106115fe576115fe61272d565b9060005260206000200154815481106116195761161961272d565b6000918252602082206005600890920201908101805460ff191660011790554260068201556003840180549290556002548154919350611667916001600160a01b0390811691849116611e64565b4260095560048301805460ff19166002179055600c805460010181556000908152600a805483929061169a908490612743565b9091555061183d92505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926116e992016126d2565b602060405180830381865afa158015611706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172a91906126e5565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e19184916117669190600190600401612931565b60206040518083038185885af1158015611784573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117a991906126e5565b6001830155600382015481106117c05760006117d0565b8082600301546117d09190612743565b6003830155600a5481106117e55760006117f3565b80600a546117f39190612743565b600a5560018201546000546004546040519081526001600160a01b03909116907fee1017dcbefba87397fcdaab31f187328533572b6a5568177fa2eb64026003b6906020016109b4565b5050565b30331461186157604051630b2db9b760e31b815260040160405180910390fd5b600c80546000919061187590600190612743565b815481106118855761188561272d565b9060005260206000209060060201600501549050806006546118a79190612714565b6009546118b49042612743565b11156118d35760405163d5ac976d60e01b815260040160405180910390fd5b50600655565b6000806060600080600b87815481106118f4576118f461272d565b90600052602060002090600802019050600081600201878154811061191b5761191b61272d565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff9091169082906119609061261b565b80601f016020809104026020016040519081016040528092919081815260200182805461198c9061261b565b80156119d95780601f106119ae576101008083540402835291602001916119d9565b820191906000526020600020905b8154815290600101906020018083116119bc57829003601f168201915b505050505091509550955095509550505092959194509250565b600b8181548110611a0357600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600a544761071e9190612743565b600c805460009190611a7390600190612743565b81548110611a8357611a8361272d565b906000526020600020906006020190506000600b826002018581548110611aac57611aac61272d565b906000526020600020015481548110611ac757611ac761272d565b906000526020600020906008020190506002600654611ae69190612952565b600954611af39042612743565b1115611b125760405163383f4af360e21b815260040160405180910390fd5b82816003015414611b36576040516306e671b760e31b815260040160405180910390fd5b80546001600160a01b03163314611b605760405163415360c560e11b815260040160405180910390fd5b6008546004820154611b729042612743565b1115611b915760405163603c988d60e11b815260040160405180910390fd5b600282018054611ba390600190612743565b81548110611bb357611bb361272d565b9060005260206000200154826002018581548110611bd357611bd361272d565b6000918252602082200191909155600c54600d908290611bf590600190612743565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611c3457611c34612974565b600190038181906000526020600020016000905590558060010154826003016000828254611c629190612743565b90915550506001810154600a8054600090611c7e908490612743565b90915550506001810154604051339180156108fc02916000818181858888f19350505050158015611480573d6000803e3d6000fd5b303314611cd357604051630b2db9b760e31b815260040160405180910390fd5b600c805460009190611ce790600190612743565b81548110611cf757611cf761272d565b906000526020600020906006020160050154905080600654611d199190612714565b600954611d269042612743565b1115611d455760405163d5ac976d60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0385161790556001611d6c83826127a7565b50505050565b303314611d9257604051630b2db9b760e31b815260040160405180910390fd5b6003546040516312a6505d60e21b81526001600160a01b0390911690634a99417490611dc4908590859060040161298a565b6020604051808303816000875af1158015611de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0791906126e5565b6004555050565b303314611e2e57604051630b2db9b760e31b815260040160405180910390fd5b600755565b600080600b8381548110611e4957611e4961272d565b60009182526020909120600260089092020101549392505050565b6040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015611e9357505050565b806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ece57600080fd5b505af1158015611ee2573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018790528516935063a9059cbb92506044019050600060405180830381600087803b158015611f3257600080fd5b505af1158015611f46573d6000803e3d6000fd5b50505050505050565b6040518060c001604052806000815260200160008152602001606081526020016000815260200160006002811115611f8957611f89612178565b8152602001600081525090565b6000815180845260005b81811015611fbc57602081850181015186830182015201611fa0565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611fef6020830184611f96565b9392505050565b60006020828403121561200857600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156120475783518352928401929184019160010161202b565b50909695505050505050565b6000806040838503121561206657600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156121295761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d0152612109828d0182611f96565b9287015115159b87019b909b5250985095890195918901916001016120d0565b5050505060608901516080890152608089015160a089015260a0890151955061215660c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b600381106121ac57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b8083101561220d57835182529284019260019290920191908401906121ed565b50606087015160808701526080870151935061222c60a087018561218e565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561228157612281612243565b604052919050565b60006001600160401b038211156122a2576122a2612243565b5060051b60200190565b6001600160a01b03811681146122c157600080fd5b50565b600082601f8301126122d557600080fd5b813560206122ea6122e583612289565b612259565b8083825260208201915060208460051b87010193508684111561230c57600080fd5b602086015b84811015612331578035612324816122ac565b8352918301918301612311565b509695505050505050565b600082601f83011261234d57600080fd5b8135602061235d6122e583612289565b8083825260208201915060208460051b87010193508684111561237f57600080fd5b602086015b848110156123315780358352918301918301612384565b600082601f8301126123ac57600080fd5b81356001600160401b038111156123c5576123c5612243565b6123d8601f8201601f1916602001612259565b8181528460208386010111156123ed57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561242257600080fd5b85356001600160401b038082111561243957600080fd5b61244589838a016122c4565b9650602088013591508082111561245b57600080fd5b61246789838a0161233c565b9550604088013591508082111561247d57600080fd5b61248989838a0161239b565b9450606088013591508082111561249f57600080fd5b6124ab89838a0161233c565b935060808801359150808211156124c157600080fd5b506124ce8882890161239b565b9150509295509295909350565b6000806000606084860312156124f057600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a08101612529606083018561218e565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006125606080830185611f96565b9050821515606083015295945050505050565b6000806040838503121561258657600080fd5b8235612591816122ac565b915060208301356001600160401b038111156125ac57600080fd5b6125b88582860161239b565b9150509250929050565b600080604083850312156125d557600080fd5b82356001600160401b03808211156125ec57600080fd5b6125f88683870161239b565b9350602085013591508082111561260e57600080fd5b506125b88582860161239b565b600181811c9082168061262f57607f821691505b60208210810361264f57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546126628161261b565b80855260206001838116801561267f5760018114612699576126c7565b60ff1985168884015283151560051b8801830195506126c7565b866000528260002060005b858110156126bf5781548a82018601529083019084016126a4565b890184019650505b505050505092915050565b602081526000611fef6020830184612655565b6000602082840312156126f757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115612727576127276126fe565b92915050565b634e487b7160e01b600052603260045260246000fd5b81810381811115612727576127276126fe565b601f8211156127a2576000816000526020600020601f850160051c8101602086101561277f5750805b601f850160051c820191505b8181101561279e5782815560010161278b565b5050505b505050565b81516001600160401b038111156127c0576127c0612243565b6127d4816127ce845461261b565b84612756565b602080601f83116001811461280957600084156127f15750858301515b600019600386901b1c1916600185901b17855561279e565b600085815260208120601f198616915b8281101561283857888601518255948401946001909101908401612819565b50858210156128565787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081546128738161261b565b6001828116801561288b57600181146128a0576128cf565b60ff19841687528215158302870194506128cf565b8560005260208060002060005b858110156128c65781548a8201529084019082016128ad565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b16815282601482015260006129036034830184612866565b95945050505050565b6000611fef8284612866565b60006001820161292a5761292a6126fe565b5060010190565b82815260406020820152600061294a6040830184612655565b949350505050565b60008261296f57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b60608152600060608201526080602082015260006129ab6080830185611f96565b82810360408401526129038185611f9656fea26469706673582212203eb0ce20128709ce0e25d07609542c5c1fd2df8b0d773b52b6377b98d8fada1f64736f6c63430008180033", + "deployedBytecode": "0x6080604052600436106101b25760003560e01c806383c4b7a3116100ed578063b6cd08c611610090578063b6cd08c614610519578063b6dc775414610539578063ba7079ca1461054e578063bb0b86ff1461056e578063c4bd851914610584578063c5d552881461059a578063cc2bcdb4146105ba578063dc17bbdb146105da578063f730c07f146105fa57600080fd5b806383c4b7a3146103d75780639244c70414610408578063953d66511461041d5780639c15d1a21461043d578063a0af81f014610453578063a3c595c914610473578063ad73349e146104a3578063b51257001461050457600080fd5b80633e8686cc116101555780633e8686cc146102e9578063402ff0db1461031657806346047838146103435780636c0b7e71146103565780636cc6cde11461036b5780636cf39c2b1461038b57806377b9fda8146103ab5780637aa77f29146103c157600080fd5b80630c7ac7b6146101be5780631b1f5e7b146101e957806321cea5381461020c57806322b52d6614610239578063246c76df1461024f57806324baacc7146102715780632d68efc914610291578063311a6c56146102c957600080fd5b366101b957005b600080fd5b3480156101ca57600080fd5b506101d3610610565b6040516101e09190611fdc565b60405180910390f35b3480156101f557600080fd5b506101fe61069e565b6040519081526020016101e0565b34801561021857600080fd5b5061022c610227366004611ff6565b610723565b6040516101e0919061200f565b34801561024557600080fd5b506101fe60075481565b34801561025b57600080fd5b5061026f61026a366004611ff6565b6107a5565b005b34801561027d57600080fd5b5061026f61028c366004611ff6565b6107ca565b34801561029d57600080fd5b506002546102b1906001600160a01b031681565b6040516001600160a01b0390911681526020016101e0565b3480156102d557600080fd5b5061026f6102e4366004612053565b6107ef565b3480156102f557600080fd5b50610309610304366004611ff6565b6109c1565b6040516101e09190612075565b34801561032257600080fd5b50610336610331366004611ff6565b610bbc565b6040516101e091906121b0565b61026f61035136600461240a565b610caa565b34801561036257600080fd5b506101fe6112b1565b34801561037757600080fd5b506000546102b1906001600160a01b031681565b34801561039757600080fd5b5061026f6103a63660046124db565b6112c3565b3480156103b757600080fd5b506101fe600a5481565b3480156103cd57600080fd5b506101fe60045481565b3480156103e357600080fd5b506103f76103f2366004611ff6565b611487565b6040516101e0959493929190612507565b34801561041457600080fd5b5061026f6114ce565b34801561042957600080fd5b5061026f610438366004611ff6565b611841565b34801561044957600080fd5b506101fe60085481565b34801561045f57600080fd5b506003546102b1906001600160a01b031681565b34801561047f57600080fd5b5061049361048e366004612053565b6118d9565b6040516101e09493929190612539565b3480156104af57600080fd5b506104c36104be366004611ff6565b6119f3565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101e0565b34801561051057600080fd5b506101fe611a4f565b34801561052557600080fd5b5061026f610534366004612053565b611a5f565b34801561054557600080fd5b50600b546101fe565b34801561055a57600080fd5b5061026f610569366004612573565b611cb3565b34801561057a57600080fd5b506101fe60055481565b34801561059057600080fd5b506101fe60065481565b3480156105a657600080fd5b5061026f6105b53660046125c2565b611d72565b3480156105c657600080fd5b5061026f6105d5366004611ff6565b611e0e565b3480156105e657600080fd5b506101fe6105f5366004611ff6565b611e33565b34801561060657600080fd5b506101fe60095481565b6001805461061d9061261b565b80601f01602080910402602001604051908101604052809291908181526020018280546106499061261b565b80156106965780601f1061066b57610100808354040283529160200191610696565b820191906000526020600020905b81548152906001019060200180831161067957829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea9906106d0906001906004016126d2565b602060405180830381865afa1580156106ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071191906126e5565b60055461071e9190612714565b905090565b60606000600c838154811061073a5761073a61272d565b906000526020600020906006020190508060020180548060200260200160405190810160405280929190818152602001828054801561079857602002820191906000526020600020905b815481526020019060010190808311610784575b5050505050915050919050565b3033146107c557604051630b2db9b760e31b815260040160405180910390fd5b600855565b3033146107ea57604051630b2db9b760e31b815260040160405180910390fd5b600555565b600c80546000919061080390600190612743565b815481106108135761081361272d565b600091825260208220915460069190910290910191506001600160a01b031633146108515760405163381a2cb560e11b815260040160405180910390fd5b6001600482015460ff16600281111561086c5761086c612178565b1461088a576040516310cec38560e21b815260040160405180910390fd5b60028101548211156108af57604051631f6edbfd60e01b815260040160405180910390fd5b811561093f576000600b600283016108c8600186612743565b815481106108d8576108d861272d565b9060005260206000200154815481106108f3576108f361272d565b600091825260209091206005600890920201908101805460ff191660011790554260068201556003830154600254825492935061093d926001600160a01b03908116929116611e64565b505b8060030154600a60008282546109559190612743565b90915550506000600382018190554260095560048201805460ff19166002179055828255600c805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a1760405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600b8281548110610a2a57610a2a61272d565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610b76576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610ad39061261b565b80601f0160208091040260200160405190810160405280929190818152602001828054610aff9061261b565b8015610b4c5780601f10610b2157610100808354040283529160200191610b4c565b820191906000526020600020905b815481529060010190602001808311610b2f57829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610a80565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610bc4611f4f565b600c8281548110610bd757610bd761272d565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610c5357602002820191906000526020600020905b815481526020019060010190808311610c3f575b505050918352505060038201546020820152600482015460409091019060ff166002811115610c8457610c84612178565b6002811115610c9557610c95612178565b81526020016005820154815250509050919050565b600c805460009190610cbe90600190612743565b81548110610cce57610cce61272d565b906000526020600020906006020160050154905080600654610cf09190612714565b600954610cfd9042612743565b1115610d1c5760405163d5ac976d60e01b815260040160405180910390fd5b8451865114610d3e57604051638f32290560e01b815260040160405180910390fd5b8251865114610d6057604051633222108360e01b815260040160405180910390fd5b600c805460009190610d7490600190612743565b81548110610d8457610d8461272d565b60009182526020808320600b8054600181018255945260089093027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3b91906126e5565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610e71906001906004016126d2565b602060405180830381865afa158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb291906126e5565b600554610ebf9190612714565b60018201819055341015610ee65760405163070f6eed60e11b815260040160405180910390fd5b60008080805b8b518110156110f2576000898281518110610f0957610f0961272d565b60200260200101516001600160401b03811115610f2857610f28612243565b6040519080825280601f01601f191660200182016040528015610f52576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110610f8757610f8761272d565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d9084908110610fc057610fc061272d565b6020026020010151816001018190555060005b8b8481518110610fe557610fe561272d565b602002602001015181101561104b578c610fff8287612714565b8151811061100f5761100f61272d565b602001015160f81c60f81b83828151811061102c5761102c61272d565b60200101906001600160f81b031916908160001a905350600101610fd3565b506002810161105a83826127a7565b508a838151811061106d5761106d61272d565b6020026020010151846110809190612714565b815460018301546040519296506110aa926001600160a01b039092169160028501906020016128d9565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610eec565b50600c54600d9060009061110890600190612743565b81526020808201929092526040908101600090812086825290925290205460ff166111465760405163607cb3e760e01b815260040160405180910390fd5b6001600d60006001600c8054905061115e9190612743565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916111b2908490612714565b9091555050600b5460028601906111cb90600190612743565b815460018181018455600093845260209093200155600286015490036111fe576009546111f89042612743565b60058601555b600c5461120d90600190612743565b600b54339061121e90600190612743565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a60405161124d9190611fdc565b60405180910390a460008460010154346112679190612743565b905080156112885760025461128890339083906001600160a01b0316611e64565b8460010154600a600082825461129e9190612714565b9091555050505050505050505050505050565b600c5460009061071e90600190612743565b6000600b84815481106112d8576112d861272d565b60009182526020909120600890910201600581015490915060ff1661130f5760405162325f4560e91b815260040160405180910390fd5b60075460068201546113219042612743565b111561134057604051638b349aa560e01b815260040160405180910390fd5b825b600282015481108015611365575082158061136557506113628385612714565b81105b156114805760008260020182815481106113815761138161272d565b90600052602060002090600402019050600061139b611a4f565b600383015490915060ff161580156113b7575080826001015411155b1561146b57815460018301546040516000926001600160a01b031691906113e290600287019061290c565b60006040518083038185875af1925050503d806000811461141f576040519150601f19603f3d011682016040523d82523d6000602084013e611424565b606091505b509091505080151560010361146957600383015460ff161561145957604051630dc1019760e01b815260040160405180910390fd5b60038301805460ff191660011790555b505b5050808061147890612918565b915050611342565b5050505050565b600c818154811061149757600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600c8054600091906114e290600190612743565b815481106114f2576114f261272d565b9060005260206000209060060201600501549050806006546115149190612714565b6009546115219042612743565b1161153f57604051631875ed4760e21b815260040160405180910390fd5b600c80546000919061155390600190612743565b815481106115635761156361272d565b6000918252602082206006909102019150600482015460ff16600281111561158d5761158d612178565b146115ab576040516304ee891b60e11b815260040160405180910390fd5b60028101546000036115d85742600955600401805460ff1916600217905550600c80546001018155600052565b60028101546001036116a7576000600b826002016000815481106115fe576115fe61272d565b9060005260206000200154815481106116195761161961272d565b6000918252602082206005600890920201908101805460ff191660011790554260068201556003840180549290556002548154919350611667916001600160a01b0390811691849116611e64565b4260095560048301805460ff19166002179055600c805460010181556000908152600a805483929061169a908490612743565b9091555061183d92505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926116e992016126d2565b602060405180830381865afa158015611706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172a91906126e5565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e19184916117669190600190600401612931565b60206040518083038185885af1158015611784573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117a991906126e5565b6001830155600382015481106117c05760006117d0565b8082600301546117d09190612743565b6003830155600a5481106117e55760006117f3565b80600a546117f39190612743565b600a5560018201546000546004546040519081526001600160a01b03909116907fee1017dcbefba87397fcdaab31f187328533572b6a5568177fa2eb64026003b6906020016109b4565b5050565b30331461186157604051630b2db9b760e31b815260040160405180910390fd5b600c80546000919061187590600190612743565b815481106118855761188561272d565b9060005260206000209060060201600501549050806006546118a79190612714565b6009546118b49042612743565b11156118d35760405163d5ac976d60e01b815260040160405180910390fd5b50600655565b6000806060600080600b87815481106118f4576118f461272d565b90600052602060002090600802019050600081600201878154811061191b5761191b61272d565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff9091169082906119609061261b565b80601f016020809104026020016040519081016040528092919081815260200182805461198c9061261b565b80156119d95780601f106119ae576101008083540402835291602001916119d9565b820191906000526020600020905b8154815290600101906020018083116119bc57829003601f168201915b505050505091509550955095509550505092959194509250565b600b8181548110611a0357600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600a544761071e9190612743565b600c805460009190611a7390600190612743565b81548110611a8357611a8361272d565b906000526020600020906006020190506000600b826002018581548110611aac57611aac61272d565b906000526020600020015481548110611ac757611ac761272d565b906000526020600020906008020190506002600654611ae69190612952565b600954611af39042612743565b1115611b125760405163383f4af360e21b815260040160405180910390fd5b82816003015414611b36576040516306e671b760e31b815260040160405180910390fd5b80546001600160a01b03163314611b605760405163415360c560e11b815260040160405180910390fd5b6008546004820154611b729042612743565b1115611b915760405163603c988d60e11b815260040160405180910390fd5b600282018054611ba390600190612743565b81548110611bb357611bb361272d565b9060005260206000200154826002018581548110611bd357611bd361272d565b6000918252602082200191909155600c54600d908290611bf590600190612743565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611c3457611c34612974565b600190038181906000526020600020016000905590558060010154826003016000828254611c629190612743565b90915550506001810154600a8054600090611c7e908490612743565b90915550506001810154604051339180156108fc02916000818181858888f19350505050158015611480573d6000803e3d6000fd5b303314611cd357604051630b2db9b760e31b815260040160405180910390fd5b600c805460009190611ce790600190612743565b81548110611cf757611cf761272d565b906000526020600020906006020160050154905080600654611d199190612714565b600954611d269042612743565b1115611d455760405163d5ac976d60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0385161790556001611d6c83826127a7565b50505050565b303314611d9257604051630b2db9b760e31b815260040160405180910390fd5b6003546040516312a6505d60e21b81526001600160a01b0390911690634a99417490611dc4908590859060040161298a565b6020604051808303816000875af1158015611de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0791906126e5565b6004555050565b303314611e2e57604051630b2db9b760e31b815260040160405180910390fd5b600755565b600080600b8381548110611e4957611e4961272d565b60009182526020909120600260089092020101549392505050565b6040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015611e9357505050565b806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ece57600080fd5b505af1158015611ee2573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018790528516935063a9059cbb92506044019050600060405180830381600087803b158015611f3257600080fd5b505af1158015611f46573d6000803e3d6000fd5b50505050505050565b6040518060c001604052806000815260200160008152602001606081526020016000815260200160006002811115611f8957611f89612178565b8152602001600081525090565b6000815180845260005b81811015611fbc57602081850181015186830182015201611fa0565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611fef6020830184611f96565b9392505050565b60006020828403121561200857600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156120475783518352928401929184019160010161202b565b50909695505050505050565b6000806040838503121561206657600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156121295761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d0152612109828d0182611f96565b9287015115159b87019b909b5250985095890195918901916001016120d0565b5050505060608901516080890152608089015160a089015260a0890151955061215660c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b600381106121ac57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b8083101561220d57835182529284019260019290920191908401906121ed565b50606087015160808701526080870151935061222c60a087018561218e565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561228157612281612243565b604052919050565b60006001600160401b038211156122a2576122a2612243565b5060051b60200190565b6001600160a01b03811681146122c157600080fd5b50565b600082601f8301126122d557600080fd5b813560206122ea6122e583612289565b612259565b8083825260208201915060208460051b87010193508684111561230c57600080fd5b602086015b84811015612331578035612324816122ac565b8352918301918301612311565b509695505050505050565b600082601f83011261234d57600080fd5b8135602061235d6122e583612289565b8083825260208201915060208460051b87010193508684111561237f57600080fd5b602086015b848110156123315780358352918301918301612384565b600082601f8301126123ac57600080fd5b81356001600160401b038111156123c5576123c5612243565b6123d8601f8201601f1916602001612259565b8181528460208386010111156123ed57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561242257600080fd5b85356001600160401b038082111561243957600080fd5b61244589838a016122c4565b9650602088013591508082111561245b57600080fd5b61246789838a0161233c565b9550604088013591508082111561247d57600080fd5b61248989838a0161239b565b9450606088013591508082111561249f57600080fd5b6124ab89838a0161233c565b935060808801359150808211156124c157600080fd5b506124ce8882890161239b565b9150509295509295909350565b6000806000606084860312156124f057600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a08101612529606083018561218e565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006125606080830185611f96565b9050821515606083015295945050505050565b6000806040838503121561258657600080fd5b8235612591816122ac565b915060208301356001600160401b038111156125ac57600080fd5b6125b88582860161239b565b9150509250929050565b600080604083850312156125d557600080fd5b82356001600160401b03808211156125ec57600080fd5b6125f88683870161239b565b9350602085013591508082111561260e57600080fd5b506125b88582860161239b565b600181811c9082168061262f57607f821691505b60208210810361264f57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546126628161261b565b80855260206001838116801561267f5760018114612699576126c7565b60ff1985168884015283151560051b8801830195506126c7565b866000528260002060005b858110156126bf5781548a82018601529083019084016126a4565b890184019650505b505050505092915050565b602081526000611fef6020830184612655565b6000602082840312156126f757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115612727576127276126fe565b92915050565b634e487b7160e01b600052603260045260246000fd5b81810381811115612727576127276126fe565b601f8211156127a2576000816000526020600020601f850160051c8101602086101561277f5750805b601f850160051c820191505b8181101561279e5782815560010161278b565b5050505b505050565b81516001600160401b038111156127c0576127c0612243565b6127d4816127ce845461261b565b84612756565b602080601f83116001811461280957600084156127f15750858301515b600019600386901b1c1916600185901b17855561279e565b600085815260208120601f198616915b8281101561283857888601518255948401946001909101908401612819565b50858210156128565787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081546128738161261b565b6001828116801561288b57600181146128a0576128cf565b60ff19841687528215158302870194506128cf565b8560005260208060002060005b858110156128c65781548a8201529084019082016128ad565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b16815282601482015260006129036034830184612866565b95945050505050565b6000611fef8284612866565b60006001820161292a5761292a6126fe565b5060010190565b82815260406020820152600061294a6040830184612655565b949350505050565b60008261296f57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b60608152600060608201526080602082015260006129ab6080830185611f96565b82810360408401526129038185611f9656fea26469706673582212203eb0ce20128709ce0e25d07609542c5c1fd2df8b0d773b52b6377b98d8fada1f64736f6c63430008180033", "devdoc": { + "details": "Appeal and evidence submission is handled by the court.", "events": { - "DisputeRequest(address,uint256,uint256,uint256,string)": { - "details": "To be emitted when a dispute is created to link the correct meta-evidence to the disputeID.", + "DisputeRequest(address,uint256,uint256)": { "params": { "_arbitrator": "The arbitrator of the contract.", "_arbitratorDisputeID": "The identifier of the dispute in the Arbitrator contract.", - "_externalDisputeID": "An identifier created outside Kleros by the protocol requesting arbitration.", - "_templateId": "The identifier of the dispute template. Should not be used with _templateUri.", - "_templateUri": "The URI to the dispute template. For example on IPFS: starting with '/ipfs/'. Should not be used with _templateId." + "_templateId": "The identifier of the dispute template." } }, "ListSubmitted(uint256,address,uint256,string)": { - "details": "Emitted when a new list is submitted.", "params": { "_description": "The string in CSV format that contains labels of list's transactions. Note that the submitter may give bad descriptions of correct actions, but this is to be seen as UI enhancement, not a critical feature and that would play against him in case of dispute.", "_listID": "The index of the transaction list in the array of lists.", @@ -887,7 +981,6 @@ } }, "Ruling(address,uint256,uint256)": { - "details": "To be raised when a ruling is given.", "params": { "_arbitrator": "The arbitrator giving the ruling.", "_disputeID": "The identifier of the dispute in the Arbitrator contract.", @@ -898,45 +991,40 @@ "kind": "dev", "methods": { "changeArbitrator(address,bytes)": { - "details": "Changes the arbitrator of the contract. Note that it can't be changed during approval period because there can be an active dispute in the old arbitrator contract.", + "details": "It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract.", "params": { "_arbitrator": "The new trusted arbitrator.", "_arbitratorExtraData": "The extra data used by the new arbitrator." } }, "changeDisputeTemplate(string,string)": { - "details": "Update the dispute template data.", "params": { "_templateData": "The new dispute template data.", "_templateDataMappings": "The new dispute template data mappings." } }, "changeExecutionTimeout(uint256)": { - "details": "Changes the time allocated for list's execution.", "params": { "_executionTimeout": "The new duration of the execution timeout, in seconds." } }, "changeSubmissionDeposit(uint256)": { - "details": "Changes the value of the base deposit required for submitting a list.", "params": { "_submissionBaseDeposit": "The new value of the base deposit, in wei." } }, "changeSubmissionTimeout(uint256)": { - "details": "Changes the time allocated for submission. Note that it can't be changed during approval period because there can be an active dispute in the old arbitrator contract and prolonging submission timeout might switch it back to submission period.", + "details": "It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract and prolonging submission timeout might switch it back to submission period.", "params": { "_submissionTimeout": "The new duration of the submission period, in seconds." } }, "changeWithdrawTimeout(uint256)": { - "details": "Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period.", "params": { "_withdrawTimeout": "The new duration of withdraw period, in seconds." } }, "constructor": { - "details": "Constructor.", "params": { "_arbitrator": "The arbitrator of the contract.", "_arbitratorExtraData": "Extra data for the arbitrator.", @@ -946,14 +1034,14 @@ "_templateData": "The dispute template data.", "_templateDataMappings": "The dispute template data mappings.", "_templateRegistry": "Dispute Template registry address", + "_wNative": "The wrapped native token address, typically wETH.", "_withdrawTimeout": "Time in seconds after submission that allows to withdraw submitted list." } }, "executeSubmissions()": { - "details": "Approves a transaction list or creates a dispute if more than one list was submitted. If nothing was submitted changes session." + "details": "If nothing was submitted changes session." }, "executeTransactionList(uint256,uint256,uint256)": { - "details": "Executes selected transactions of the list.", "params": { "_count": "Number of transactions to execute. Executes until the end if set to \"0\" or number higher than number of transactions in the list.", "_cursor": "Index of the transaction from which to start executing.", @@ -961,25 +1049,21 @@ } }, "getCurrentSessionNumber()": { - "details": "Gets the number of the ongoing session.", "returns": { "_0": "The number of the ongoing session." } }, "getExpendableFunds()": { - "details": "Gets the sum of contract funds that are used for the execution of transactions.", "returns": { "_0": "Contract balance without reserved ETH." } }, "getNumberOfCreatedLists()": { - "details": "Gets the number of lists created in contract's lifetime.", "returns": { "_0": "The number of created lists." } }, "getNumberOfTransactions(uint256)": { - "details": "Gets the number of transactions in the list.", "params": { "_listID": "The index of the transaction list in the array of lists." }, @@ -988,13 +1072,11 @@ } }, "getSession(uint256)": { - "details": "Gets the session from the session index.", "returns": { "_session": "The session info." } }, "getSubmission(uint256)": { - "details": "Gets the submission from listId.", "params": { "_listId": "The index of the transaction list in the array of lists." }, @@ -1003,7 +1085,7 @@ } }, "getSubmittedLists(uint256)": { - "details": "Gets the array of submitted lists in the session. Note that this function is O(n), where n is the number of submissions in the session. This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts.", + "details": "This function is O(n), where `n` is the number of submissions in the session. This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts.", "params": { "_session": "The ID of the session." }, @@ -1012,13 +1094,11 @@ } }, "getTotalSubmissionDeposit()": { - "details": "Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost).", "returns": { "_requiredDeposit": "required deposit value" } }, "getTransactionInfo(uint256,uint256)": { - "details": "Gets the info of the specific transaction in the specific list.", "params": { "_listID": "The index of the transaction list in the array of lists.", "_transactionIndex": "The index of the transaction." @@ -1031,14 +1111,13 @@ } }, "rule(uint256,uint256)": { - "details": "Gives a ruling for a dispute. Must be called by the arbitrator.", + "details": "Must be called by the arbitrator.", "params": { "_disputeID": "ID of the dispute in the Arbitrator contract.", "_ruling": "Ruling given by the arbitrator. Note that 0 is reserved for \"Refuse to arbitrate\". Note If the final ruling is \"0\" nothing is approved and deposits will stay locked in the contract." } }, "submitList(address[],uint256[],bytes,uint256[],string)": { - "details": "Creates transaction list based on input parameters and submits it for potential approval and execution.", "params": { "_data": "Concatenated calldata of all transactions of this list.", "_dataSize": "List of lengths in bytes required to split calldata for its respective targets.", @@ -1048,33 +1127,108 @@ } }, "withdrawTransactionList(uint256,bytes32)": { - "details": "Withdraws submitted transaction list. Reimburses submission deposit. Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made.", + "details": "Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made.", "params": { "_listHash": "Hash of a withdrawing list.", "_submissionID": "Submission's index in the array of submitted lists of the current session." } } }, - "title": "KlerosGovernor for V2. Note that appeal functionality and evidence submission will be handled by the court.", + "title": "KlerosGovernor for V2.", "version": 1 }, "userdoc": { + "events": { + "DisputeRequest(address,uint256,uint256)": { + "notice": "To be emitted when a dispute is created to link the correct template to the disputeID." + }, + "ListSubmitted(uint256,address,uint256,string)": { + "notice": "Emitted when a new list is submitted." + }, + "Ruling(address,uint256,uint256)": { + "notice": "To be raised when a ruling is given." + } + }, "kind": "user", - "methods": {}, + "methods": { + "changeArbitrator(address,bytes)": { + "notice": "Changes the arbitrator of the contract." + }, + "changeDisputeTemplate(string,string)": { + "notice": "Update the dispute template data." + }, + "changeExecutionTimeout(uint256)": { + "notice": "Changes the time allocated for list's execution." + }, + "changeSubmissionDeposit(uint256)": { + "notice": "Changes the value of the base deposit required for submitting a list." + }, + "changeSubmissionTimeout(uint256)": { + "notice": "Changes the time allocated for submission." + }, + "changeWithdrawTimeout(uint256)": { + "notice": "Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period." + }, + "constructor": { + "notice": "Constructor." + }, + "executeSubmissions()": { + "notice": "Approves a transaction list or creates a dispute if more than one list was submitted." + }, + "executeTransactionList(uint256,uint256,uint256)": { + "notice": "Executes selected transactions of the list." + }, + "getCurrentSessionNumber()": { + "notice": "Gets the number of the ongoing session." + }, + "getExpendableFunds()": { + "notice": "Gets the sum of contract funds that are used for the execution of transactions." + }, + "getNumberOfCreatedLists()": { + "notice": "Gets the number of lists created in contract's lifetime." + }, + "getNumberOfTransactions(uint256)": { + "notice": "Gets the number of transactions in the list." + }, + "getSession(uint256)": { + "notice": "Gets the session from the session index." + }, + "getSubmission(uint256)": { + "notice": "Gets the submission from listId." + }, + "getSubmittedLists(uint256)": { + "notice": "Gets the array of submitted lists in the session." + }, + "getTotalSubmissionDeposit()": { + "notice": "Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost)." + }, + "getTransactionInfo(uint256,uint256)": { + "notice": "Gets the info of the specific transaction in the specific list." + }, + "rule(uint256,uint256)": { + "notice": "Gives a ruling for a dispute." + }, + "submitList(address[],uint256[],bytes,uint256[],string)": { + "notice": "Creates transaction list based on input parameters and submits it for potential approval and execution." + }, + "withdrawTransactionList(uint256,bytes32)": { + "notice": "Withdraws submitted transaction list. Reimburses submission deposit." + } + }, "version": 1 }, "storageLayout": { "storage": [ { - "astId": 378, + "astId": 386, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "arbitrator", "offset": 0, "slot": "0", - "type": "t_contract(IArbitratorV2)134" + "type": "t_contract(IArbitratorV2)133" }, { - "astId": 380, + "astId": 388, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "arbitratorExtraData", "offset": 0, @@ -1082,91 +1236,99 @@ "type": "t_bytes_storage" }, { - "astId": 383, + "astId": 390, "contract": "src/KlerosGovernor.sol:KlerosGovernor", - "label": "templateRegistry", + "label": "wNative", "offset": 0, "slot": "2", + "type": "t_address" + }, + { + "astId": 393, + "contract": "src/KlerosGovernor.sol:KlerosGovernor", + "label": "templateRegistry", + "offset": 0, + "slot": "3", "type": "t_contract(IDisputeTemplateRegistry)160" }, { - "astId": 385, + "astId": 395, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "templateId", "offset": 0, - "slot": "3", + "slot": "4", "type": "t_uint256" }, { - "astId": 387, + "astId": 397, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "submissionBaseDeposit", "offset": 0, - "slot": "4", + "slot": "5", "type": "t_uint256" }, { - "astId": 389, + "astId": 399, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "submissionTimeout", "offset": 0, - "slot": "5", + "slot": "6", "type": "t_uint256" }, { - "astId": 391, + "astId": 401, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "executionTimeout", "offset": 0, - "slot": "6", + "slot": "7", "type": "t_uint256" }, { - "astId": 393, + "astId": 403, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "withdrawTimeout", "offset": 0, - "slot": "7", + "slot": "8", "type": "t_uint256" }, { - "astId": 395, + "astId": 405, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "lastApprovalTime", "offset": 0, - "slot": "8", + "slot": "9", "type": "t_uint256" }, { - "astId": 397, + "astId": 407, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "reservedETH", "offset": 0, - "slot": "9", + "slot": "10", "type": "t_uint256" }, { - "astId": 401, + "astId": 411, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "submissions", "offset": 0, - "slot": "10", - "type": "t_array(t_struct(Submission)366_storage)dyn_storage" + "slot": "11", + "type": "t_array(t_struct(Submission)374_storage)dyn_storage" }, { - "astId": 405, + "astId": 415, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "sessions", "offset": 0, - "slot": "11", - "type": "t_array(t_struct(Session)338_storage)dyn_storage" + "slot": "12", + "type": "t_array(t_struct(Session)346_storage)dyn_storage" }, { - "astId": 411, + "astId": 421, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "alreadySubmitted", "offset": 0, - "slot": "12", + "slot": "13", "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))" } ], @@ -1181,20 +1343,20 @@ "label": "address payable", "numberOfBytes": "20" }, - "t_array(t_struct(Session)338_storage)dyn_storage": { - "base": "t_struct(Session)338_storage", + "t_array(t_struct(Session)346_storage)dyn_storage": { + "base": "t_struct(Session)346_storage", "encoding": "dynamic_array", "label": "struct KlerosGovernor.Session[]", "numberOfBytes": "32" }, - "t_array(t_struct(Submission)366_storage)dyn_storage": { - "base": "t_struct(Submission)366_storage", + "t_array(t_struct(Submission)374_storage)dyn_storage": { + "base": "t_struct(Submission)374_storage", "encoding": "dynamic_array", "label": "struct KlerosGovernor.Submission[]", "numberOfBytes": "32" }, - "t_array(t_struct(Transaction)347_storage)dyn_storage": { - "base": "t_struct(Transaction)347_storage", + "t_array(t_struct(Transaction)355_storage)dyn_storage": { + "base": "t_struct(Transaction)355_storage", "encoding": "dynamic_array", "label": "struct KlerosGovernor.Transaction[]", "numberOfBytes": "32" @@ -1220,7 +1382,7 @@ "label": "bytes", "numberOfBytes": "32" }, - "t_contract(IArbitratorV2)134": { + "t_contract(IArbitratorV2)133": { "encoding": "inplace", "label": "contract IArbitratorV2", "numberOfBytes": "20" @@ -1230,7 +1392,7 @@ "label": "contract IDisputeTemplateRegistry", "numberOfBytes": "20" }, - "t_enum(Status)323": { + "t_enum(Status)331": { "encoding": "inplace", "label": "enum KlerosGovernor.Status", "numberOfBytes": "1" @@ -1249,12 +1411,12 @@ "numberOfBytes": "32", "value": "t_mapping(t_bytes32,t_bool)" }, - "t_struct(Session)338_storage": { + "t_struct(Session)346_storage": { "encoding": "inplace", "label": "struct KlerosGovernor.Session", "members": [ { - "astId": 325, + "astId": 333, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "ruling", "offset": 0, @@ -1262,7 +1424,7 @@ "type": "t_uint256" }, { - "astId": 327, + "astId": 335, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "disputeID", "offset": 0, @@ -1270,7 +1432,7 @@ "type": "t_uint256" }, { - "astId": 330, + "astId": 338, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "submittedLists", "offset": 0, @@ -1278,7 +1440,7 @@ "type": "t_array(t_uint256)dyn_storage" }, { - "astId": 332, + "astId": 340, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "sumDeposit", "offset": 0, @@ -1286,15 +1448,15 @@ "type": "t_uint256" }, { - "astId": 335, + "astId": 343, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "status", "offset": 0, "slot": "4", - "type": "t_enum(Status)323" + "type": "t_enum(Status)331" }, { - "astId": 337, + "astId": 345, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "durationOffset", "offset": 0, @@ -1304,12 +1466,12 @@ ], "numberOfBytes": "192" }, - "t_struct(Submission)366_storage": { + "t_struct(Submission)374_storage": { "encoding": "inplace", "label": "struct KlerosGovernor.Submission", "members": [ { - "astId": 349, + "astId": 357, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "submitter", "offset": 0, @@ -1317,7 +1479,7 @@ "type": "t_address_payable" }, { - "astId": 351, + "astId": 359, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "deposit", "offset": 0, @@ -1325,15 +1487,15 @@ "type": "t_uint256" }, { - "astId": 355, + "astId": 363, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "txs", "offset": 0, "slot": "2", - "type": "t_array(t_struct(Transaction)347_storage)dyn_storage" + "type": "t_array(t_struct(Transaction)355_storage)dyn_storage" }, { - "astId": 357, + "astId": 365, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "listHash", "offset": 0, @@ -1341,7 +1503,7 @@ "type": "t_bytes32" }, { - "astId": 359, + "astId": 367, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "submissionTime", "offset": 0, @@ -1349,7 +1511,7 @@ "type": "t_uint256" }, { - "astId": 361, + "astId": 369, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "approved", "offset": 0, @@ -1357,7 +1519,7 @@ "type": "t_bool" }, { - "astId": 363, + "astId": 371, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "approvalTime", "offset": 0, @@ -1365,7 +1527,7 @@ "type": "t_uint256" }, { - "astId": 365, + "astId": 373, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "submissionBlock", "offset": 0, @@ -1375,12 +1537,12 @@ ], "numberOfBytes": "256" }, - "t_struct(Transaction)347_storage": { + "t_struct(Transaction)355_storage": { "encoding": "inplace", "label": "struct KlerosGovernor.Transaction", "members": [ { - "astId": 340, + "astId": 348, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "target", "offset": 0, @@ -1388,7 +1550,7 @@ "type": "t_address" }, { - "astId": 342, + "astId": 350, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "value", "offset": 0, @@ -1396,7 +1558,7 @@ "type": "t_uint256" }, { - "astId": 344, + "astId": 352, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "data", "offset": 0, @@ -1404,7 +1566,7 @@ "type": "t_bytes_storage" }, { - "astId": 346, + "astId": 354, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "executed", "offset": 0, diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 8c966dd..149deb7 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -2,6 +2,7 @@ import * as dotenv from "dotenv"; import { HardhatUserConfig } from "hardhat/config"; import "@nomicfoundation/hardhat-chai-matchers"; +import "@nomicfoundation/hardhat-verify"; import "@nomiclabs/hardhat-solhint"; import "@typechain/hardhat"; import "hardhat-gas-reporter"; @@ -66,7 +67,7 @@ const config: HardhatUserConfig = { verify: { etherscan: { apiUrl: "https://api-sepolia.arbiscan.io", - apiKey: process.env.ARBISCAN_API_KEY, + apiKey: process.env.ETHERSCAN_API_KEY, }, }, }, @@ -80,7 +81,7 @@ const config: HardhatUserConfig = { verify: { etherscan: { apiUrl: "https://api-sepolia.arbiscan.io", - apiKey: process.env.ARBISCAN_API_KEY, + apiKey: process.env.ETHERSCAN_API_KEY, }, }, }, @@ -93,7 +94,7 @@ const config: HardhatUserConfig = { tags: ["production", "home", "layer2"], verify: { etherscan: { - apiKey: process.env.ARBISCAN_API_KEY, + apiKey: process.env.ETHERSCAN_API_KEY, }, }, }, @@ -150,6 +151,9 @@ const config: HardhatUserConfig = { apiKey: process.env.ETHERSCAN_API_KEY_FIX, }, }, + etherscan: { + apiKey: process.env.ETHERSCAN_API_KEY_FIX, + }, watcher: { compilation: { tasks: ["compile"], diff --git a/contracts/package.json b/contracts/package.json index 7b22917..eb972ae 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -57,7 +57,7 @@ "@nomicfoundation/hardhat-chai-matchers": "^2.0.8", "@nomicfoundation/hardhat-ethers": "^3.0.8", "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomicfoundation/hardhat-verify": "^2.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.14", "@nomiclabs/hardhat-solhint": "^4.0.1", "@openzeppelin/contracts": "^5.2.0", "@typechain/ethers-v6": "^0.5.1", @@ -90,6 +90,6 @@ "wagmi": "^2.15.4" }, "dependencies": { - "@kleros/kleros-v2-contracts": "^0.12.0" + "@kleros/kleros-v2-contracts": "^2.0.0-rc.1" } } diff --git a/contracts/scripts/dotenv.sh b/contracts/scripts/dotenv.sh new file mode 100755 index 0000000..8f8d8ce --- /dev/null +++ b/contracts/scripts/dotenv.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" + +varKey=$1 + +if [ -z "$varKey" ]; then + echo "Env variable name not provided. Exiting..." >&2 + exit 1 +fi + +node -e " + require('dotenv').config({ path: '"$SCRIPT_DIR"/../.env' }) + console.log(process.env.$varKey) +" \ No newline at end of file diff --git a/contracts/scripts/verifyProxies.sh b/contracts/scripts/verifyProxies.sh index 31dec9f..818c828 100755 --- a/contracts/scripts/verifyProxies.sh +++ b/contracts/scripts/verifyProxies.sh @@ -2,12 +2,13 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -# Etherscan docs: https://docs.etherscan.io/api-endpoints/contracts#verifying-proxy-contract-using-curl +# Etherscan docs: https://docs.etherscan.io/etherscan-v2/api-endpoints/contracts#verifying-proxy-contract-using-curl -function verify() { #deploymentDir #explorerApiUrl #apiKey +function verify() { #deploymentDir #explorerApiUrl #apiKey #chainId deploymentDir=$1 explorerApiUrl=$2 apiKey=$3 + chainId=$4 echo "verifying proxies on $(basename $deploymentDir)" for f in $(ls -1 $deploymentDir/*_Proxy.json 2>/dev/null); do contractName=$(basename $f .json) @@ -15,15 +16,19 @@ function verify() { #deploymentDir #explorerApiUrl #apiKey echo -n "verifying $contractName as a proxy at $address... " curl -s \ -d "address=$address" \ - "$explorerApiUrl?module=contract&action=verifyproxycontract&apikey=$apiKey" + "$explorerApiUrl?chainid=${chainId}&module=contract&action=verifyproxycontract&apikey=$apiKey" echo done } -apiKey=$($SCRIPT_DIR/dotenv.sh ARBISCAN_API_KEY) +apiKey=$($SCRIPT_DIR/dotenv.sh ETHERSCAN_API_KEY) +if [ -z "$apiKey" ]; then + echo "API key missing" + exit 1 +fi -verify "$SCRIPT_DIR/../deployments/arbitrumSepoliaDevnet" "https://api-sepolia.arbiscan.io/api" $apiKey +verify "$SCRIPT_DIR/../deployments/arbitrumSepoliaDevnet" "https://api.etherscan.io/v2/api" $apiKey 421614 echo -verify "$SCRIPT_DIR/../deployments/arbitrumSepolia" "https://api-sepolia.arbiscan.io/api" $apiKey +verify "$SCRIPT_DIR/../deployments/arbitrumSepolia" "https://api.etherscan.io/v2/api" $apiKey 421614 echo -verify "$SCRIPT_DIR/../deployments/arbitrum" "https://api.arbiscan.io/api" $apiKey +verify "$SCRIPT_DIR/../deployments/arbitrum" "https://api.etherscan.io/v2/api" $apiKey 42161 diff --git a/yarn.lock b/yarn.lock index a17891f..59cdf2a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3202,12 +3202,12 @@ __metadata: "@kleros/governor-v2-eslint-config": "workspace:^" "@kleros/governor-v2-prettier-config": "workspace:^" "@kleros/governor-v2-tsconfig": "workspace:^" - "@kleros/kleros-v2-contracts": "npm:^0.12.0" + "@kleros/kleros-v2-contracts": "npm:^2.0.0-rc.1" "@logtail/pino": "npm:^0.4.0" "@nomicfoundation/hardhat-chai-matchers": "npm:^2.0.8" "@nomicfoundation/hardhat-ethers": "npm:^3.0.8" "@nomicfoundation/hardhat-network-helpers": "npm:^1.0.0" - "@nomicfoundation/hardhat-verify": "npm:^2.0.0" + "@nomicfoundation/hardhat-verify": "npm:^2.0.14" "@nomiclabs/hardhat-solhint": "npm:^4.0.1" "@openzeppelin/contracts": "npm:^5.2.0" "@typechain/ethers-v6": "npm:^0.5.1" @@ -3284,13 +3284,23 @@ __metadata: languageName: unknown linkType: soft -"@kleros/kleros-v2-contracts@npm:^0.12.0": - version: 0.12.0 - resolution: "@kleros/kleros-v2-contracts@npm:0.12.0" +"@kleros/kleros-v2-contracts@npm:^0.7.0": + version: 0.7.0 + resolution: "@kleros/kleros-v2-contracts@npm:0.7.0" + dependencies: + "@kleros/vea-contracts": "npm:^0.4.0" + viem: "npm:^2.21.35" + checksum: 78c9762e45393eb3247755c6f9e39c8ec9020793918aca6e3fe7d970522eae91e16f9e81e653c3f05c26c375a4a5447889680cebdccedbf9a24345e74b289883 + languageName: node + linkType: hard + +"@kleros/kleros-v2-contracts@npm:^2.0.0-rc.1": + version: 2.0.0-rc.1 + resolution: "@kleros/kleros-v2-contracts@npm:2.0.0-rc.1" dependencies: "@chainlink/contracts": "npm:^1.4.0" - "@kleros/vea-contracts": "npm:^0.6.0" - "@openzeppelin/contracts": "npm:^5.4.0" + "@kleros/vea-contracts": "npm:^0.7.0" + "@openzeppelin/contracts": "npm:^5.5.0" "@shutter-network/shutter-sdk": "npm:0.0.2" isomorphic-fetch: "npm:^3.0.0" peerDependencies: @@ -3298,17 +3308,7 @@ __metadata: peerDependenciesMeta: viem: optional: false - checksum: 6b06670686246bc52355a5e103b268bc4faa4e634a2b0a5a0151bf47e631317378559701cce5163c9904adac917f1c7c2d668f09b5259bb4c1d984904b471163 - languageName: node - linkType: hard - -"@kleros/kleros-v2-contracts@npm:^0.7.0": - version: 0.7.0 - resolution: "@kleros/kleros-v2-contracts@npm:0.7.0" - dependencies: - "@kleros/vea-contracts": "npm:^0.4.0" - viem: "npm:^2.21.35" - checksum: 78c9762e45393eb3247755c6f9e39c8ec9020793918aca6e3fe7d970522eae91e16f9e81e653c3f05c26c375a4a5447889680cebdccedbf9a24345e74b289883 + checksum: abfea0e4bdae6f8cbe7901a9a934916a78aef99117580e157b20c32aad2f0b99fc1974551bc3eed3b44f9058624b2a1e8d3e1f0b1a39c19a51d9c10cc6ee5b41 languageName: node linkType: hard @@ -3346,10 +3346,10 @@ __metadata: languageName: node linkType: hard -"@kleros/vea-contracts@npm:^0.6.0": - version: 0.6.0 - resolution: "@kleros/vea-contracts@npm:0.6.0" - checksum: 1dafd94620d3392c2e00e09e7d1ca923007143f8625b4b584411a7b49404ae5630e870d3e260685964d37ccb9c4c4ab406523b8ec4dd9f89bcf6099a4f5976ec +"@kleros/vea-contracts@npm:^0.7.0": + version: 0.7.0 + resolution: "@kleros/vea-contracts@npm:0.7.0" + checksum: bba12886020cd4bfce39938de56edf2b56472627871ef91b10b721de655e5c20f632a8cb57679927d868375218007898b12033d769b7d33cd3f18447ca093896 languageName: node linkType: hard @@ -4111,9 +4111,9 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/hardhat-verify@npm:^2.0.0": - version: 2.0.12 - resolution: "@nomicfoundation/hardhat-verify@npm:2.0.12" +"@nomicfoundation/hardhat-verify@npm:^2.0.14": + version: 2.1.3 + resolution: "@nomicfoundation/hardhat-verify@npm:2.1.3" dependencies: "@ethersproject/abi": "npm:^5.1.2" "@ethersproject/address": "npm:^5.0.2" @@ -4125,8 +4125,8 @@ __metadata: table: "npm:^6.8.0" undici: "npm:^5.14.0" peerDependencies: - hardhat: ^2.0.4 - checksum: ec7bdf2e5bf584abcea17a64f3da73cb792dc3af19db3a99fe0196f5314cab82b43af6984fa11233c76190049e8ab81ef0fcfcd1cd1992a4a455a65937f6b69e + hardhat: ^2.26.0 + checksum: ae3f0a55edae5ffd852dca6f71f50e47cc3f9653832717fca875e181068155c9f5990aa3b1b1d11b448af9a343adc4e8a2256223ba4ddf88d07aad65887e676d languageName: node linkType: hard @@ -4317,10 +4317,10 @@ __metadata: languageName: node linkType: hard -"@openzeppelin/contracts@npm:^5.4.0": - version: 5.4.0 - resolution: "@openzeppelin/contracts@npm:5.4.0" - checksum: 4f7f926ebd98279ba8223cae5d2cd38e0806e60e3e3a615c9d739ffab870ffab7a1e85f47092faa123c0f26d1699ca15252adea8bcdcaf360b21781acc93b218 +"@openzeppelin/contracts@npm:^5.5.0": + version: 5.5.0 + resolution: "@openzeppelin/contracts@npm:5.5.0" + checksum: 5eb1a201e2e324280292077f68c8a4a2e450762798d3c990741b540b1b218c4fed143901647f8519e9abe239017bd29a455cb7e43aff25918ef110e4cdea7013 languageName: node linkType: hard From dca0ba34609a83b5c7596b18c88fccbc8db8b0a6 Mon Sep 17 00:00:00 2001 From: Harman-singh-waraich Date: Tue, 18 Nov 2025 18:45:17 +0530 Subject: [PATCH 4/6] feat(contracts): update-template-and-redeploy-contracts --- contracts/.env.example | 5 + contracts/.gitignore | 1 + contracts/README.md | 178 ++++++++++++++++++ contracts/deploy/utils/disputeTemplate.ts | 19 +- .../GovernorFactory.json | 37 ++-- .../arbitrumSepoliaDevnet/KlerosGovernor.json | 174 ++++++++++------- contracts/hardhat.config.ts | 2 +- contracts/src/KlerosGovernor.sol | 5 +- 8 files changed, 328 insertions(+), 93 deletions(-) create mode 100644 contracts/.env.example create mode 100644 contracts/README.md diff --git a/contracts/.env.example b/contracts/.env.example new file mode 100644 index 0000000..eb6e752 --- /dev/null +++ b/contracts/.env.example @@ -0,0 +1,5 @@ +export PRIVATE_KEY = "" +export MAINNET_PRIVATE_KEY = "" +export INFURA_API_KEY = "" +export ETHERSCAN_API_KEY_FIX="" +export ETHERSCAN_API_KEY="" \ No newline at end of file diff --git a/contracts/.gitignore b/contracts/.gitignore index 0346290..47e38ff 100644 --- a/contracts/.gitignore +++ b/contracts/.gitignore @@ -183,6 +183,7 @@ tags # End of https://www.toptal.com/developers/gitignore/api/vim,node,visualstudiocode,yarn .env* +!.env.example .flaskenv* !.env.project .env.vault diff --git a/contracts/README.md b/contracts/README.md new file mode 100644 index 0000000..4879c7c --- /dev/null +++ b/contracts/README.md @@ -0,0 +1,178 @@ +# @kleros/governor-v2-contracts + +Smart contracts for GovernorV2 + +## Deployments + +Refresh the list of deployed contracts by running `./scripts/generateDeploymentsMarkdown.sh` or `./scripts/populateReadme.sh`. + +### Official Testnet + +#### Arbitrum Sepolia + +#### Sepolia + +### Devnet + +#### Arbitrum Sepolia + +- [GovernorFactory](https://sepolia.arbiscan.io/address/0xb98AEdAa01D0e821278d68f2A2A13FbdB2d81A33) +- [KlerosGovernor](https://sepolia.arbiscan.io/address/0x52e6766e6C4fB05Caec92e5318668b3E366D649a) +- [WETH](https://sepolia.arbiscan.io/address/0x3829A2486d53ee984a0ca2D76552715726b77138) + +#### Sepolia + +## Getting Started + +### Install the Dependencies + +```bash +yarn install +``` + +### Run Tests + +```bash +yarn test +``` + +### Compile the Contracts + +```bash +yarn build +``` + +### Run Linter on Files + +```bash +yarn lint +``` + +### Fix Linter Issues on Files + +```bash +yarn fix +``` + +### Deploy Instructions + +**NOTICE:** the commands below work only if you are inside the `contracts/` directory. + +#### 0. Set the Environment Variables + +Copy `.env.example` file as `.env` and edit it accordingly. + +```bash +cp .env.example .env +``` + +The following env vars are required: + +- `PRIVATE_KEY`: the private key of the deployer account used for the testnets. +- `MAINNET_PRIVATE_KEY`: the private key of the deployer account used for Mainnet. +- `INFURA_API_KEY`: the API key for infura. + +The ones below are optional: + +- `ETHERSCAN_API_KEY`: to verify the source of the newly deployed contracts on **Etherscan**. +- `ARBISCAN_API_KEY`: to verify the source of the newly deployed contracts on **Arbitrum**. +- `GNOSISSCAN_API_KEY`: to verify the source of the newly deployed contracts on **Gnosis chain**. + +#### 1. Deploy to a Local Network + +:warning: There is no mocks deployed for the kleros-v2 contracts currently so this would fail. For now consider deploying to a testnet fork (next section). + +**Shell 1: the node** + +```bash +yarn hardhat node --tags nothing +``` + +**Shell 2: the deploy script** + +```bash +yarn deploy --network localhost --tags GovernorV2 +``` + +#### 2. Deploy to a Public Network Fork + +**Shell 1: the node** + +```bash +yarn start-devnet-fork +# or +yarn start-testnet-fork +``` + +**Shell 2: the deploy script** + +```bash +yarn deploy-devnet-fork +# or +yarn deploy-testnet-fork +``` + +#### 3. Deploy to Public Testnets + +```bash +yarn deploy --network arbitrumSepolia --tags GovernorV2 +``` + +The deployed addresses should be displayed to the screen after the deployment is complete. If you missed them, you can always go to the `deployments/` directory and look for the respective file. + +#### 4. Deploy a Devnet on Public Testnets + +Same steps as above but append `Devnet` to the `--network` parameter. + +#### Running Test Fixtures + +**Shell 1: the node** + +```bash +yarn hardhat node --tags GovernorV2 +``` + +**Shell 2: the test scripts** + +```bash +yarn test --network localhost +``` + +#### 4. Verify the Source Code + +This must be done for each network separately. + +```bash +# explorer +yarn etherscan-verify --network arbitrumSepolia +yarn etherscan-verify-proxies + +# sourcify +yarn sourcify --network arbitrumSepolia + +``` + +## Ad-hoc procedures + +### Generate deployment artifacts for existing contracts + +#### Usage + +```bash +scripts/generateDeploymentArtifact.sh
+``` + +#### Example: WETH on Gnosis chain + +```bash +scripts/generateDeploymentArtifact.sh gnosischain 0xf8d1677c8a0c961938bf2f9adc3f3cfda759a9d9 > deployments/gnosischain/WETH.json +``` + +### Push the contracts to a Tenderly project + +Ensure that your `$TENDERLY_PROJECT` and `$TENDERLY_USERNAME` is set correctly in `.env`. + +```bash +yarn tenderly-verify --network sepolia +yarn tenderly-verify --network arbitrumSepolia +``` diff --git a/contracts/deploy/utils/disputeTemplate.ts b/contracts/deploy/utils/disputeTemplate.ts index 947f42e..35a24e7 100644 --- a/contracts/deploy/utils/disputeTemplate.ts +++ b/contracts/deploy/utils/disputeTemplate.ts @@ -2,7 +2,7 @@ export const templateFn = (arbitratorAddress: string, arbitrableChainID: number) => `{ "$schema": "../NewDisputeTemplate.schema.json", "title": "Execute a transaction list in Kleros Governor", - "description": "Multiple transaction lists were submitted in Kleros Governor session {{externalDisputeID}}, please vote for which list transaction list should be executed.", + "description": "Multiple transaction lists were submitted in Kleros Governor session {{sessionIndex}}, please vote for which list transaction list should be executed.\\n\\nBelow are the available lists:\\n\\n{{#listIds}}- **List {{.}}** → [View Transactions](https://governor-v2.kleros.builders/governor/{{arbitrableAddress}}?listId={{.}})\\n{{/listIds}}", "question": "Which transaction list should be executed?", "answers": [ {{#listIds}} @@ -31,13 +31,28 @@ export const templateFn = (arbitratorAddress: string, arbitrableChainID: number) export const dataMappings = ` [ + { + "type": "abi/call", + "abi": "function arbitratorDisputeIDToSessionIndex(uint256) view returns (uint256)", + "address": "{{{arbitrableAddress}}}", + "functionName": "arbitratorDisputeIDToSessionIndex", + "args": [ + "{{{arbitratorDisputeID}}}" + ], + "seek": [ + "value" + ], + "populate": [ + "sessionIndex" + ] + }, { "type": "abi/call", "abi": "function getSession(uint256) view returns ((uint256 , uint256 , uint256[] , uint256 , uint8 , uint256 ))", "address": "{{{arbitrableAddress}}}", "functionName": "getSession", "args": [ - "{{{externalDisputeID}}}" + "{{{sessionIndex}}}" ], "seek": [ "2" diff --git a/contracts/deployments/arbitrumSepoliaDevnet/GovernorFactory.json b/contracts/deployments/arbitrumSepoliaDevnet/GovernorFactory.json index c8f21e5..ad56c9b 100644 --- a/contracts/deployments/arbitrumSepoliaDevnet/GovernorFactory.json +++ b/contracts/deployments/arbitrumSepoliaDevnet/GovernorFactory.json @@ -1,5 +1,5 @@ { - "address": "0x46E3D4B6BFf95eee12ae4C3A3bC6a2f17C309Fc1", + "address": "0xb98AEdAa01D0e821278d68f2A2A13FbdB2d81A33", "abi": [ { "anonymous": false, @@ -92,28 +92,28 @@ "type": "function" } ], - "transactionHash": "0xebccc0abd28e439497f91730e0bbc009cbea433359c0133695c85479510d8fd8", + "transactionHash": "0x98d9df2795efe63485af9cc222bbccf21e60bb18bd3d83c20ed565b5dd5f2ed2", "receipt": { "to": null, "from": "0x88AB19C0c7b57EeBa545acbD4368748194cd796B", - "contractAddress": "0x46E3D4B6BFf95eee12ae4C3A3bC6a2f17C309Fc1", + "contractAddress": "0xb98AEdAa01D0e821278d68f2A2A13FbdB2d81A33", "transactionIndex": 1, - "gasUsed": "2897040", + "gasUsed": "2917301", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xccf85552a3febb677e55f5f9e6bc40509d98c86294fcafbe8cec1fa87ae8b0dd", - "transactionHash": "0xebccc0abd28e439497f91730e0bbc009cbea433359c0133695c85479510d8fd8", + "blockHash": "0x721c632137eb393322bd7d7aa7c63e4e1bba1904ca9fc514e6cdf544c15ff1e9", + "transactionHash": "0x98d9df2795efe63485af9cc222bbccf21e60bb18bd3d83c20ed565b5dd5f2ed2", "logs": [], - "blockNumber": 216121450, - "cumulativeGasUsed": "2897040", + "blockNumber": 216449511, + "cumulativeGasUsed": "2917301", "status": 1, "byzantium": true }, "args": [], - "numDeployments": 11, - "solcInputHash": "334f9bb4703835bd27add7ada7992ca0", - "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract KlerosGovernor\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"NewGovernor\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_arbitratorExtraData\",\"type\":\"bytes\"},{\"internalType\":\"contract IDisputeTemplateRegistry\",\"name\":\"_templateRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_templateData\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_templateDataMappings\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_submissionBaseDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_submissionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_executionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_withdrawTimeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_wNative\",\"type\":\"address\"}],\"name\":\"deploy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"instances\",\"outputs\":[{\"internalType\":\"contract KlerosGovernor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"NewGovernor(address)\":{\"details\":\"Emitted when a new Governor contract is deployed using this factory.\",\"params\":{\"_address\":\"The address of the newly deployed Governor contract.\"}}},\"kind\":\"dev\",\"methods\":{\"deploy(address,bytes,address,string,string,uint256,uint256,uint256,uint256,address)\":{\"details\":\"Deploy the arbitrable kleros.\",\"params\":{\"_arbitrator\":\"The arbitrator of the contract.\",\"_arbitratorExtraData\":\"Extra data for the arbitrator.\",\"_executionTimeout\":\"Time in seconds after approval that allows to execute transactions of the approved list.\",\"_submissionBaseDeposit\":\"The base deposit required for submission.\",\"_submissionTimeout\":\"Time in seconds allocated for submitting transaction list.\",\"_templateData\":\"The dispute template data.\",\"_templateDataMappings\":\"The dispute template data mappings.\",\"_templateRegistry\":\"Dispute Template registry address\",\"_withdrawTimeout\":\"Time in seconds after submission that allows to withdraw submitted list.\"}}},\"title\":\"GovernorFactory This contract acts as a registry for KlerosGovernor instances.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/GovernorFactory.sol\":\"GovernorFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[]},\"sources\":{\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport {IArbitratorV2} from \\\"./IArbitratorV2.sol\\\";\\n\\n/// @title IArbitrableV2\\n/// @notice Arbitrable interface.\\n/// @dev When developing arbitrable contracts, we need to:\\n/// - Define the action taken when a ruling is received by the contract.\\n/// - Allow dispute creation which calls `arbitrator.createDispute{value: _fee}(_choices,_extraData)`.\\ninterface IArbitrableV2 {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a dispute is created to link the correct template to the disputeID.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorDisputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _templateId The identifier of the dispute template.\\n event DisputeRequest(IArbitratorV2 indexed _arbitrator, uint256 indexed _arbitratorDisputeID, uint256 _templateId);\\n\\n /// @notice To be raised when a ruling is given.\\n /// @param _arbitrator The arbitrator giving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitratorV2 indexed _arbitrator, uint256 indexed _disputeID, uint256 _ruling);\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Give a ruling for a dispute.\\n ///\\n /// @dev This is a callback function for the arbitrator to provide the ruling to this contract.\\n /// Only the arbitrator must be allowed to call this function.\\n /// Ruling 0 is reserved for \\\"Not able/wanting to make a decision\\\".\\n ///\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator.\\n function rule(uint256 _disputeID, uint256 _ruling) external;\\n}\\n\",\"keccak256\":\"0x97c6455e4b9f57e76f338f43eea612ea47ac933dda85c08ef29d418e34879a9b\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitratorV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport {IArbitrableV2} from \\\"./IArbitrableV2.sol\\\";\\n\\n/// @title Arbitrator\\n/// @notice Arbitrator interface for the Kleros V2 protocol.\\n/// @dev Unlike the ERC-792 this standard is not concerned with appeals, so each arbitrator can implement an appeal system that suits it the most.\\ninterface IArbitratorV2 {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a dispute is created.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _arbitrable The contract which created the dispute.\\n event DisputeCreation(uint256 indexed _disputeID, IArbitrableV2 indexed _arbitrable);\\n\\n /// @notice To be raised when a ruling is given.\\n /// @param _arbitrable The arbitrable receiving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitrableV2 indexed _arbitrable, uint256 indexed _disputeID, uint256 _ruling);\\n\\n /// @notice To be emitted when an ERC20 token is added or removed as a method to pay fees.\\n /// @param _token The ERC20 token.\\n /// @param _accepted Whether the token is accepted or not.\\n event AcceptedFeeToken(IERC20 indexed _token, bool indexed _accepted);\\n\\n /// @notice To be emitted when the fee for a particular ERC20 token is updated.\\n /// @param _feeToken The ERC20 token.\\n /// @param _rateInEth The new rate of the fee token in ETH.\\n /// @param _rateDecimals The new decimals of the fee token rate.\\n event NewCurrencyRate(IERC20 indexed _feeToken, uint64 _rateInEth, uint8 _rateDecimals);\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Create a dispute and pay for the fees in the native currency, typically ETH.\\n /// @dev Must be called by the arbitrable contract and pay at least `arbitrationCost(_extraData)` in ETH.\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData\\n ) external payable returns (uint256 disputeID);\\n\\n /// @notice Create a dispute and pay for the fees in a supported ERC20 token.\\n /// @dev Must be called by the arbitrable contract and pay at least `arbitrationCost(_extraData, _feeToken)` in the supported ERC20 token.\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @param _feeAmount Amount of the ERC20 token used to pay fees.\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData,\\n IERC20 _feeToken,\\n uint256 _feeAmount\\n ) external returns (uint256 disputeID);\\n\\n // ************************************* //\\n // * Public Views * //\\n // ************************************* //\\n\\n /// @notice Compute the cost of arbitration denominated in the native currency, typically ETH.\\n /// @dev It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return cost The arbitration cost in ETH.\\n function arbitrationCost(bytes calldata _extraData) external view returns (uint256 cost);\\n\\n /// @notice Compute the cost of arbitration denominated in `_feeToken`.\\n /// @dev It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @return cost The arbitration cost in `_feeToken`.\\n function arbitrationCost(bytes calldata _extraData, IERC20 _feeToken) external view returns (uint256 cost);\\n\\n /// @notice Gets the current ruling of a specified dispute.\\n /// @param _disputeID The ID of the dispute.\\n /// @return ruling The current ruling.\\n /// @return tied Whether it's a tie or not.\\n /// @return overridden Whether the ruling was overridden by appeal funding or not.\\n function currentRuling(uint256 _disputeID) external view returns (uint256 ruling, bool tied, bool overridden);\\n}\\n\",\"keccak256\":\"0x1f4e84e23034f3a291e305e8c69f283c9c97354a49a24f8c02ca366b3eaae00f\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\n/// @title IDisputeTemplateRegistry\\n/// @notice Dispute Template Registry interface.\\ninterface IDisputeTemplateRegistry {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a new dispute template is created.\\n /// @param _templateId The identifier of the dispute template.\\n /// @param _templateTag An optional tag for the dispute template, such as \\\"registration\\\" or \\\"removal\\\".\\n /// @param _templateData The template data.\\n /// @param _templateDataMappings The data mappings.\\n event DisputeTemplate(\\n uint256 indexed _templateId,\\n string indexed _templateTag,\\n string _templateData,\\n string _templateDataMappings\\n );\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Registers a new dispute template.\\n /// @param _templateTag An optional tag for the dispute template, such as \\\"registration\\\" or \\\"removal\\\".\\n /// @param _templateData The template data.\\n /// @param _templateDataMappings The data mappings for the template.\\n /// @return templateId The identifier of the dispute template.\\n function setDisputeTemplate(\\n string memory _templateTag,\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external returns (uint256 templateId);\\n}\\n\",\"keccak256\":\"0x1d6ad6549baabcbfe306ac3a9a3c339bb2d5dcb67fa9f3c5eaed0c9bd3548b12\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\"},\"src/GovernorFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.24;\\n\\nimport {IArbitratorV2} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\\\";\\nimport \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\\\";\\nimport {KlerosGovernor} from \\\"./KlerosGovernor.sol\\\";\\n\\n/// @title GovernorFactory\\n/// This contract acts as a registry for KlerosGovernor instances.\\ncontract GovernorFactory {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @dev Emitted when a new Governor contract is deployed using this factory.\\n /// @param _address The address of the newly deployed Governor contract.\\n event NewGovernor(KlerosGovernor indexed _address);\\n\\n // ************************************* //\\n // * Storage * //\\n // ************************************* //\\n\\n KlerosGovernor[] public instances;\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @dev Deploy the arbitrable kleros.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorExtraData Extra data for the arbitrator.\\n /// @param _templateRegistry Dispute Template registry address\\n /// @param _templateData The dispute template data.\\n /// @param _templateDataMappings The dispute template data mappings.\\n /// @param _submissionBaseDeposit The base deposit required for submission.\\n /// @param _submissionTimeout Time in seconds allocated for submitting transaction list.\\n /// @param _executionTimeout Time in seconds after approval that allows to execute transactions of the approved list.\\n /// @param _withdrawTimeout Time in seconds after submission that allows to withdraw submitted list.\\n function deploy(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData,\\n IDisputeTemplateRegistry _templateRegistry,\\n string memory _templateData,\\n string memory _templateDataMappings,\\n uint256 _submissionBaseDeposit,\\n uint256 _submissionTimeout,\\n uint256 _executionTimeout,\\n uint256 _withdrawTimeout,\\n address _wNative\\n ) public {\\n KlerosGovernor instance = new KlerosGovernor(\\n _arbitrator,\\n _arbitratorExtraData,\\n _templateRegistry,\\n _templateData,\\n _templateDataMappings,\\n _submissionBaseDeposit,\\n _submissionTimeout,\\n _executionTimeout,\\n _withdrawTimeout,\\n _wNative\\n );\\n instances.push(instance);\\n emit NewGovernor(instance);\\n }\\n}\\n\",\"keccak256\":\"0xea0abdd2f86794314f386dfae08caa76f188262b9737c78e5fbda898321b5ec5\",\"license\":\"MIT\"},\"src/KlerosGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.24;\\n\\nimport {IArbitrableV2, IArbitratorV2} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\\\";\\nimport \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\\\";\\nimport {SafeSend} from \\\"./libraries/SafeSend.sol\\\";\\nimport \\\"./interfaces/IArbSys.sol\\\";\\n\\n/// @title KlerosGovernor for V2.\\n/// @dev Appeal and evidence submission is handled by the court.\\ncontract KlerosGovernor is IArbitrableV2 {\\n using SafeSend for address payable;\\n\\n // ************************************* //\\n // * Enums / Structs * //\\n // ************************************* //\\n\\n enum Status {\\n NoDispute,\\n DisputeCreated,\\n Resolved\\n }\\n\\n struct Session {\\n uint256 ruling; // The ruling that was given in this session, if any.\\n uint256 disputeID; // ID given to the dispute of the session, if any.\\n uint256[] submittedLists; // Tracks all lists that were submitted in a session in the form submittedLists[submissionID].\\n uint256 sumDeposit; // Sum of all submission deposits in a session (minus arbitration fees). This is used to calculate the reward.\\n Status status; // Status of a session.\\n uint256 durationOffset; // Time in seconds that prolongs the submission period after the first submission, to give other submitters time to react.\\n }\\n\\n struct Transaction {\\n address target; // The address to call.\\n uint256 value; // Value paid by governor contract that will be used as msg.value in the execution.\\n bytes data; // Calldata of the transaction.\\n bool executed; // Whether the transaction was already executed or not.\\n }\\n\\n struct Submission {\\n address payable submitter; // The one who submits the list.\\n uint256 deposit; // Value of the deposit paid upon submission of the list.\\n Transaction[] txs; // Transactions stored in the list in the form txs[_transactionIndex].\\n bytes32 listHash; // A hash chain of all transactions stored in the list. This is used as a unique identifier within a session.\\n uint256 submissionTime; // The time when the list was submitted.\\n bool approved; // Whether the list was approved for execution or not.\\n uint256 approvalTime; // The time when the list was approved.\\n uint256 submissionBlock; // Block of list submission.\\n }\\n\\n ArbSys constant arbSys = ArbSys(address(100)); // ArbSys implementation https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference#arbsys\\n IArbitratorV2 public arbitrator; // Arbitrator contract.\\n bytes public arbitratorExtraData; // Extra data for arbitrator.\\n address public wNative; // The wrapped native token for safeSend().\\n IDisputeTemplateRegistry public templateRegistry; // The dispute template registry.\\n uint256 public templateId; // The current dispute template identifier.\\n\\n uint256 public submissionBaseDeposit; // The base deposit in wei that needs to be paid in order to submit the list.\\n uint256 public submissionTimeout; // Time in seconds allowed for submitting the lists. Once it's passed the contract enters the approval period.\\n uint256 public executionTimeout; // Time in seconds allowed for the execution of approved lists.\\n uint256 public withdrawTimeout; // Time in seconds allowed to withdraw a submitted list.\\n\\n uint256 public lastApprovalTime; // The time of the last approval of a transaction list.\\n uint256 public reservedETH; // Sum of contract's submission deposits. These funds are not to be used in the execution of transactions.\\n\\n Submission[] public submissions; // Stores all created transaction lists. submissions[_listID].\\n Session[] public sessions; // Stores all submitting sessions. sessions[_session].\\n mapping(uint256 sessionIndex => mapping(bytes32 listHash => bool)) alreadySubmitted; // Indicates whether or not the transaction list was already submitted in order to catch duplicates in the form alreadySubmitted[listHash].\\n\\n // ************************************* //\\n // * Function Modifiers * //\\n // ************************************* //\\n\\n modifier duringSubmissionPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n if (block.timestamp - lastApprovalTime > submissionTimeout + offset) revert SubmissionTimeHasEnded();\\n _;\\n }\\n\\n modifier duringApprovalPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n if (block.timestamp - lastApprovalTime <= submissionTimeout + offset) revert ApprovalTimeNotStarted();\\n _;\\n }\\n\\n modifier onlyByOwner() {\\n if (address(this) != msg.sender) revert OwnerOnly();\\n _;\\n }\\n\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice Emitted when a new list is submitted.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _submitter The address that submitted the list.\\n /// @param _session The number of the current session.\\n /// @param _description The string in CSV format that contains labels of list's transactions.\\n /// Note that the submitter may give bad descriptions of correct actions, but this is to be seen as UI enhancement, not a critical feature and that would play against him in case of dispute.\\n event ListSubmitted(\\n uint256 indexed _listID,\\n address indexed _submitter,\\n uint256 indexed _session,\\n string _description\\n );\\n\\n // ************************************* //\\n // * Constructor * //\\n // ************************************* //\\n\\n /// @notice Constructor.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorExtraData Extra data for the arbitrator.\\n /// @param _templateRegistry Dispute Template registry address\\n /// @param _templateData The dispute template data.\\n /// @param _templateDataMappings The dispute template data mappings.\\n /// @param _submissionBaseDeposit The base deposit required for submission.\\n /// @param _submissionTimeout Time in seconds allocated for submitting transaction list.\\n /// @param _executionTimeout Time in seconds after approval that allows to execute transactions of the approved list.\\n /// @param _withdrawTimeout Time in seconds after submission that allows to withdraw submitted list.\\n /// @param _wNative The wrapped native token address, typically wETH.\\n constructor(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData,\\n IDisputeTemplateRegistry _templateRegistry,\\n string memory _templateData,\\n string memory _templateDataMappings,\\n uint256 _submissionBaseDeposit,\\n uint256 _submissionTimeout,\\n uint256 _executionTimeout,\\n uint256 _withdrawTimeout,\\n address _wNative\\n ) {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n wNative = _wNative;\\n\\n lastApprovalTime = block.timestamp;\\n submissionBaseDeposit = _submissionBaseDeposit;\\n submissionTimeout = _submissionTimeout;\\n executionTimeout = _executionTimeout;\\n withdrawTimeout = _withdrawTimeout;\\n sessions.push();\\n submissions.push();\\n\\n templateRegistry = _templateRegistry;\\n templateId = IDisputeTemplateRegistry(templateRegistry).setDisputeTemplate(\\n \\\"\\\",\\n _templateData,\\n _templateDataMappings\\n );\\n }\\n\\n // ************************************* //\\n // * Governance * //\\n // ************************************* //\\n\\n /// @notice Changes the value of the base deposit required for submitting a list.\\n /// @param _submissionBaseDeposit The new value of the base deposit, in wei.\\n function changeSubmissionDeposit(uint256 _submissionBaseDeposit) external onlyByOwner {\\n submissionBaseDeposit = _submissionBaseDeposit;\\n }\\n\\n /// @notice Changes the time allocated for submission.\\n /// @dev It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract\\n /// and prolonging submission timeout might switch it back to submission period.\\n /// @param _submissionTimeout The new duration of the submission period, in seconds.\\n function changeSubmissionTimeout(uint256 _submissionTimeout) external onlyByOwner duringSubmissionPeriod {\\n submissionTimeout = _submissionTimeout;\\n }\\n\\n /// @notice Changes the time allocated for list's execution.\\n /// @param _executionTimeout The new duration of the execution timeout, in seconds.\\n function changeExecutionTimeout(uint256 _executionTimeout) external onlyByOwner {\\n executionTimeout = _executionTimeout;\\n }\\n\\n /// @notice Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period.\\n /// @param _withdrawTimeout The new duration of withdraw period, in seconds.\\n function changeWithdrawTimeout(uint256 _withdrawTimeout) external onlyByOwner {\\n withdrawTimeout = _withdrawTimeout;\\n }\\n\\n /// @notice Changes the arbitrator of the contract.\\n /// @dev It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract.\\n /// @param _arbitrator The new trusted arbitrator.\\n /// @param _arbitratorExtraData The extra data used by the new arbitrator.\\n function changeArbitrator(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData\\n ) external onlyByOwner duringSubmissionPeriod {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n }\\n\\n /// @notice Update the dispute template data.\\n /// @param _templateData The new dispute template data.\\n /// @param _templateDataMappings The new dispute template data mappings.\\n function changeDisputeTemplate(\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external onlyByOwner {\\n templateId = templateRegistry.setDisputeTemplate(\\\"\\\", _templateData, _templateDataMappings);\\n }\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Creates transaction list based on input parameters and submits it for potential approval and execution.\\n /// @param _target List of addresses to call.\\n /// @param _value List of values required for respective addresses.\\n /// @param _data Concatenated calldata of all transactions of this list.\\n /// @param _dataSize List of lengths in bytes required to split calldata for its respective targets.\\n /// @param _description String in CSV format that describes list's transactions.\\n function submitList(\\n address[] memory _target,\\n uint256[] memory _value,\\n bytes memory _data,\\n uint256[] memory _dataSize,\\n string memory _description\\n ) external payable duringSubmissionPeriod {\\n if (_target.length != _value.length) revert WrongInputTargetAndValue();\\n if (_target.length != _dataSize.length) revert WrongInputTargetAndDatasize();\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions.push();\\n submission.submitter = payable(msg.sender);\\n\\n // https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/block-numbers-and-time\\n submission.submissionBlock = arbSys.arbBlockNumber();\\n\\n // Do the assignment first to avoid creating a new variable and bypass a 'stack too deep' error.\\n submission.deposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n if (msg.value < submission.deposit) revert InsufficientDeposit();\\n\\n bytes32 listHash;\\n bytes32 currentTxHash;\\n uint256 readingPosition;\\n for (uint256 i = 0; i < _target.length; i++) {\\n bytes memory readData = new bytes(_dataSize[i]);\\n Transaction storage transaction = submission.txs.push();\\n transaction.target = _target[i];\\n transaction.value = _value[i];\\n for (uint256 j = 0; j < _dataSize[i]; j++) {\\n readData[j] = _data[readingPosition + j];\\n }\\n transaction.data = readData;\\n readingPosition += _dataSize[i];\\n currentTxHash = keccak256(abi.encodePacked(transaction.target, transaction.value, transaction.data));\\n listHash = keccak256(abi.encodePacked(currentTxHash, listHash));\\n }\\n if (!alreadySubmitted[sessions.length - 1][listHash]) revert ListAlreadySubmitted();\\n alreadySubmitted[sessions.length - 1][listHash] = true;\\n submission.listHash = listHash;\\n submission.submissionTime = block.timestamp;\\n session.sumDeposit += submission.deposit;\\n session.submittedLists.push(submissions.length - 1);\\n if (session.submittedLists.length == 1) session.durationOffset = block.timestamp - lastApprovalTime;\\n\\n emit ListSubmitted(submissions.length - 1, msg.sender, sessions.length - 1, _description);\\n\\n uint256 remainder = msg.value - submission.deposit;\\n if (remainder > 0) payable(msg.sender).safeSend(remainder, wNative);\\n\\n reservedETH += submission.deposit;\\n }\\n\\n /// @notice Withdraws submitted transaction list. Reimburses submission deposit.\\n /// @dev Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made.\\n /// @param _submissionID Submission's index in the array of submitted lists of the current session.\\n /// @param _listHash Hash of a withdrawing list.\\n function withdrawTransactionList(uint256 _submissionID, bytes32 _listHash) external {\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions[session.submittedLists[_submissionID]];\\n if (block.timestamp - lastApprovalTime > submissionTimeout / 2) revert ShouldOnlyWithdrawInFirstHalf();\\n // This is an extra check to prevent _submissionID linking to the wrong list because of index swap during withdrawal.\\n if (submission.listHash != _listHash) revert WrongListHash();\\n if (submission.submitter != msg.sender) revert OnlySubmitterCanWithdraw();\\n if (block.timestamp - submission.submissionTime > withdrawTimeout) revert WithdrawingTimeHasPassed();\\n session.submittedLists[_submissionID] = session.submittedLists[session.submittedLists.length - 1];\\n alreadySubmitted[sessions.length - 1][_listHash] = false;\\n session.submittedLists.pop();\\n session.sumDeposit -= submission.deposit;\\n reservedETH -= submission.deposit;\\n payable(msg.sender).transfer(submission.deposit);\\n }\\n\\n /// @notice Approves a transaction list or creates a dispute if more than one list was submitted.\\n /// @dev If nothing was submitted changes session.\\n function executeSubmissions() external duringApprovalPeriod {\\n Session storage session = sessions[sessions.length - 1];\\n if (session.status != Status.NoDispute) revert AlreadyDisputed();\\n if (session.submittedLists.length == 0) {\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n } else if (session.submittedLists.length == 1) {\\n Submission storage submission = submissions[session.submittedLists[0]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n uint256 sumDeposit = session.sumDeposit;\\n session.sumDeposit = 0;\\n submission.submitter.safeSend(sumDeposit, wNative);\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n\\n reservedETH -= sumDeposit;\\n } else {\\n session.status = Status.DisputeCreated;\\n uint256 arbitrationCost = arbitrator.arbitrationCost(arbitratorExtraData);\\n session.disputeID = arbitrator.createDispute{value: arbitrationCost}(\\n session.submittedLists.length,\\n arbitratorExtraData\\n );\\n // Check in case arbitration cost increased after the submission. It's unlikely that its increase won't be covered by the base deposit, but technically possible.\\n session.sumDeposit = session.sumDeposit > arbitrationCost ? session.sumDeposit - arbitrationCost : 0;\\n reservedETH = reservedETH > arbitrationCost ? reservedETH - arbitrationCost : 0;\\n emit DisputeRequest(arbitrator, session.disputeID, templateId);\\n }\\n }\\n\\n /// @notice Gives a ruling for a dispute.\\n /// @dev Must be called by the arbitrator.\\n /// @param _disputeID ID of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator. Note that 0 is reserved for \\\"Refuse to arbitrate\\\".\\n /// Note If the final ruling is \\\"0\\\" nothing is approved and deposits will stay locked in the contract.\\n function rule(uint256 _disputeID, uint256 _ruling) external override {\\n Session storage session = sessions[sessions.length - 1];\\n if (msg.sender != address(arbitrator)) revert OnlyArbitratorAllowed();\\n if (session.status != Status.DisputeCreated) revert NotDisputed();\\n if (_ruling > session.submittedLists.length) revert RulingOutOfBounds();\\n\\n if (_ruling != 0) {\\n Submission storage submission = submissions[session.submittedLists[_ruling - 1]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n submission.submitter.safeSend(session.sumDeposit, wNative);\\n }\\n // If the ruling is \\\"0\\\" the reserved funds of this session become expendable.\\n reservedETH -= session.sumDeposit;\\n\\n session.sumDeposit = 0;\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n session.ruling = _ruling;\\n sessions.push();\\n\\n emit Ruling(IArbitratorV2(msg.sender), _disputeID, _ruling);\\n }\\n\\n /// @notice Executes selected transactions of the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _cursor Index of the transaction from which to start executing.\\n /// @param _count Number of transactions to execute. Executes until the end if set to \\\"0\\\" or number higher than number of transactions in the list.\\n function executeTransactionList(uint256 _listID, uint256 _cursor, uint256 _count) external {\\n Submission storage submission = submissions[_listID];\\n if (!submission.approved) revert SubmissionNotApproved();\\n if (block.timestamp - submission.approvalTime > executionTimeout) revert TimeToExecuteHasPassed();\\n for (uint256 i = _cursor; i < submission.txs.length && (_count == 0 || i < _cursor + _count); i++) {\\n Transaction storage transaction = submission.txs[i];\\n uint256 expendableFunds = getExpendableFunds();\\n if (!transaction.executed && transaction.value <= expendableFunds) {\\n (bool callResult, ) = transaction.target.call{value: transaction.value}(transaction.data);\\n // An extra check to prevent re-entrancy through target call.\\n if (callResult == true) {\\n if (transaction.executed) revert AlreadyExecuted();\\n transaction.executed = true;\\n }\\n }\\n }\\n }\\n\\n /// @notice Receive function to receive funds for the execution of transactions.\\n receive() external payable {}\\n\\n /// @notice Gets the sum of contract funds that are used for the execution of transactions.\\n /// @return Contract balance without reserved ETH.\\n function getExpendableFunds() public view returns (uint256) {\\n return address(this).balance - reservedETH;\\n }\\n\\n /// @notice Gets the info of the specific transaction in the specific list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _transactionIndex The index of the transaction.\\n /// @return target The target of the transaction.\\n /// @return value The value of the transaction.\\n /// @return data The data of the transaction.\\n /// @return executed Whether the transaction was executed or not.\\n function getTransactionInfo(\\n uint256 _listID,\\n uint256 _transactionIndex\\n ) external view returns (address target, uint256 value, bytes memory data, bool executed) {\\n Submission storage submission = submissions[_listID];\\n Transaction storage transaction = submission.txs[_transactionIndex];\\n return (transaction.target, transaction.value, transaction.data, transaction.executed);\\n }\\n\\n /// @notice Gets the array of submitted lists in the session.\\n ///\\n /// @dev This function is O(n), where `n` is the number of submissions in the session.\\n /// This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts.\\n ///\\n /// @param _session The ID of the session.\\n /// @return submittedLists Indexes of lists that were submitted during the session.\\n function getSubmittedLists(uint256 _session) external view returns (uint256[] memory submittedLists) {\\n Session storage session = sessions[_session];\\n submittedLists = session.submittedLists;\\n }\\n\\n /// @notice Gets the submission from listId.\\n /// @param _listId The index of the transaction list in the array of lists.\\n /// @return submission List belonging to that listId.\\n function getSubmission(uint256 _listId) external view returns (Submission memory submission) {\\n submission = submissions[_listId];\\n }\\n\\n /// @notice Gets the number of transactions in the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @return txCount The number of transactions in the list.\\n function getNumberOfTransactions(uint256 _listID) external view returns (uint256 txCount) {\\n Submission storage submission = submissions[_listID];\\n return submission.txs.length;\\n }\\n\\n /// @notice Gets the number of lists created in contract's lifetime.\\n /// @return The number of created lists.\\n function getNumberOfCreatedLists() external view returns (uint256) {\\n return submissions.length;\\n }\\n\\n /// @notice Gets the number of the ongoing session.\\n /// @return The number of the ongoing session.\\n function getCurrentSessionNumber() external view returns (uint256) {\\n return sessions.length - 1;\\n }\\n\\n /// @notice Gets the session from the session index.\\n /// @return _session The session info.\\n function getSession(uint256 _sessionIndex) external view returns (Session memory _session) {\\n _session = sessions[_sessionIndex];\\n }\\n\\n /// @notice Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost).\\n /// @return _requiredDeposit required deposit value\\n function getTotalSubmissionDeposit() external view returns (uint256 _requiredDeposit) {\\n _requiredDeposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n }\\n\\n // ************************************* //\\n // * Errors * //\\n // ************************************* //\\n\\n error SubmissionTimeHasEnded();\\n error ApprovalTimeNotStarted();\\n error OwnerOnly();\\n error WrongInputTargetAndValue();\\n error WrongInputTargetAndDatasize();\\n error InsufficientDeposit();\\n error ListAlreadySubmitted();\\n error ShouldOnlyWithdrawInFirstHalf();\\n error WrongListHash();\\n error OnlySubmitterCanWithdraw();\\n error WithdrawingTimeHasPassed();\\n error AlreadyDisputed();\\n error OnlyArbitratorAllowed();\\n error NotDisputed();\\n error RulingOutOfBounds();\\n error SubmissionNotApproved();\\n error TimeToExecuteHasPassed();\\n error AlreadyExecuted();\\n}\\n\",\"keccak256\":\"0xe43c23fe08e7022e619a9514d2a7dc5d05e454919a0ed51ca91164d95e04b028\",\"license\":\"MIT\"},\"src/interfaces/IArbSys.sol\":{\"content\":\"// https://github.com/OffchainLabs/nitro-contracts/blob/bdb8f8c68b2229fe9309fe9c03b37017abd1a2cd/src/precompiles/ArbSys.sol\\n// Copyright 2021-2022, Offchain Labs, Inc.\\n// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE\\n// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity >=0.4.21 <0.9.0;\\n\\n/**\\n * @title System level functionality\\n * @notice For use by contracts to interact with core L2-specific functionality.\\n * Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064.\\n */\\ninterface ArbSys {\\n /**\\n * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)\\n * @return block number as int\\n */\\n function arbBlockNumber() external view returns (uint256);\\n\\n /**\\n * @notice Get Arbitrum block hash (reverts unless currentBlockNum-256 <= arbBlockNum < currentBlockNum)\\n * @return block hash\\n */\\n function arbBlockHash(uint256 arbBlockNum) external view returns (bytes32);\\n\\n /**\\n * @notice Gets the rollup's unique chain identifier\\n * @return Chain identifier as int\\n */\\n function arbChainID() external view returns (uint256);\\n\\n /**\\n * @notice Get internal version number identifying an ArbOS build, this is `55 + nitroArbOS version number`\\n * e.g. on ArbOS 31 this would return 86. This is the only function that have the 55 offset.\\n * @return version number as int\\n */\\n function arbOSVersion() external view returns (uint256);\\n\\n /**\\n * @notice Returns 0 since Nitro has no concept of storage gas\\n * @return uint 0\\n */\\n function getStorageGasAvailable() external view returns (uint256);\\n\\n /**\\n * @notice (deprecated) check if current call is top level (meaning it was triggered by an EoA or a L1 contract)\\n * @dev this call has been deprecated and may be removed in a future release\\n * @return true if current execution frame is not a call by another L2 contract\\n */\\n function isTopLevelCall() external view returns (bool);\\n\\n /**\\n * @notice map L1 sender contract address to its L2 alias\\n * @param sender sender address\\n * @param unused argument no longer used\\n * @return aliased sender address\\n */\\n function mapL1SenderContractAddressToL2Alias(address sender, address unused) external pure returns (address);\\n\\n /**\\n * @notice check if the caller (of this caller of this) is an aliased L1 contract address\\n * @return true iff the caller's address is an alias for an L1 contract address\\n */\\n function wasMyCallersAddressAliased() external view returns (bool);\\n\\n /**\\n * @notice return the address of the caller (of this caller of this), without applying L1 contract address aliasing\\n * @return address of the caller's caller, without applying L1 contract address aliasing\\n */\\n function myCallersAddressWithoutAliasing() external view returns (address);\\n\\n /**\\n * @notice Send given amount of Eth to dest from sender.\\n * This is a convenience function, which is equivalent to calling sendTxToL1 with empty data.\\n * @param destination recipient address on L1\\n * @return unique identifier for this L2-to-L1 transaction.\\n */\\n function withdrawEth(address destination) external payable returns (uint256);\\n\\n /**\\n * @notice Send a transaction to L1\\n * @dev it is not possible to execute on the L1 any L2-to-L1 transaction which contains data\\n * to a contract address without any code (as enforced by the Bridge contract).\\n * @param destination recipient address on L1\\n * @param data (optional) calldata for L1 contract call\\n * @return a unique identifier for this L2-to-L1 transaction.\\n */\\n function sendTxToL1(address destination, bytes calldata data) external payable returns (uint256);\\n\\n /**\\n * @notice Get send Merkle tree state\\n * @return size number of sends in the history\\n * @return root root hash of the send history\\n * @return partials hashes of partial subtrees in the send history tree\\n */\\n function sendMerkleTreeState() external view returns (uint256 size, bytes32 root, bytes32[] memory partials);\\n\\n /**\\n * @notice creates a send txn from L2 to L1\\n * @param position = (level << 192) + leaf = (0 << 192) + leaf = leaf\\n */\\n event L2ToL1Tx(\\n address caller,\\n address indexed destination,\\n uint256 indexed hash,\\n uint256 indexed position,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /// @dev DEPRECATED in favour of the new L2ToL1Tx event above after the nitro upgrade\\n event L2ToL1Transaction(\\n address caller,\\n address indexed destination,\\n uint256 indexed uniqueId,\\n uint256 indexed batchNumber,\\n uint256 indexInBatch,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /**\\n * @notice logs a merkle branch for proof synthesis\\n * @param reserved an index meant only to align the 4th index with L2ToL1Transaction's 4th event\\n * @param hash the merkle hash\\n * @param position = (level << 192) + leaf\\n */\\n event SendMerkleUpdate(uint256 indexed reserved, bytes32 indexed hash, uint256 indexed position);\\n\\n error InvalidBlockNumber(uint256 requested, uint256 current);\\n}\\n\",\"keccak256\":\"0x9f2e1c9d8d19db1d3c6baa0549d14a68d09526764f4bd6f3bf030f0af7fd12fe\",\"license\":\"BUSL-1.1\"},\"src/libraries/SafeSend.sol\":{\"content\":\"/**\\n * @authors: [@andreimvp]\\n * @reviewers: [@divyangchauhan, @wadader, @fcanela, @unknownunknown1]\\n * @auditors: []\\n * @bounties: []\\n * SPDX-License-Identifier: MIT\\n */\\n\\npragma solidity ^0.8.24;\\n\\ninterface WethLike {\\n function deposit() external payable;\\n\\n function transfer(address dst, uint256 wad) external;\\n}\\n\\nlibrary SafeSend {\\n function safeSend(address payable _to, uint256 _value, address _wethLike) internal {\\n if (_to.send(_value)) return;\\n\\n WethLike(_wethLike).deposit{value: _value}();\\n WethLike(_wethLike).transfer(_to, _value); /// forge-lint: disable-line(erc20-unchecked-transfer)\\n }\\n}\\n\",\"keccak256\":\"0xd4d5b25d0eb7f7965ea7a9e3d3d6bc13368de9aaf882543a75dc9c57c85e9283\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b50613378806100206000396000f3fe60806040523480156200001157600080fd5b50600436106200003a5760003560e01c8063a17ad8a7146200003f578063a2f7b3a51462000058575b600080fd5b62000056620000503660046200025c565b6200008b565b005b6200006f620000693660046200034f565b6200015b565b6040516001600160a01b03909116815260200160405180910390f35b60008a8a8a8a8a8a8a8a8a8a604051620000a59062000186565b620000ba9a99989796959493929190620003b1565b604051809103906000f080158015620000d7573d6000803e3d6000fd5b50600080546001810182558180527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b038416908117909155604051929350917f5425363a03f182281120f5919107c49c7a1a623acc1cbc6df468b6f0c11fcf8c9190a25050505050505050505050565b600081815481106200016c57600080fd5b6000918252602090912001546001600160a01b0316905081565b612f00806200044383390190565b80356001600160a01b0381168114620001ac57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001d957600080fd5b813567ffffffffffffffff80821115620001f757620001f7620001b1565b604051601f8301601f19908116603f01168101908282118183101715620002225762000222620001b1565b816040528381528660208588010111156200023c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806000806000806000806101408b8d0312156200027d57600080fd5b620002888b62000194565b995060208b013567ffffffffffffffff80821115620002a657600080fd5b620002b48e838f01620001c7565b9a50620002c460408e0162000194565b995060608d0135915080821115620002db57600080fd5b620002e98e838f01620001c7565b985060808d01359150808211156200030057600080fd5b506200030f8d828e01620001c7565b96505060a08b0135945060c08b0135935060e08b013592506101008b013591506200033e6101208c0162000194565b90509295989b9194979a5092959850565b6000602082840312156200036257600080fd5b5035919050565b6000815180845260005b81811015620003915760208185018101518683018201520162000373565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038b8116825261014060208301819052600091620003d98483018e62000369565b9150808c1660408501528382036060850152620003f7828c62000369565b915083820360808501526200040d828b62000369565b92508860a08501528760c08501528660e08501528561010085015280851661012085015250509b9a505050505050505050505056fe60806040523480156200001157600080fd5b5060405162002f0038038062002f00833981016040819052620000349162000225565b600080546001600160a01b0319166001600160a01b038c1617905560016200005d8a82620003a9565b50600280546001600160a01b038084166001600160a01b031992831617909255426009556005879055600686905560078590556008849055600c80546001908101909155600b8054909101815560005260038054928b1692909116821790556040516312a6505d60e21b8152634a99417490620000e1908a908a90600401620004a3565b6020604051808303816000875af115801562000101573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001279190620004e3565b60045550620004fd98505050505050505050565b80516001600160a01b03811681146200015357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200018b57818101518382015260200162000171565b50506000910152565b600082601f830112620001a657600080fd5b81516001600160401b0380821115620001c357620001c362000158565b604051601f8301601f19908116603f01168101908282118183101715620001ee57620001ee62000158565b816040528381528660208588010111156200020857600080fd5b6200021b8460208301602089016200016e565b9695505050505050565b6000806000806000806000806000806101408b8d0312156200024657600080fd5b620002518b6200013b565b60208c0151909a506001600160401b03808211156200026f57600080fd5b6200027d8e838f0162000194565b9a506200028d60408e016200013b565b995060608d0151915080821115620002a457600080fd5b620002b28e838f0162000194565b985060808d0151915080821115620002c957600080fd5b50620002d88d828e0162000194565b96505060a08b0151945060c08b0151935060e08b015192506101008b01519150620003076101208c016200013b565b90509295989b9194979a5092959850565b600181811c908216806200032d57607f821691505b6020821081036200034e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a4576000816000526020600020601f850160051c810160208610156200037f5750805b601f850160051c820191505b81811015620003a0578281556001016200038b565b5050505b505050565b81516001600160401b03811115620003c557620003c562000158565b620003dd81620003d6845462000318565b8462000354565b602080601f831160018114620004155760008415620003fc5750858301515b600019600386901b1c1916600185901b178555620003a0565b600085815260208120601f198616915b82811015620004465788860151825594840194600190910190840162000425565b5085821015620004655787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526200048f8160208601602086016200016e565b601f01601f19169290920160200192915050565b6060815260006060820152608060208201526000620004c6608083018562000475565b8281036040840152620004da818562000475565b95945050505050565b600060208284031215620004f657600080fd5b5051919050565b6129f3806200050d6000396000f3fe6080604052600436106101b25760003560e01c806383c4b7a3116100ed578063b6cd08c611610090578063b6cd08c614610519578063b6dc775414610539578063ba7079ca1461054e578063bb0b86ff1461056e578063c4bd851914610584578063c5d552881461059a578063cc2bcdb4146105ba578063dc17bbdb146105da578063f730c07f146105fa57600080fd5b806383c4b7a3146103d75780639244c70414610408578063953d66511461041d5780639c15d1a21461043d578063a0af81f014610453578063a3c595c914610473578063ad73349e146104a3578063b51257001461050457600080fd5b80633e8686cc116101555780633e8686cc146102e9578063402ff0db1461031657806346047838146103435780636c0b7e71146103565780636cc6cde11461036b5780636cf39c2b1461038b57806377b9fda8146103ab5780637aa77f29146103c157600080fd5b80630c7ac7b6146101be5780631b1f5e7b146101e957806321cea5381461020c57806322b52d6614610239578063246c76df1461024f57806324baacc7146102715780632d68efc914610291578063311a6c56146102c957600080fd5b366101b957005b600080fd5b3480156101ca57600080fd5b506101d3610610565b6040516101e09190611fdc565b60405180910390f35b3480156101f557600080fd5b506101fe61069e565b6040519081526020016101e0565b34801561021857600080fd5b5061022c610227366004611ff6565b610723565b6040516101e0919061200f565b34801561024557600080fd5b506101fe60075481565b34801561025b57600080fd5b5061026f61026a366004611ff6565b6107a5565b005b34801561027d57600080fd5b5061026f61028c366004611ff6565b6107ca565b34801561029d57600080fd5b506002546102b1906001600160a01b031681565b6040516001600160a01b0390911681526020016101e0565b3480156102d557600080fd5b5061026f6102e4366004612053565b6107ef565b3480156102f557600080fd5b50610309610304366004611ff6565b6109c1565b6040516101e09190612075565b34801561032257600080fd5b50610336610331366004611ff6565b610bbc565b6040516101e091906121b0565b61026f61035136600461240a565b610caa565b34801561036257600080fd5b506101fe6112b1565b34801561037757600080fd5b506000546102b1906001600160a01b031681565b34801561039757600080fd5b5061026f6103a63660046124db565b6112c3565b3480156103b757600080fd5b506101fe600a5481565b3480156103cd57600080fd5b506101fe60045481565b3480156103e357600080fd5b506103f76103f2366004611ff6565b611487565b6040516101e0959493929190612507565b34801561041457600080fd5b5061026f6114ce565b34801561042957600080fd5b5061026f610438366004611ff6565b611841565b34801561044957600080fd5b506101fe60085481565b34801561045f57600080fd5b506003546102b1906001600160a01b031681565b34801561047f57600080fd5b5061049361048e366004612053565b6118d9565b6040516101e09493929190612539565b3480156104af57600080fd5b506104c36104be366004611ff6565b6119f3565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101e0565b34801561051057600080fd5b506101fe611a4f565b34801561052557600080fd5b5061026f610534366004612053565b611a5f565b34801561054557600080fd5b50600b546101fe565b34801561055a57600080fd5b5061026f610569366004612573565b611cb3565b34801561057a57600080fd5b506101fe60055481565b34801561059057600080fd5b506101fe60065481565b3480156105a657600080fd5b5061026f6105b53660046125c2565b611d72565b3480156105c657600080fd5b5061026f6105d5366004611ff6565b611e0e565b3480156105e657600080fd5b506101fe6105f5366004611ff6565b611e33565b34801561060657600080fd5b506101fe60095481565b6001805461061d9061261b565b80601f01602080910402602001604051908101604052809291908181526020018280546106499061261b565b80156106965780601f1061066b57610100808354040283529160200191610696565b820191906000526020600020905b81548152906001019060200180831161067957829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea9906106d0906001906004016126d2565b602060405180830381865afa1580156106ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071191906126e5565b60055461071e9190612714565b905090565b60606000600c838154811061073a5761073a61272d565b906000526020600020906006020190508060020180548060200260200160405190810160405280929190818152602001828054801561079857602002820191906000526020600020905b815481526020019060010190808311610784575b5050505050915050919050565b3033146107c557604051630b2db9b760e31b815260040160405180910390fd5b600855565b3033146107ea57604051630b2db9b760e31b815260040160405180910390fd5b600555565b600c80546000919061080390600190612743565b815481106108135761081361272d565b600091825260208220915460069190910290910191506001600160a01b031633146108515760405163381a2cb560e11b815260040160405180910390fd5b6001600482015460ff16600281111561086c5761086c612178565b1461088a576040516310cec38560e21b815260040160405180910390fd5b60028101548211156108af57604051631f6edbfd60e01b815260040160405180910390fd5b811561093f576000600b600283016108c8600186612743565b815481106108d8576108d861272d565b9060005260206000200154815481106108f3576108f361272d565b600091825260209091206005600890920201908101805460ff191660011790554260068201556003830154600254825492935061093d926001600160a01b03908116929116611e64565b505b8060030154600a60008282546109559190612743565b90915550506000600382018190554260095560048201805460ff19166002179055828255600c805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a1760405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600b8281548110610a2a57610a2a61272d565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610b76576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610ad39061261b565b80601f0160208091040260200160405190810160405280929190818152602001828054610aff9061261b565b8015610b4c5780601f10610b2157610100808354040283529160200191610b4c565b820191906000526020600020905b815481529060010190602001808311610b2f57829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610a80565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610bc4611f4f565b600c8281548110610bd757610bd761272d565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610c5357602002820191906000526020600020905b815481526020019060010190808311610c3f575b505050918352505060038201546020820152600482015460409091019060ff166002811115610c8457610c84612178565b6002811115610c9557610c95612178565b81526020016005820154815250509050919050565b600c805460009190610cbe90600190612743565b81548110610cce57610cce61272d565b906000526020600020906006020160050154905080600654610cf09190612714565b600954610cfd9042612743565b1115610d1c5760405163d5ac976d60e01b815260040160405180910390fd5b8451865114610d3e57604051638f32290560e01b815260040160405180910390fd5b8251865114610d6057604051633222108360e01b815260040160405180910390fd5b600c805460009190610d7490600190612743565b81548110610d8457610d8461272d565b60009182526020808320600b8054600181018255945260089093027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3b91906126e5565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610e71906001906004016126d2565b602060405180830381865afa158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb291906126e5565b600554610ebf9190612714565b60018201819055341015610ee65760405163070f6eed60e11b815260040160405180910390fd5b60008080805b8b518110156110f2576000898281518110610f0957610f0961272d565b60200260200101516001600160401b03811115610f2857610f28612243565b6040519080825280601f01601f191660200182016040528015610f52576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110610f8757610f8761272d565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d9084908110610fc057610fc061272d565b6020026020010151816001018190555060005b8b8481518110610fe557610fe561272d565b602002602001015181101561104b578c610fff8287612714565b8151811061100f5761100f61272d565b602001015160f81c60f81b83828151811061102c5761102c61272d565b60200101906001600160f81b031916908160001a905350600101610fd3565b506002810161105a83826127a7565b508a838151811061106d5761106d61272d565b6020026020010151846110809190612714565b815460018301546040519296506110aa926001600160a01b039092169160028501906020016128d9565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610eec565b50600c54600d9060009061110890600190612743565b81526020808201929092526040908101600090812086825290925290205460ff166111465760405163607cb3e760e01b815260040160405180910390fd5b6001600d60006001600c8054905061115e9190612743565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916111b2908490612714565b9091555050600b5460028601906111cb90600190612743565b815460018181018455600093845260209093200155600286015490036111fe576009546111f89042612743565b60058601555b600c5461120d90600190612743565b600b54339061121e90600190612743565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a60405161124d9190611fdc565b60405180910390a460008460010154346112679190612743565b905080156112885760025461128890339083906001600160a01b0316611e64565b8460010154600a600082825461129e9190612714565b9091555050505050505050505050505050565b600c5460009061071e90600190612743565b6000600b84815481106112d8576112d861272d565b60009182526020909120600890910201600581015490915060ff1661130f5760405162325f4560e91b815260040160405180910390fd5b60075460068201546113219042612743565b111561134057604051638b349aa560e01b815260040160405180910390fd5b825b600282015481108015611365575082158061136557506113628385612714565b81105b156114805760008260020182815481106113815761138161272d565b90600052602060002090600402019050600061139b611a4f565b600383015490915060ff161580156113b7575080826001015411155b1561146b57815460018301546040516000926001600160a01b031691906113e290600287019061290c565b60006040518083038185875af1925050503d806000811461141f576040519150601f19603f3d011682016040523d82523d6000602084013e611424565b606091505b509091505080151560010361146957600383015460ff161561145957604051630dc1019760e01b815260040160405180910390fd5b60038301805460ff191660011790555b505b5050808061147890612918565b915050611342565b5050505050565b600c818154811061149757600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600c8054600091906114e290600190612743565b815481106114f2576114f261272d565b9060005260206000209060060201600501549050806006546115149190612714565b6009546115219042612743565b1161153f57604051631875ed4760e21b815260040160405180910390fd5b600c80546000919061155390600190612743565b815481106115635761156361272d565b6000918252602082206006909102019150600482015460ff16600281111561158d5761158d612178565b146115ab576040516304ee891b60e11b815260040160405180910390fd5b60028101546000036115d85742600955600401805460ff1916600217905550600c80546001018155600052565b60028101546001036116a7576000600b826002016000815481106115fe576115fe61272d565b9060005260206000200154815481106116195761161961272d565b6000918252602082206005600890920201908101805460ff191660011790554260068201556003840180549290556002548154919350611667916001600160a01b0390811691849116611e64565b4260095560048301805460ff19166002179055600c805460010181556000908152600a805483929061169a908490612743565b9091555061183d92505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926116e992016126d2565b602060405180830381865afa158015611706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172a91906126e5565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e19184916117669190600190600401612931565b60206040518083038185885af1158015611784573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117a991906126e5565b6001830155600382015481106117c05760006117d0565b8082600301546117d09190612743565b6003830155600a5481106117e55760006117f3565b80600a546117f39190612743565b600a5560018201546000546004546040519081526001600160a01b03909116907fee1017dcbefba87397fcdaab31f187328533572b6a5568177fa2eb64026003b6906020016109b4565b5050565b30331461186157604051630b2db9b760e31b815260040160405180910390fd5b600c80546000919061187590600190612743565b815481106118855761188561272d565b9060005260206000209060060201600501549050806006546118a79190612714565b6009546118b49042612743565b11156118d35760405163d5ac976d60e01b815260040160405180910390fd5b50600655565b6000806060600080600b87815481106118f4576118f461272d565b90600052602060002090600802019050600081600201878154811061191b5761191b61272d565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff9091169082906119609061261b565b80601f016020809104026020016040519081016040528092919081815260200182805461198c9061261b565b80156119d95780601f106119ae576101008083540402835291602001916119d9565b820191906000526020600020905b8154815290600101906020018083116119bc57829003601f168201915b505050505091509550955095509550505092959194509250565b600b8181548110611a0357600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600a544761071e9190612743565b600c805460009190611a7390600190612743565b81548110611a8357611a8361272d565b906000526020600020906006020190506000600b826002018581548110611aac57611aac61272d565b906000526020600020015481548110611ac757611ac761272d565b906000526020600020906008020190506002600654611ae69190612952565b600954611af39042612743565b1115611b125760405163383f4af360e21b815260040160405180910390fd5b82816003015414611b36576040516306e671b760e31b815260040160405180910390fd5b80546001600160a01b03163314611b605760405163415360c560e11b815260040160405180910390fd5b6008546004820154611b729042612743565b1115611b915760405163603c988d60e11b815260040160405180910390fd5b600282018054611ba390600190612743565b81548110611bb357611bb361272d565b9060005260206000200154826002018581548110611bd357611bd361272d565b6000918252602082200191909155600c54600d908290611bf590600190612743565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611c3457611c34612974565b600190038181906000526020600020016000905590558060010154826003016000828254611c629190612743565b90915550506001810154600a8054600090611c7e908490612743565b90915550506001810154604051339180156108fc02916000818181858888f19350505050158015611480573d6000803e3d6000fd5b303314611cd357604051630b2db9b760e31b815260040160405180910390fd5b600c805460009190611ce790600190612743565b81548110611cf757611cf761272d565b906000526020600020906006020160050154905080600654611d199190612714565b600954611d269042612743565b1115611d455760405163d5ac976d60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0385161790556001611d6c83826127a7565b50505050565b303314611d9257604051630b2db9b760e31b815260040160405180910390fd5b6003546040516312a6505d60e21b81526001600160a01b0390911690634a99417490611dc4908590859060040161298a565b6020604051808303816000875af1158015611de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0791906126e5565b6004555050565b303314611e2e57604051630b2db9b760e31b815260040160405180910390fd5b600755565b600080600b8381548110611e4957611e4961272d565b60009182526020909120600260089092020101549392505050565b6040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015611e9357505050565b806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ece57600080fd5b505af1158015611ee2573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018790528516935063a9059cbb92506044019050600060405180830381600087803b158015611f3257600080fd5b505af1158015611f46573d6000803e3d6000fd5b50505050505050565b6040518060c001604052806000815260200160008152602001606081526020016000815260200160006002811115611f8957611f89612178565b8152602001600081525090565b6000815180845260005b81811015611fbc57602081850181015186830182015201611fa0565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611fef6020830184611f96565b9392505050565b60006020828403121561200857600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156120475783518352928401929184019160010161202b565b50909695505050505050565b6000806040838503121561206657600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156121295761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d0152612109828d0182611f96565b9287015115159b87019b909b5250985095890195918901916001016120d0565b5050505060608901516080890152608089015160a089015260a0890151955061215660c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b600381106121ac57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b8083101561220d57835182529284019260019290920191908401906121ed565b50606087015160808701526080870151935061222c60a087018561218e565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561228157612281612243565b604052919050565b60006001600160401b038211156122a2576122a2612243565b5060051b60200190565b6001600160a01b03811681146122c157600080fd5b50565b600082601f8301126122d557600080fd5b813560206122ea6122e583612289565b612259565b8083825260208201915060208460051b87010193508684111561230c57600080fd5b602086015b84811015612331578035612324816122ac565b8352918301918301612311565b509695505050505050565b600082601f83011261234d57600080fd5b8135602061235d6122e583612289565b8083825260208201915060208460051b87010193508684111561237f57600080fd5b602086015b848110156123315780358352918301918301612384565b600082601f8301126123ac57600080fd5b81356001600160401b038111156123c5576123c5612243565b6123d8601f8201601f1916602001612259565b8181528460208386010111156123ed57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561242257600080fd5b85356001600160401b038082111561243957600080fd5b61244589838a016122c4565b9650602088013591508082111561245b57600080fd5b61246789838a0161233c565b9550604088013591508082111561247d57600080fd5b61248989838a0161239b565b9450606088013591508082111561249f57600080fd5b6124ab89838a0161233c565b935060808801359150808211156124c157600080fd5b506124ce8882890161239b565b9150509295509295909350565b6000806000606084860312156124f057600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a08101612529606083018561218e565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006125606080830185611f96565b9050821515606083015295945050505050565b6000806040838503121561258657600080fd5b8235612591816122ac565b915060208301356001600160401b038111156125ac57600080fd5b6125b88582860161239b565b9150509250929050565b600080604083850312156125d557600080fd5b82356001600160401b03808211156125ec57600080fd5b6125f88683870161239b565b9350602085013591508082111561260e57600080fd5b506125b88582860161239b565b600181811c9082168061262f57607f821691505b60208210810361264f57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546126628161261b565b80855260206001838116801561267f5760018114612699576126c7565b60ff1985168884015283151560051b8801830195506126c7565b866000528260002060005b858110156126bf5781548a82018601529083019084016126a4565b890184019650505b505050505092915050565b602081526000611fef6020830184612655565b6000602082840312156126f757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115612727576127276126fe565b92915050565b634e487b7160e01b600052603260045260246000fd5b81810381811115612727576127276126fe565b601f8211156127a2576000816000526020600020601f850160051c8101602086101561277f5750805b601f850160051c820191505b8181101561279e5782815560010161278b565b5050505b505050565b81516001600160401b038111156127c0576127c0612243565b6127d4816127ce845461261b565b84612756565b602080601f83116001811461280957600084156127f15750858301515b600019600386901b1c1916600185901b17855561279e565b600085815260208120601f198616915b8281101561283857888601518255948401946001909101908401612819565b50858210156128565787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081546128738161261b565b6001828116801561288b57600181146128a0576128cf565b60ff19841687528215158302870194506128cf565b8560005260208060002060005b858110156128c65781548a8201529084019082016128ad565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b16815282601482015260006129036034830184612866565b95945050505050565b6000611fef8284612866565b60006001820161292a5761292a6126fe565b5060010190565b82815260406020820152600061294a6040830184612655565b949350505050565b60008261296f57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b60608152600060608201526080602082015260006129ab6080830185611f96565b82810360408401526129038185611f9656fea26469706673582212203eb0ce20128709ce0e25d07609542c5c1fd2df8b0d773b52b6377b98d8fada1f64736f6c63430008180033a26469706673582212208a8c8bf9d1e7493392661a016528e4a23e59e8481f5b2e6f93fa98c37412787964736f6c63430008180033", - "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200003a5760003560e01c8063a17ad8a7146200003f578063a2f7b3a51462000058575b600080fd5b62000056620000503660046200025c565b6200008b565b005b6200006f620000693660046200034f565b6200015b565b6040516001600160a01b03909116815260200160405180910390f35b60008a8a8a8a8a8a8a8a8a8a604051620000a59062000186565b620000ba9a99989796959493929190620003b1565b604051809103906000f080158015620000d7573d6000803e3d6000fd5b50600080546001810182558180527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b038416908117909155604051929350917f5425363a03f182281120f5919107c49c7a1a623acc1cbc6df468b6f0c11fcf8c9190a25050505050505050505050565b600081815481106200016c57600080fd5b6000918252602090912001546001600160a01b0316905081565b612f00806200044383390190565b80356001600160a01b0381168114620001ac57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001d957600080fd5b813567ffffffffffffffff80821115620001f757620001f7620001b1565b604051601f8301601f19908116603f01168101908282118183101715620002225762000222620001b1565b816040528381528660208588010111156200023c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806000806000806000806101408b8d0312156200027d57600080fd5b620002888b62000194565b995060208b013567ffffffffffffffff80821115620002a657600080fd5b620002b48e838f01620001c7565b9a50620002c460408e0162000194565b995060608d0135915080821115620002db57600080fd5b620002e98e838f01620001c7565b985060808d01359150808211156200030057600080fd5b506200030f8d828e01620001c7565b96505060a08b0135945060c08b0135935060e08b013592506101008b013591506200033e6101208c0162000194565b90509295989b9194979a5092959850565b6000602082840312156200036257600080fd5b5035919050565b6000815180845260005b81811015620003915760208185018101518683018201520162000373565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038b8116825261014060208301819052600091620003d98483018e62000369565b9150808c1660408501528382036060850152620003f7828c62000369565b915083820360808501526200040d828b62000369565b92508860a08501528760c08501528660e08501528561010085015280851661012085015250509b9a505050505050505050505056fe60806040523480156200001157600080fd5b5060405162002f0038038062002f00833981016040819052620000349162000225565b600080546001600160a01b0319166001600160a01b038c1617905560016200005d8a82620003a9565b50600280546001600160a01b038084166001600160a01b031992831617909255426009556005879055600686905560078590556008849055600c80546001908101909155600b8054909101815560005260038054928b1692909116821790556040516312a6505d60e21b8152634a99417490620000e1908a908a90600401620004a3565b6020604051808303816000875af115801562000101573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001279190620004e3565b60045550620004fd98505050505050505050565b80516001600160a01b03811681146200015357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200018b57818101518382015260200162000171565b50506000910152565b600082601f830112620001a657600080fd5b81516001600160401b0380821115620001c357620001c362000158565b604051601f8301601f19908116603f01168101908282118183101715620001ee57620001ee62000158565b816040528381528660208588010111156200020857600080fd5b6200021b8460208301602089016200016e565b9695505050505050565b6000806000806000806000806000806101408b8d0312156200024657600080fd5b620002518b6200013b565b60208c0151909a506001600160401b03808211156200026f57600080fd5b6200027d8e838f0162000194565b9a506200028d60408e016200013b565b995060608d0151915080821115620002a457600080fd5b620002b28e838f0162000194565b985060808d0151915080821115620002c957600080fd5b50620002d88d828e0162000194565b96505060a08b0151945060c08b0151935060e08b015192506101008b01519150620003076101208c016200013b565b90509295989b9194979a5092959850565b600181811c908216806200032d57607f821691505b6020821081036200034e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a4576000816000526020600020601f850160051c810160208610156200037f5750805b601f850160051c820191505b81811015620003a0578281556001016200038b565b5050505b505050565b81516001600160401b03811115620003c557620003c562000158565b620003dd81620003d6845462000318565b8462000354565b602080601f831160018114620004155760008415620003fc5750858301515b600019600386901b1c1916600185901b178555620003a0565b600085815260208120601f198616915b82811015620004465788860151825594840194600190910190840162000425565b5085821015620004655787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526200048f8160208601602086016200016e565b601f01601f19169290920160200192915050565b6060815260006060820152608060208201526000620004c6608083018562000475565b8281036040840152620004da818562000475565b95945050505050565b600060208284031215620004f657600080fd5b5051919050565b6129f3806200050d6000396000f3fe6080604052600436106101b25760003560e01c806383c4b7a3116100ed578063b6cd08c611610090578063b6cd08c614610519578063b6dc775414610539578063ba7079ca1461054e578063bb0b86ff1461056e578063c4bd851914610584578063c5d552881461059a578063cc2bcdb4146105ba578063dc17bbdb146105da578063f730c07f146105fa57600080fd5b806383c4b7a3146103d75780639244c70414610408578063953d66511461041d5780639c15d1a21461043d578063a0af81f014610453578063a3c595c914610473578063ad73349e146104a3578063b51257001461050457600080fd5b80633e8686cc116101555780633e8686cc146102e9578063402ff0db1461031657806346047838146103435780636c0b7e71146103565780636cc6cde11461036b5780636cf39c2b1461038b57806377b9fda8146103ab5780637aa77f29146103c157600080fd5b80630c7ac7b6146101be5780631b1f5e7b146101e957806321cea5381461020c57806322b52d6614610239578063246c76df1461024f57806324baacc7146102715780632d68efc914610291578063311a6c56146102c957600080fd5b366101b957005b600080fd5b3480156101ca57600080fd5b506101d3610610565b6040516101e09190611fdc565b60405180910390f35b3480156101f557600080fd5b506101fe61069e565b6040519081526020016101e0565b34801561021857600080fd5b5061022c610227366004611ff6565b610723565b6040516101e0919061200f565b34801561024557600080fd5b506101fe60075481565b34801561025b57600080fd5b5061026f61026a366004611ff6565b6107a5565b005b34801561027d57600080fd5b5061026f61028c366004611ff6565b6107ca565b34801561029d57600080fd5b506002546102b1906001600160a01b031681565b6040516001600160a01b0390911681526020016101e0565b3480156102d557600080fd5b5061026f6102e4366004612053565b6107ef565b3480156102f557600080fd5b50610309610304366004611ff6565b6109c1565b6040516101e09190612075565b34801561032257600080fd5b50610336610331366004611ff6565b610bbc565b6040516101e091906121b0565b61026f61035136600461240a565b610caa565b34801561036257600080fd5b506101fe6112b1565b34801561037757600080fd5b506000546102b1906001600160a01b031681565b34801561039757600080fd5b5061026f6103a63660046124db565b6112c3565b3480156103b757600080fd5b506101fe600a5481565b3480156103cd57600080fd5b506101fe60045481565b3480156103e357600080fd5b506103f76103f2366004611ff6565b611487565b6040516101e0959493929190612507565b34801561041457600080fd5b5061026f6114ce565b34801561042957600080fd5b5061026f610438366004611ff6565b611841565b34801561044957600080fd5b506101fe60085481565b34801561045f57600080fd5b506003546102b1906001600160a01b031681565b34801561047f57600080fd5b5061049361048e366004612053565b6118d9565b6040516101e09493929190612539565b3480156104af57600080fd5b506104c36104be366004611ff6565b6119f3565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101e0565b34801561051057600080fd5b506101fe611a4f565b34801561052557600080fd5b5061026f610534366004612053565b611a5f565b34801561054557600080fd5b50600b546101fe565b34801561055a57600080fd5b5061026f610569366004612573565b611cb3565b34801561057a57600080fd5b506101fe60055481565b34801561059057600080fd5b506101fe60065481565b3480156105a657600080fd5b5061026f6105b53660046125c2565b611d72565b3480156105c657600080fd5b5061026f6105d5366004611ff6565b611e0e565b3480156105e657600080fd5b506101fe6105f5366004611ff6565b611e33565b34801561060657600080fd5b506101fe60095481565b6001805461061d9061261b565b80601f01602080910402602001604051908101604052809291908181526020018280546106499061261b565b80156106965780601f1061066b57610100808354040283529160200191610696565b820191906000526020600020905b81548152906001019060200180831161067957829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea9906106d0906001906004016126d2565b602060405180830381865afa1580156106ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071191906126e5565b60055461071e9190612714565b905090565b60606000600c838154811061073a5761073a61272d565b906000526020600020906006020190508060020180548060200260200160405190810160405280929190818152602001828054801561079857602002820191906000526020600020905b815481526020019060010190808311610784575b5050505050915050919050565b3033146107c557604051630b2db9b760e31b815260040160405180910390fd5b600855565b3033146107ea57604051630b2db9b760e31b815260040160405180910390fd5b600555565b600c80546000919061080390600190612743565b815481106108135761081361272d565b600091825260208220915460069190910290910191506001600160a01b031633146108515760405163381a2cb560e11b815260040160405180910390fd5b6001600482015460ff16600281111561086c5761086c612178565b1461088a576040516310cec38560e21b815260040160405180910390fd5b60028101548211156108af57604051631f6edbfd60e01b815260040160405180910390fd5b811561093f576000600b600283016108c8600186612743565b815481106108d8576108d861272d565b9060005260206000200154815481106108f3576108f361272d565b600091825260209091206005600890920201908101805460ff191660011790554260068201556003830154600254825492935061093d926001600160a01b03908116929116611e64565b505b8060030154600a60008282546109559190612743565b90915550506000600382018190554260095560048201805460ff19166002179055828255600c805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a1760405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600b8281548110610a2a57610a2a61272d565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610b76576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610ad39061261b565b80601f0160208091040260200160405190810160405280929190818152602001828054610aff9061261b565b8015610b4c5780601f10610b2157610100808354040283529160200191610b4c565b820191906000526020600020905b815481529060010190602001808311610b2f57829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610a80565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610bc4611f4f565b600c8281548110610bd757610bd761272d565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610c5357602002820191906000526020600020905b815481526020019060010190808311610c3f575b505050918352505060038201546020820152600482015460409091019060ff166002811115610c8457610c84612178565b6002811115610c9557610c95612178565b81526020016005820154815250509050919050565b600c805460009190610cbe90600190612743565b81548110610cce57610cce61272d565b906000526020600020906006020160050154905080600654610cf09190612714565b600954610cfd9042612743565b1115610d1c5760405163d5ac976d60e01b815260040160405180910390fd5b8451865114610d3e57604051638f32290560e01b815260040160405180910390fd5b8251865114610d6057604051633222108360e01b815260040160405180910390fd5b600c805460009190610d7490600190612743565b81548110610d8457610d8461272d565b60009182526020808320600b8054600181018255945260089093027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3b91906126e5565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610e71906001906004016126d2565b602060405180830381865afa158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb291906126e5565b600554610ebf9190612714565b60018201819055341015610ee65760405163070f6eed60e11b815260040160405180910390fd5b60008080805b8b518110156110f2576000898281518110610f0957610f0961272d565b60200260200101516001600160401b03811115610f2857610f28612243565b6040519080825280601f01601f191660200182016040528015610f52576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110610f8757610f8761272d565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d9084908110610fc057610fc061272d565b6020026020010151816001018190555060005b8b8481518110610fe557610fe561272d565b602002602001015181101561104b578c610fff8287612714565b8151811061100f5761100f61272d565b602001015160f81c60f81b83828151811061102c5761102c61272d565b60200101906001600160f81b031916908160001a905350600101610fd3565b506002810161105a83826127a7565b508a838151811061106d5761106d61272d565b6020026020010151846110809190612714565b815460018301546040519296506110aa926001600160a01b039092169160028501906020016128d9565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610eec565b50600c54600d9060009061110890600190612743565b81526020808201929092526040908101600090812086825290925290205460ff166111465760405163607cb3e760e01b815260040160405180910390fd5b6001600d60006001600c8054905061115e9190612743565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916111b2908490612714565b9091555050600b5460028601906111cb90600190612743565b815460018181018455600093845260209093200155600286015490036111fe576009546111f89042612743565b60058601555b600c5461120d90600190612743565b600b54339061121e90600190612743565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a60405161124d9190611fdc565b60405180910390a460008460010154346112679190612743565b905080156112885760025461128890339083906001600160a01b0316611e64565b8460010154600a600082825461129e9190612714565b9091555050505050505050505050505050565b600c5460009061071e90600190612743565b6000600b84815481106112d8576112d861272d565b60009182526020909120600890910201600581015490915060ff1661130f5760405162325f4560e91b815260040160405180910390fd5b60075460068201546113219042612743565b111561134057604051638b349aa560e01b815260040160405180910390fd5b825b600282015481108015611365575082158061136557506113628385612714565b81105b156114805760008260020182815481106113815761138161272d565b90600052602060002090600402019050600061139b611a4f565b600383015490915060ff161580156113b7575080826001015411155b1561146b57815460018301546040516000926001600160a01b031691906113e290600287019061290c565b60006040518083038185875af1925050503d806000811461141f576040519150601f19603f3d011682016040523d82523d6000602084013e611424565b606091505b509091505080151560010361146957600383015460ff161561145957604051630dc1019760e01b815260040160405180910390fd5b60038301805460ff191660011790555b505b5050808061147890612918565b915050611342565b5050505050565b600c818154811061149757600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600c8054600091906114e290600190612743565b815481106114f2576114f261272d565b9060005260206000209060060201600501549050806006546115149190612714565b6009546115219042612743565b1161153f57604051631875ed4760e21b815260040160405180910390fd5b600c80546000919061155390600190612743565b815481106115635761156361272d565b6000918252602082206006909102019150600482015460ff16600281111561158d5761158d612178565b146115ab576040516304ee891b60e11b815260040160405180910390fd5b60028101546000036115d85742600955600401805460ff1916600217905550600c80546001018155600052565b60028101546001036116a7576000600b826002016000815481106115fe576115fe61272d565b9060005260206000200154815481106116195761161961272d565b6000918252602082206005600890920201908101805460ff191660011790554260068201556003840180549290556002548154919350611667916001600160a01b0390811691849116611e64565b4260095560048301805460ff19166002179055600c805460010181556000908152600a805483929061169a908490612743565b9091555061183d92505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926116e992016126d2565b602060405180830381865afa158015611706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172a91906126e5565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e19184916117669190600190600401612931565b60206040518083038185885af1158015611784573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117a991906126e5565b6001830155600382015481106117c05760006117d0565b8082600301546117d09190612743565b6003830155600a5481106117e55760006117f3565b80600a546117f39190612743565b600a5560018201546000546004546040519081526001600160a01b03909116907fee1017dcbefba87397fcdaab31f187328533572b6a5568177fa2eb64026003b6906020016109b4565b5050565b30331461186157604051630b2db9b760e31b815260040160405180910390fd5b600c80546000919061187590600190612743565b815481106118855761188561272d565b9060005260206000209060060201600501549050806006546118a79190612714565b6009546118b49042612743565b11156118d35760405163d5ac976d60e01b815260040160405180910390fd5b50600655565b6000806060600080600b87815481106118f4576118f461272d565b90600052602060002090600802019050600081600201878154811061191b5761191b61272d565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff9091169082906119609061261b565b80601f016020809104026020016040519081016040528092919081815260200182805461198c9061261b565b80156119d95780601f106119ae576101008083540402835291602001916119d9565b820191906000526020600020905b8154815290600101906020018083116119bc57829003601f168201915b505050505091509550955095509550505092959194509250565b600b8181548110611a0357600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600a544761071e9190612743565b600c805460009190611a7390600190612743565b81548110611a8357611a8361272d565b906000526020600020906006020190506000600b826002018581548110611aac57611aac61272d565b906000526020600020015481548110611ac757611ac761272d565b906000526020600020906008020190506002600654611ae69190612952565b600954611af39042612743565b1115611b125760405163383f4af360e21b815260040160405180910390fd5b82816003015414611b36576040516306e671b760e31b815260040160405180910390fd5b80546001600160a01b03163314611b605760405163415360c560e11b815260040160405180910390fd5b6008546004820154611b729042612743565b1115611b915760405163603c988d60e11b815260040160405180910390fd5b600282018054611ba390600190612743565b81548110611bb357611bb361272d565b9060005260206000200154826002018581548110611bd357611bd361272d565b6000918252602082200191909155600c54600d908290611bf590600190612743565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611c3457611c34612974565b600190038181906000526020600020016000905590558060010154826003016000828254611c629190612743565b90915550506001810154600a8054600090611c7e908490612743565b90915550506001810154604051339180156108fc02916000818181858888f19350505050158015611480573d6000803e3d6000fd5b303314611cd357604051630b2db9b760e31b815260040160405180910390fd5b600c805460009190611ce790600190612743565b81548110611cf757611cf761272d565b906000526020600020906006020160050154905080600654611d199190612714565b600954611d269042612743565b1115611d455760405163d5ac976d60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0385161790556001611d6c83826127a7565b50505050565b303314611d9257604051630b2db9b760e31b815260040160405180910390fd5b6003546040516312a6505d60e21b81526001600160a01b0390911690634a99417490611dc4908590859060040161298a565b6020604051808303816000875af1158015611de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0791906126e5565b6004555050565b303314611e2e57604051630b2db9b760e31b815260040160405180910390fd5b600755565b600080600b8381548110611e4957611e4961272d565b60009182526020909120600260089092020101549392505050565b6040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015611e9357505050565b806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ece57600080fd5b505af1158015611ee2573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018790528516935063a9059cbb92506044019050600060405180830381600087803b158015611f3257600080fd5b505af1158015611f46573d6000803e3d6000fd5b50505050505050565b6040518060c001604052806000815260200160008152602001606081526020016000815260200160006002811115611f8957611f89612178565b8152602001600081525090565b6000815180845260005b81811015611fbc57602081850181015186830182015201611fa0565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611fef6020830184611f96565b9392505050565b60006020828403121561200857600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156120475783518352928401929184019160010161202b565b50909695505050505050565b6000806040838503121561206657600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156121295761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d0152612109828d0182611f96565b9287015115159b87019b909b5250985095890195918901916001016120d0565b5050505060608901516080890152608089015160a089015260a0890151955061215660c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b600381106121ac57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b8083101561220d57835182529284019260019290920191908401906121ed565b50606087015160808701526080870151935061222c60a087018561218e565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561228157612281612243565b604052919050565b60006001600160401b038211156122a2576122a2612243565b5060051b60200190565b6001600160a01b03811681146122c157600080fd5b50565b600082601f8301126122d557600080fd5b813560206122ea6122e583612289565b612259565b8083825260208201915060208460051b87010193508684111561230c57600080fd5b602086015b84811015612331578035612324816122ac565b8352918301918301612311565b509695505050505050565b600082601f83011261234d57600080fd5b8135602061235d6122e583612289565b8083825260208201915060208460051b87010193508684111561237f57600080fd5b602086015b848110156123315780358352918301918301612384565b600082601f8301126123ac57600080fd5b81356001600160401b038111156123c5576123c5612243565b6123d8601f8201601f1916602001612259565b8181528460208386010111156123ed57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561242257600080fd5b85356001600160401b038082111561243957600080fd5b61244589838a016122c4565b9650602088013591508082111561245b57600080fd5b61246789838a0161233c565b9550604088013591508082111561247d57600080fd5b61248989838a0161239b565b9450606088013591508082111561249f57600080fd5b6124ab89838a0161233c565b935060808801359150808211156124c157600080fd5b506124ce8882890161239b565b9150509295509295909350565b6000806000606084860312156124f057600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a08101612529606083018561218e565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006125606080830185611f96565b9050821515606083015295945050505050565b6000806040838503121561258657600080fd5b8235612591816122ac565b915060208301356001600160401b038111156125ac57600080fd5b6125b88582860161239b565b9150509250929050565b600080604083850312156125d557600080fd5b82356001600160401b03808211156125ec57600080fd5b6125f88683870161239b565b9350602085013591508082111561260e57600080fd5b506125b88582860161239b565b600181811c9082168061262f57607f821691505b60208210810361264f57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546126628161261b565b80855260206001838116801561267f5760018114612699576126c7565b60ff1985168884015283151560051b8801830195506126c7565b866000528260002060005b858110156126bf5781548a82018601529083019084016126a4565b890184019650505b505050505092915050565b602081526000611fef6020830184612655565b6000602082840312156126f757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115612727576127276126fe565b92915050565b634e487b7160e01b600052603260045260246000fd5b81810381811115612727576127276126fe565b601f8211156127a2576000816000526020600020601f850160051c8101602086101561277f5750805b601f850160051c820191505b8181101561279e5782815560010161278b565b5050505b505050565b81516001600160401b038111156127c0576127c0612243565b6127d4816127ce845461261b565b84612756565b602080601f83116001811461280957600084156127f15750858301515b600019600386901b1c1916600185901b17855561279e565b600085815260208120601f198616915b8281101561283857888601518255948401946001909101908401612819565b50858210156128565787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081546128738161261b565b6001828116801561288b57600181146128a0576128cf565b60ff19841687528215158302870194506128cf565b8560005260208060002060005b858110156128c65781548a8201529084019082016128ad565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b16815282601482015260006129036034830184612866565b95945050505050565b6000611fef8284612866565b60006001820161292a5761292a6126fe565b5060010190565b82815260406020820152600061294a6040830184612655565b949350505050565b60008261296f57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b60608152600060608201526080602082015260006129ab6080830185611f96565b82810360408401526129038185611f9656fea26469706673582212203eb0ce20128709ce0e25d07609542c5c1fd2df8b0d773b52b6377b98d8fada1f64736f6c63430008180033a26469706673582212208a8c8bf9d1e7493392661a016528e4a23e59e8481f5b2e6f93fa98c37412787964736f6c63430008180033", + "numDeployments": 14, + "solcInputHash": "cd6d9ab2234a0ebc82824f25c5ddf74e", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract KlerosGovernor\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"NewGovernor\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_arbitratorExtraData\",\"type\":\"bytes\"},{\"internalType\":\"contract IDisputeTemplateRegistry\",\"name\":\"_templateRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_templateData\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_templateDataMappings\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_submissionBaseDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_submissionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_executionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_withdrawTimeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_wNative\",\"type\":\"address\"}],\"name\":\"deploy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"instances\",\"outputs\":[{\"internalType\":\"contract KlerosGovernor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"NewGovernor(address)\":{\"details\":\"Emitted when a new Governor contract is deployed using this factory.\",\"params\":{\"_address\":\"The address of the newly deployed Governor contract.\"}}},\"kind\":\"dev\",\"methods\":{\"deploy(address,bytes,address,string,string,uint256,uint256,uint256,uint256,address)\":{\"details\":\"Deploy the arbitrable kleros.\",\"params\":{\"_arbitrator\":\"The arbitrator of the contract.\",\"_arbitratorExtraData\":\"Extra data for the arbitrator.\",\"_executionTimeout\":\"Time in seconds after approval that allows to execute transactions of the approved list.\",\"_submissionBaseDeposit\":\"The base deposit required for submission.\",\"_submissionTimeout\":\"Time in seconds allocated for submitting transaction list.\",\"_templateData\":\"The dispute template data.\",\"_templateDataMappings\":\"The dispute template data mappings.\",\"_templateRegistry\":\"Dispute Template registry address\",\"_wNative\":\"The wrapped native token address, typically wETH.\",\"_withdrawTimeout\":\"Time in seconds after submission that allows to withdraw submitted list.\"}}},\"title\":\"GovernorFactory This contract acts as a registry for KlerosGovernor instances.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/GovernorFactory.sol\":\"GovernorFactory\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[]},\"sources\":{\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport {IArbitratorV2} from \\\"./IArbitratorV2.sol\\\";\\n\\n/// @title IArbitrableV2\\n/// @notice Arbitrable interface.\\n/// @dev When developing arbitrable contracts, we need to:\\n/// - Define the action taken when a ruling is received by the contract.\\n/// - Allow dispute creation which calls `arbitrator.createDispute{value: _fee}(_choices,_extraData)`.\\ninterface IArbitrableV2 {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a dispute is created to link the correct template to the disputeID.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorDisputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _templateId The identifier of the dispute template.\\n event DisputeRequest(IArbitratorV2 indexed _arbitrator, uint256 indexed _arbitratorDisputeID, uint256 _templateId);\\n\\n /// @notice To be raised when a ruling is given.\\n /// @param _arbitrator The arbitrator giving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitratorV2 indexed _arbitrator, uint256 indexed _disputeID, uint256 _ruling);\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Give a ruling for a dispute.\\n ///\\n /// @dev This is a callback function for the arbitrator to provide the ruling to this contract.\\n /// Only the arbitrator must be allowed to call this function.\\n /// Ruling 0 is reserved for \\\"Not able/wanting to make a decision\\\".\\n ///\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator.\\n function rule(uint256 _disputeID, uint256 _ruling) external;\\n}\\n\",\"keccak256\":\"0x97c6455e4b9f57e76f338f43eea612ea47ac933dda85c08ef29d418e34879a9b\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitratorV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport {IArbitrableV2} from \\\"./IArbitrableV2.sol\\\";\\n\\n/// @title Arbitrator\\n/// @notice Arbitrator interface for the Kleros V2 protocol.\\n/// @dev Unlike the ERC-792 this standard is not concerned with appeals, so each arbitrator can implement an appeal system that suits it the most.\\ninterface IArbitratorV2 {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a dispute is created.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _arbitrable The contract which created the dispute.\\n event DisputeCreation(uint256 indexed _disputeID, IArbitrableV2 indexed _arbitrable);\\n\\n /// @notice To be raised when a ruling is given.\\n /// @param _arbitrable The arbitrable receiving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitrableV2 indexed _arbitrable, uint256 indexed _disputeID, uint256 _ruling);\\n\\n /// @notice To be emitted when an ERC20 token is added or removed as a method to pay fees.\\n /// @param _token The ERC20 token.\\n /// @param _accepted Whether the token is accepted or not.\\n event AcceptedFeeToken(IERC20 indexed _token, bool indexed _accepted);\\n\\n /// @notice To be emitted when the fee for a particular ERC20 token is updated.\\n /// @param _feeToken The ERC20 token.\\n /// @param _rateInEth The new rate of the fee token in ETH.\\n /// @param _rateDecimals The new decimals of the fee token rate.\\n event NewCurrencyRate(IERC20 indexed _feeToken, uint64 _rateInEth, uint8 _rateDecimals);\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Create a dispute and pay for the fees in the native currency, typically ETH.\\n /// @dev Must be called by the arbitrable contract and pay at least `arbitrationCost(_extraData)` in ETH.\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData\\n ) external payable returns (uint256 disputeID);\\n\\n /// @notice Create a dispute and pay for the fees in a supported ERC20 token.\\n /// @dev Must be called by the arbitrable contract and pay at least `arbitrationCost(_extraData, _feeToken)` in the supported ERC20 token.\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @param _feeAmount Amount of the ERC20 token used to pay fees.\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData,\\n IERC20 _feeToken,\\n uint256 _feeAmount\\n ) external returns (uint256 disputeID);\\n\\n // ************************************* //\\n // * Public Views * //\\n // ************************************* //\\n\\n /// @notice Compute the cost of arbitration denominated in the native currency, typically ETH.\\n /// @dev It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return cost The arbitration cost in ETH.\\n function arbitrationCost(bytes calldata _extraData) external view returns (uint256 cost);\\n\\n /// @notice Compute the cost of arbitration denominated in `_feeToken`.\\n /// @dev It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @return cost The arbitration cost in `_feeToken`.\\n function arbitrationCost(bytes calldata _extraData, IERC20 _feeToken) external view returns (uint256 cost);\\n\\n /// @notice Gets the current ruling of a specified dispute.\\n /// @param _disputeID The ID of the dispute.\\n /// @return ruling The current ruling.\\n /// @return tied Whether it's a tie or not.\\n /// @return overridden Whether the ruling was overridden by appeal funding or not.\\n function currentRuling(uint256 _disputeID) external view returns (uint256 ruling, bool tied, bool overridden);\\n}\\n\",\"keccak256\":\"0x1f4e84e23034f3a291e305e8c69f283c9c97354a49a24f8c02ca366b3eaae00f\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\n/// @title IDisputeTemplateRegistry\\n/// @notice Dispute Template Registry interface.\\ninterface IDisputeTemplateRegistry {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a new dispute template is created.\\n /// @param _templateId The identifier of the dispute template.\\n /// @param _templateTag An optional tag for the dispute template, such as \\\"registration\\\" or \\\"removal\\\".\\n /// @param _templateData The template data.\\n /// @param _templateDataMappings The data mappings.\\n event DisputeTemplate(\\n uint256 indexed _templateId,\\n string indexed _templateTag,\\n string _templateData,\\n string _templateDataMappings\\n );\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Registers a new dispute template.\\n /// @param _templateTag An optional tag for the dispute template, such as \\\"registration\\\" or \\\"removal\\\".\\n /// @param _templateData The template data.\\n /// @param _templateDataMappings The data mappings for the template.\\n /// @return templateId The identifier of the dispute template.\\n function setDisputeTemplate(\\n string memory _templateTag,\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external returns (uint256 templateId);\\n}\\n\",\"keccak256\":\"0x1d6ad6549baabcbfe306ac3a9a3c339bb2d5dcb67fa9f3c5eaed0c9bd3548b12\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\"},\"src/GovernorFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.24;\\n\\nimport {IArbitratorV2} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\\\";\\nimport {\\n IDisputeTemplateRegistry\\n} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\\\";\\nimport {KlerosGovernor} from \\\"./KlerosGovernor.sol\\\";\\n\\n/// @title GovernorFactory\\n/// This contract acts as a registry for KlerosGovernor instances.\\ncontract GovernorFactory {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @dev Emitted when a new Governor contract is deployed using this factory.\\n /// @param _address The address of the newly deployed Governor contract.\\n event NewGovernor(KlerosGovernor indexed _address);\\n\\n // ************************************* //\\n // * Storage * //\\n // ************************************* //\\n\\n KlerosGovernor[] public instances;\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @dev Deploy the arbitrable kleros.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorExtraData Extra data for the arbitrator.\\n /// @param _templateRegistry Dispute Template registry address\\n /// @param _templateData The dispute template data.\\n /// @param _templateDataMappings The dispute template data mappings.\\n /// @param _submissionBaseDeposit The base deposit required for submission.\\n /// @param _submissionTimeout Time in seconds allocated for submitting transaction list.\\n /// @param _executionTimeout Time in seconds after approval that allows to execute transactions of the approved list.\\n /// @param _withdrawTimeout Time in seconds after submission that allows to withdraw submitted list.\\n /// @param _wNative The wrapped native token address, typically wETH.\\n function deploy(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData,\\n IDisputeTemplateRegistry _templateRegistry,\\n string memory _templateData,\\n string memory _templateDataMappings,\\n uint256 _submissionBaseDeposit,\\n uint256 _submissionTimeout,\\n uint256 _executionTimeout,\\n uint256 _withdrawTimeout,\\n address _wNative\\n ) public {\\n KlerosGovernor instance = new KlerosGovernor(\\n _arbitrator,\\n _arbitratorExtraData,\\n _templateRegistry,\\n _templateData,\\n _templateDataMappings,\\n _submissionBaseDeposit,\\n _submissionTimeout,\\n _executionTimeout,\\n _withdrawTimeout,\\n _wNative\\n );\\n instances.push(instance);\\n emit NewGovernor(instance);\\n }\\n}\\n\",\"keccak256\":\"0x4e65a64af94bcc1a8f4ade4ac268a97cec5517278d1bd60b6897e3b7ed564e82\",\"license\":\"MIT\"},\"src/KlerosGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.24;\\n\\nimport {IArbitrableV2} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\\\";\\nimport {IArbitratorV2} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitratorV2.sol\\\";\\nimport {\\n IDisputeTemplateRegistry\\n} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\\\";\\nimport {SafeSend} from \\\"./libraries/SafeSend.sol\\\";\\nimport {ArbSys} from \\\"./interfaces/IArbSys.sol\\\";\\n\\n/// @title KlerosGovernor for V2.\\n/// @dev Appeal and evidence submission is handled by the court.\\ncontract KlerosGovernor is IArbitrableV2 {\\n using SafeSend for address payable;\\n\\n // ************************************* //\\n // * Enums / Structs * //\\n // ************************************* //\\n\\n enum Status {\\n NoDispute,\\n DisputeCreated,\\n Resolved\\n }\\n\\n struct Session {\\n uint256 ruling; // The ruling that was given in this session, if any.\\n uint256 disputeID; // ID given to the dispute of the session, if any.\\n uint256[] submittedLists; // Tracks all lists that were submitted in a session in the form submittedLists[submissionID].\\n uint256 sumDeposit; // Sum of all submission deposits in a session (minus arbitration fees). This is used to calculate the reward.\\n Status status; // Status of a session.\\n uint256 durationOffset; // Time in seconds that prolongs the submission period after the first submission, to give other submitters time to react.\\n }\\n\\n struct Transaction {\\n address target; // The address to call.\\n uint256 value; // Value paid by governor contract that will be used as msg.value in the execution.\\n bytes data; // Calldata of the transaction.\\n bool executed; // Whether the transaction was already executed or not.\\n }\\n\\n struct Submission {\\n address payable submitter; // The one who submits the list.\\n uint256 deposit; // Value of the deposit paid upon submission of the list.\\n Transaction[] txs; // Transactions stored in the list in the form txs[_transactionIndex].\\n bytes32 listHash; // A hash chain of all transactions stored in the list. This is used as a unique identifier within a session.\\n uint256 submissionTime; // The time when the list was submitted.\\n bool approved; // Whether the list was approved for execution or not.\\n uint256 approvalTime; // The time when the list was approved.\\n uint256 submissionBlock; // Block of list submission.\\n }\\n\\n ArbSys constant arbSys = ArbSys(address(100)); // ArbSys implementation https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference#arbsys\\n IArbitratorV2 public arbitrator; // Arbitrator contract.\\n bytes public arbitratorExtraData; // Extra data for arbitrator.\\n address public wNative; // The wrapped native token for safeSend().\\n IDisputeTemplateRegistry public templateRegistry; // The dispute template registry.\\n uint256 public templateId; // The current dispute template identifier.\\n\\n uint256 public submissionBaseDeposit; // The base deposit in wei that needs to be paid in order to submit the list.\\n uint256 public submissionTimeout; // Time in seconds allowed for submitting the lists. Once it's passed the contract enters the approval period.\\n uint256 public executionTimeout; // Time in seconds allowed for the execution of approved lists.\\n uint256 public withdrawTimeout; // Time in seconds allowed to withdraw a submitted list.\\n\\n uint256 public lastApprovalTime; // The time of the last approval of a transaction list.\\n uint256 public reservedETH; // Sum of contract's submission deposits. These funds are not to be used in the execution of transactions.\\n\\n Submission[] public submissions; // Stores all created transaction lists. submissions[_listID].\\n Session[] public sessions; // Stores all submitting sessions. sessions[_session].\\n mapping(uint256 sessionIndex => mapping(bytes32 listHash => bool)) alreadySubmitted; // Indicates whether or not the transaction list was already submitted in order to catch duplicates in the form alreadySubmitted[listHash].\\n mapping(uint256 disputeID => uint256 sessionIndex) public arbitratorDisputeIDToSessionIndex; // Maps core arbitrator's dispute ID to session index.\\n // ************************************* //\\n // * Function Modifiers * //\\n // ************************************* //\\n\\n modifier duringSubmissionPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n if (block.timestamp - lastApprovalTime > submissionTimeout + offset) revert SubmissionTimeHasEnded();\\n _;\\n }\\n\\n modifier duringApprovalPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n if (block.timestamp - lastApprovalTime <= submissionTimeout + offset) revert ApprovalTimeNotStarted();\\n _;\\n }\\n\\n modifier onlyByOwner() {\\n if (address(this) != msg.sender) revert OwnerOnly();\\n _;\\n }\\n\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice Emitted when a new list is submitted.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _submitter The address that submitted the list.\\n /// @param _session The number of the current session.\\n /// @param _description The string in CSV format that contains labels of list's transactions.\\n /// Note that the submitter may give bad descriptions of correct actions, but this is to be seen as UI enhancement, not a critical feature and that would play against him in case of dispute.\\n event ListSubmitted(\\n uint256 indexed _listID,\\n address indexed _submitter,\\n uint256 indexed _session,\\n string _description\\n );\\n\\n // ************************************* //\\n // * Constructor * //\\n // ************************************* //\\n\\n /// @notice Constructor.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorExtraData Extra data for the arbitrator.\\n /// @param _templateRegistry Dispute Template registry address\\n /// @param _templateData The dispute template data.\\n /// @param _templateDataMappings The dispute template data mappings.\\n /// @param _submissionBaseDeposit The base deposit required for submission.\\n /// @param _submissionTimeout Time in seconds allocated for submitting transaction list.\\n /// @param _executionTimeout Time in seconds after approval that allows to execute transactions of the approved list.\\n /// @param _withdrawTimeout Time in seconds after submission that allows to withdraw submitted list.\\n /// @param _wNative The wrapped native token address, typically wETH.\\n constructor(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData,\\n IDisputeTemplateRegistry _templateRegistry,\\n string memory _templateData,\\n string memory _templateDataMappings,\\n uint256 _submissionBaseDeposit,\\n uint256 _submissionTimeout,\\n uint256 _executionTimeout,\\n uint256 _withdrawTimeout,\\n address _wNative\\n ) {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n wNative = _wNative;\\n\\n lastApprovalTime = block.timestamp;\\n submissionBaseDeposit = _submissionBaseDeposit;\\n submissionTimeout = _submissionTimeout;\\n executionTimeout = _executionTimeout;\\n withdrawTimeout = _withdrawTimeout;\\n sessions.push();\\n submissions.push();\\n\\n templateRegistry = _templateRegistry;\\n templateId = IDisputeTemplateRegistry(templateRegistry).setDisputeTemplate(\\n \\\"\\\",\\n _templateData,\\n _templateDataMappings\\n );\\n }\\n\\n // ************************************* //\\n // * Governance * //\\n // ************************************* //\\n\\n /// @notice Changes the value of the base deposit required for submitting a list.\\n /// @param _submissionBaseDeposit The new value of the base deposit, in wei.\\n function changeSubmissionDeposit(uint256 _submissionBaseDeposit) external onlyByOwner {\\n submissionBaseDeposit = _submissionBaseDeposit;\\n }\\n\\n /// @notice Changes the time allocated for submission.\\n /// @dev It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract\\n /// and prolonging submission timeout might switch it back to submission period.\\n /// @param _submissionTimeout The new duration of the submission period, in seconds.\\n function changeSubmissionTimeout(uint256 _submissionTimeout) external onlyByOwner duringSubmissionPeriod {\\n submissionTimeout = _submissionTimeout;\\n }\\n\\n /// @notice Changes the time allocated for list's execution.\\n /// @param _executionTimeout The new duration of the execution timeout, in seconds.\\n function changeExecutionTimeout(uint256 _executionTimeout) external onlyByOwner {\\n executionTimeout = _executionTimeout;\\n }\\n\\n /// @notice Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period.\\n /// @param _withdrawTimeout The new duration of withdraw period, in seconds.\\n function changeWithdrawTimeout(uint256 _withdrawTimeout) external onlyByOwner {\\n withdrawTimeout = _withdrawTimeout;\\n }\\n\\n /// @notice Changes the arbitrator of the contract.\\n /// @dev It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract.\\n /// @param _arbitrator The new trusted arbitrator.\\n /// @param _arbitratorExtraData The extra data used by the new arbitrator.\\n function changeArbitrator(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData\\n ) external onlyByOwner duringSubmissionPeriod {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n }\\n\\n /// @notice Update the dispute template data.\\n /// @param _templateData The new dispute template data.\\n /// @param _templateDataMappings The new dispute template data mappings.\\n function changeDisputeTemplate(\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external onlyByOwner {\\n templateId = templateRegistry.setDisputeTemplate(\\\"\\\", _templateData, _templateDataMappings);\\n }\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Creates transaction list based on input parameters and submits it for potential approval and execution.\\n /// @param _target List of addresses to call.\\n /// @param _value List of values required for respective addresses.\\n /// @param _data Concatenated calldata of all transactions of this list.\\n /// @param _dataSize List of lengths in bytes required to split calldata for its respective targets.\\n /// @param _description String in CSV format that describes list's transactions.\\n function submitList(\\n address[] memory _target,\\n uint256[] memory _value,\\n bytes memory _data,\\n uint256[] memory _dataSize,\\n string memory _description\\n ) external payable duringSubmissionPeriod {\\n if (_target.length != _value.length) revert WrongInputTargetAndValue();\\n if (_target.length != _dataSize.length) revert WrongInputTargetAndDatasize();\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions.push();\\n submission.submitter = payable(msg.sender);\\n\\n // https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/block-numbers-and-time\\n submission.submissionBlock = arbSys.arbBlockNumber();\\n\\n // Do the assignment first to avoid creating a new variable and bypass a 'stack too deep' error.\\n submission.deposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n if (msg.value < submission.deposit) revert InsufficientDeposit();\\n\\n bytes32 listHash;\\n bytes32 currentTxHash;\\n uint256 readingPosition;\\n for (uint256 i = 0; i < _target.length; i++) {\\n bytes memory readData = new bytes(_dataSize[i]);\\n Transaction storage transaction = submission.txs.push();\\n transaction.target = _target[i];\\n transaction.value = _value[i];\\n for (uint256 j = 0; j < _dataSize[i]; j++) {\\n readData[j] = _data[readingPosition + j];\\n }\\n transaction.data = readData;\\n readingPosition += _dataSize[i];\\n currentTxHash = keccak256(abi.encodePacked(transaction.target, transaction.value, transaction.data));\\n listHash = keccak256(abi.encodePacked(currentTxHash, listHash));\\n }\\n if (alreadySubmitted[sessions.length - 1][listHash]) revert ListAlreadySubmitted();\\n alreadySubmitted[sessions.length - 1][listHash] = true;\\n submission.listHash = listHash;\\n submission.submissionTime = block.timestamp;\\n session.sumDeposit += submission.deposit;\\n session.submittedLists.push(submissions.length - 1);\\n if (session.submittedLists.length == 1) session.durationOffset = block.timestamp - lastApprovalTime;\\n\\n emit ListSubmitted(submissions.length - 1, msg.sender, sessions.length - 1, _description);\\n\\n uint256 remainder = msg.value - submission.deposit;\\n if (remainder > 0) payable(msg.sender).safeSend(remainder, wNative);\\n\\n reservedETH += submission.deposit;\\n }\\n\\n /// @notice Withdraws submitted transaction list. Reimburses submission deposit.\\n /// @dev Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made.\\n /// @param _submissionID Submission's index in the array of submitted lists of the current session.\\n /// @param _listHash Hash of a withdrawing list.\\n function withdrawTransactionList(uint256 _submissionID, bytes32 _listHash) external {\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions[session.submittedLists[_submissionID]];\\n if (block.timestamp - lastApprovalTime > submissionTimeout / 2) revert ShouldOnlyWithdrawInFirstHalf();\\n // This is an extra check to prevent _submissionID linking to the wrong list because of index swap during withdrawal.\\n if (submission.listHash != _listHash) revert WrongListHash();\\n if (submission.submitter != msg.sender) revert OnlySubmitterCanWithdraw();\\n if (block.timestamp - submission.submissionTime > withdrawTimeout) revert WithdrawingTimeHasPassed();\\n session.submittedLists[_submissionID] = session.submittedLists[session.submittedLists.length - 1];\\n alreadySubmitted[sessions.length - 1][_listHash] = false;\\n session.submittedLists.pop();\\n session.sumDeposit -= submission.deposit;\\n reservedETH -= submission.deposit;\\n payable(msg.sender).transfer(submission.deposit);\\n }\\n\\n /// @notice Approves a transaction list or creates a dispute if more than one list was submitted.\\n /// @dev If nothing was submitted changes session.\\n function executeSubmissions() external duringApprovalPeriod {\\n Session storage session = sessions[sessions.length - 1];\\n if (session.status != Status.NoDispute) revert AlreadyDisputed();\\n if (session.submittedLists.length == 0) {\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n } else if (session.submittedLists.length == 1) {\\n Submission storage submission = submissions[session.submittedLists[0]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n uint256 sumDeposit = session.sumDeposit;\\n session.sumDeposit = 0;\\n submission.submitter.safeSend(sumDeposit, wNative);\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n\\n reservedETH -= sumDeposit;\\n } else {\\n session.status = Status.DisputeCreated;\\n uint256 arbitrationCost = arbitrator.arbitrationCost(arbitratorExtraData);\\n session.disputeID = arbitrator.createDispute{value: arbitrationCost}(\\n session.submittedLists.length,\\n arbitratorExtraData\\n );\\n arbitratorDisputeIDToSessionIndex[session.disputeID] = sessions.length - 1;\\n // Check in case arbitration cost increased after the submission. It's unlikely that its increase won't be covered by the base deposit, but technically possible.\\n session.sumDeposit = session.sumDeposit > arbitrationCost ? session.sumDeposit - arbitrationCost : 0;\\n reservedETH = reservedETH > arbitrationCost ? reservedETH - arbitrationCost : 0;\\n emit DisputeRequest(arbitrator, session.disputeID, templateId);\\n }\\n }\\n\\n /// @notice Gives a ruling for a dispute.\\n /// @dev Must be called by the arbitrator.\\n /// @param _disputeID ID of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator. Note that 0 is reserved for \\\"Refuse to arbitrate\\\".\\n /// Note If the final ruling is \\\"0\\\" nothing is approved and deposits will stay locked in the contract.\\n function rule(uint256 _disputeID, uint256 _ruling) external override {\\n Session storage session = sessions[sessions.length - 1];\\n if (msg.sender != address(arbitrator)) revert OnlyArbitratorAllowed();\\n if (session.status != Status.DisputeCreated) revert NotDisputed();\\n if (_ruling > session.submittedLists.length) revert RulingOutOfBounds();\\n\\n if (_ruling != 0) {\\n Submission storage submission = submissions[session.submittedLists[_ruling - 1]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n submission.submitter.safeSend(session.sumDeposit, wNative);\\n }\\n // If the ruling is \\\"0\\\" the reserved funds of this session become expendable.\\n reservedETH -= session.sumDeposit;\\n\\n session.sumDeposit = 0;\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n session.ruling = _ruling;\\n sessions.push();\\n\\n emit Ruling(IArbitratorV2(msg.sender), _disputeID, _ruling);\\n }\\n\\n /// @notice Executes selected transactions of the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _cursor Index of the transaction from which to start executing.\\n /// @param _count Number of transactions to execute. Executes until the end if set to \\\"0\\\" or number higher than number of transactions in the list.\\n function executeTransactionList(uint256 _listID, uint256 _cursor, uint256 _count) external {\\n Submission storage submission = submissions[_listID];\\n if (!submission.approved) revert SubmissionNotApproved();\\n if (block.timestamp - submission.approvalTime > executionTimeout) revert TimeToExecuteHasPassed();\\n for (uint256 i = _cursor; i < submission.txs.length && (_count == 0 || i < _cursor + _count); i++) {\\n Transaction storage transaction = submission.txs[i];\\n uint256 expendableFunds = getExpendableFunds();\\n if (!transaction.executed && transaction.value <= expendableFunds) {\\n (bool callResult, ) = transaction.target.call{value: transaction.value}(transaction.data);\\n // An extra check to prevent re-entrancy through target call.\\n if (callResult == true) {\\n if (transaction.executed) revert AlreadyExecuted();\\n transaction.executed = true;\\n }\\n }\\n }\\n }\\n\\n /// @notice Receive function to receive funds for the execution of transactions.\\n receive() external payable {}\\n\\n /// @notice Gets the sum of contract funds that are used for the execution of transactions.\\n /// @return Contract balance without reserved ETH.\\n function getExpendableFunds() public view returns (uint256) {\\n return address(this).balance - reservedETH;\\n }\\n\\n /// @notice Gets the info of the specific transaction in the specific list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _transactionIndex The index of the transaction.\\n /// @return target The target of the transaction.\\n /// @return value The value of the transaction.\\n /// @return data The data of the transaction.\\n /// @return executed Whether the transaction was executed or not.\\n function getTransactionInfo(\\n uint256 _listID,\\n uint256 _transactionIndex\\n ) external view returns (address target, uint256 value, bytes memory data, bool executed) {\\n Submission storage submission = submissions[_listID];\\n Transaction storage transaction = submission.txs[_transactionIndex];\\n return (transaction.target, transaction.value, transaction.data, transaction.executed);\\n }\\n\\n /// @notice Gets the array of submitted lists in the session.\\n ///\\n /// @dev This function is O(n), where `n` is the number of submissions in the session.\\n /// This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts.\\n ///\\n /// @param _session The ID of the session.\\n /// @return submittedLists Indexes of lists that were submitted during the session.\\n function getSubmittedLists(uint256 _session) external view returns (uint256[] memory submittedLists) {\\n Session storage session = sessions[_session];\\n submittedLists = session.submittedLists;\\n }\\n\\n /// @notice Gets the submission from listId.\\n /// @param _listId The index of the transaction list in the array of lists.\\n /// @return submission List belonging to that listId.\\n function getSubmission(uint256 _listId) external view returns (Submission memory submission) {\\n submission = submissions[_listId];\\n }\\n\\n /// @notice Gets the number of transactions in the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @return txCount The number of transactions in the list.\\n function getNumberOfTransactions(uint256 _listID) external view returns (uint256 txCount) {\\n Submission storage submission = submissions[_listID];\\n return submission.txs.length;\\n }\\n\\n /// @notice Gets the number of lists created in contract's lifetime.\\n /// @return The number of created lists.\\n function getNumberOfCreatedLists() external view returns (uint256) {\\n return submissions.length;\\n }\\n\\n /// @notice Gets the number of the ongoing session.\\n /// @return The number of the ongoing session.\\n function getCurrentSessionNumber() external view returns (uint256) {\\n return sessions.length - 1;\\n }\\n\\n /// @notice Gets the session from the session index.\\n /// @return _session The session info.\\n function getSession(uint256 _sessionIndex) external view returns (Session memory _session) {\\n _session = sessions[_sessionIndex];\\n }\\n\\n /// @notice Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost).\\n /// @return _requiredDeposit required deposit value\\n function getTotalSubmissionDeposit() external view returns (uint256 _requiredDeposit) {\\n _requiredDeposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n }\\n\\n // ************************************* //\\n // * Errors * //\\n // ************************************* //\\n\\n error SubmissionTimeHasEnded();\\n error ApprovalTimeNotStarted();\\n error OwnerOnly();\\n error WrongInputTargetAndValue();\\n error WrongInputTargetAndDatasize();\\n error InsufficientDeposit();\\n error ListAlreadySubmitted();\\n error ShouldOnlyWithdrawInFirstHalf();\\n error WrongListHash();\\n error OnlySubmitterCanWithdraw();\\n error WithdrawingTimeHasPassed();\\n error AlreadyDisputed();\\n error OnlyArbitratorAllowed();\\n error NotDisputed();\\n error RulingOutOfBounds();\\n error SubmissionNotApproved();\\n error TimeToExecuteHasPassed();\\n error AlreadyExecuted();\\n}\\n\",\"keccak256\":\"0xc1ec951c9ae18c7e9f78cb45fe458cd3bb09217715e5a778f9aa0823979eb2fe\",\"license\":\"MIT\"},\"src/interfaces/IArbSys.sol\":{\"content\":\"// https://github.com/OffchainLabs/nitro-contracts/blob/bdb8f8c68b2229fe9309fe9c03b37017abd1a2cd/src/precompiles/ArbSys.sol\\n// Copyright 2021-2022, Offchain Labs, Inc.\\n// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE\\n// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity >=0.4.21 <0.9.0;\\n\\n/**\\n * @title System level functionality\\n * @notice For use by contracts to interact with core L2-specific functionality.\\n * Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064.\\n */\\ninterface ArbSys {\\n /**\\n * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)\\n * @return block number as int\\n */\\n function arbBlockNumber() external view returns (uint256);\\n\\n /**\\n * @notice Get Arbitrum block hash (reverts unless currentBlockNum-256 <= arbBlockNum < currentBlockNum)\\n * @return block hash\\n */\\n function arbBlockHash(uint256 arbBlockNum) external view returns (bytes32);\\n\\n /**\\n * @notice Gets the rollup's unique chain identifier\\n * @return Chain identifier as int\\n */\\n function arbChainID() external view returns (uint256);\\n\\n /**\\n * @notice Get internal version number identifying an ArbOS build, this is `55 + nitroArbOS version number`\\n * e.g. on ArbOS 31 this would return 86. This is the only function that have the 55 offset.\\n * @return version number as int\\n */\\n function arbOSVersion() external view returns (uint256);\\n\\n /**\\n * @notice Returns 0 since Nitro has no concept of storage gas\\n * @return uint 0\\n */\\n function getStorageGasAvailable() external view returns (uint256);\\n\\n /**\\n * @notice (deprecated) check if current call is top level (meaning it was triggered by an EoA or a L1 contract)\\n * @dev this call has been deprecated and may be removed in a future release\\n * @return true if current execution frame is not a call by another L2 contract\\n */\\n function isTopLevelCall() external view returns (bool);\\n\\n /**\\n * @notice map L1 sender contract address to its L2 alias\\n * @param sender sender address\\n * @param unused argument no longer used\\n * @return aliased sender address\\n */\\n function mapL1SenderContractAddressToL2Alias(address sender, address unused) external pure returns (address);\\n\\n /**\\n * @notice check if the caller (of this caller of this) is an aliased L1 contract address\\n * @return true iff the caller's address is an alias for an L1 contract address\\n */\\n function wasMyCallersAddressAliased() external view returns (bool);\\n\\n /**\\n * @notice return the address of the caller (of this caller of this), without applying L1 contract address aliasing\\n * @return address of the caller's caller, without applying L1 contract address aliasing\\n */\\n function myCallersAddressWithoutAliasing() external view returns (address);\\n\\n /**\\n * @notice Send given amount of Eth to dest from sender.\\n * This is a convenience function, which is equivalent to calling sendTxToL1 with empty data.\\n * @param destination recipient address on L1\\n * @return unique identifier for this L2-to-L1 transaction.\\n */\\n function withdrawEth(address destination) external payable returns (uint256);\\n\\n /**\\n * @notice Send a transaction to L1\\n * @dev it is not possible to execute on the L1 any L2-to-L1 transaction which contains data\\n * to a contract address without any code (as enforced by the Bridge contract).\\n * @param destination recipient address on L1\\n * @param data (optional) calldata for L1 contract call\\n * @return a unique identifier for this L2-to-L1 transaction.\\n */\\n function sendTxToL1(address destination, bytes calldata data) external payable returns (uint256);\\n\\n /**\\n * @notice Get send Merkle tree state\\n * @return size number of sends in the history\\n * @return root root hash of the send history\\n * @return partials hashes of partial subtrees in the send history tree\\n */\\n function sendMerkleTreeState() external view returns (uint256 size, bytes32 root, bytes32[] memory partials);\\n\\n /**\\n * @notice creates a send txn from L2 to L1\\n * @param position = (level << 192) + leaf = (0 << 192) + leaf = leaf\\n */\\n event L2ToL1Tx(\\n address caller,\\n address indexed destination,\\n uint256 indexed hash,\\n uint256 indexed position,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /// @dev DEPRECATED in favour of the new L2ToL1Tx event above after the nitro upgrade\\n event L2ToL1Transaction(\\n address caller,\\n address indexed destination,\\n uint256 indexed uniqueId,\\n uint256 indexed batchNumber,\\n uint256 indexInBatch,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /**\\n * @notice logs a merkle branch for proof synthesis\\n * @param reserved an index meant only to align the 4th index with L2ToL1Transaction's 4th event\\n * @param hash the merkle hash\\n * @param position = (level << 192) + leaf\\n */\\n event SendMerkleUpdate(uint256 indexed reserved, bytes32 indexed hash, uint256 indexed position);\\n\\n error InvalidBlockNumber(uint256 requested, uint256 current);\\n}\\n\",\"keccak256\":\"0x9f2e1c9d8d19db1d3c6baa0549d14a68d09526764f4bd6f3bf030f0af7fd12fe\",\"license\":\"BUSL-1.1\"},\"src/libraries/SafeSend.sol\":{\"content\":\"/**\\n * @authors: [@andreimvp]\\n * @reviewers: [@divyangchauhan, @wadader, @fcanela, @unknownunknown1]\\n * @auditors: []\\n * @bounties: []\\n * SPDX-License-Identifier: MIT\\n */\\n\\npragma solidity ^0.8.24;\\n\\ninterface WethLike {\\n function deposit() external payable;\\n\\n function transfer(address dst, uint256 wad) external;\\n}\\n\\nlibrary SafeSend {\\n function safeSend(address payable _to, uint256 _value, address _wethLike) internal {\\n if (_to.send(_value)) return;\\n\\n WethLike(_wethLike).deposit{value: _value}();\\n WethLike(_wethLike).transfer(_to, _value); /// forge-lint: disable-line(erc20-unchecked-transfer)\\n }\\n}\\n\",\"keccak256\":\"0xd4d5b25d0eb7f7965ea7a9e3d3d6bc13368de9aaf882543a75dc9c57c85e9283\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506133d6806100206000396000f3fe60806040523480156200001157600080fd5b50600436106200003a5760003560e01c8063a17ad8a7146200003f578063a2f7b3a51462000058575b600080fd5b62000056620000503660046200025c565b6200008b565b005b6200006f620000693660046200034f565b6200015b565b6040516001600160a01b03909116815260200160405180910390f35b60008a8a8a8a8a8a8a8a8a8a604051620000a59062000186565b620000ba9a99989796959493929190620003b1565b604051809103906000f080158015620000d7573d6000803e3d6000fd5b50600080546001810182558180527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b038416908117909155604051929350917f5425363a03f182281120f5919107c49c7a1a623acc1cbc6df468b6f0c11fcf8c9190a25050505050505050505050565b600081815481106200016c57600080fd5b6000918252602090912001546001600160a01b0316905081565b612f5e806200044383390190565b80356001600160a01b0381168114620001ac57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001d957600080fd5b813567ffffffffffffffff80821115620001f757620001f7620001b1565b604051601f8301601f19908116603f01168101908282118183101715620002225762000222620001b1565b816040528381528660208588010111156200023c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806000806000806000806101408b8d0312156200027d57600080fd5b620002888b62000194565b995060208b013567ffffffffffffffff80821115620002a657600080fd5b620002b48e838f01620001c7565b9a50620002c460408e0162000194565b995060608d0135915080821115620002db57600080fd5b620002e98e838f01620001c7565b985060808d01359150808211156200030057600080fd5b506200030f8d828e01620001c7565b96505060a08b0135945060c08b0135935060e08b013592506101008b013591506200033e6101208c0162000194565b90509295989b9194979a5092959850565b6000602082840312156200036257600080fd5b5035919050565b6000815180845260005b81811015620003915760208185018101518683018201520162000373565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038b8116825261014060208301819052600091620003d98483018e62000369565b9150808c1660408501528382036060850152620003f7828c62000369565b915083820360808501526200040d828b62000369565b92508860a08501528760c08501528660e08501528561010085015280851661012085015250509b9a505050505050505050505056fe60806040523480156200001157600080fd5b5060405162002f5e38038062002f5e833981016040819052620000349162000225565b600080546001600160a01b0319166001600160a01b038c1617905560016200005d8a82620003a9565b50600280546001600160a01b038084166001600160a01b031992831617909255426009556005879055600686905560078590556008849055600c80546001908101909155600b8054909101815560005260038054928b1692909116821790556040516312a6505d60e21b8152634a99417490620000e1908a908a90600401620004a3565b6020604051808303816000875af115801562000101573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001279190620004e3565b60045550620004fd98505050505050505050565b80516001600160a01b03811681146200015357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200018b57818101518382015260200162000171565b50506000910152565b600082601f830112620001a657600080fd5b81516001600160401b0380821115620001c357620001c362000158565b604051601f8301601f19908116603f01168101908282118183101715620001ee57620001ee62000158565b816040528381528660208588010111156200020857600080fd5b6200021b8460208301602089016200016e565b9695505050505050565b6000806000806000806000806000806101408b8d0312156200024657600080fd5b620002518b6200013b565b60208c0151909a506001600160401b03808211156200026f57600080fd5b6200027d8e838f0162000194565b9a506200028d60408e016200013b565b995060608d0151915080821115620002a457600080fd5b620002b28e838f0162000194565b985060808d0151915080821115620002c957600080fd5b50620002d88d828e0162000194565b96505060a08b0151945060c08b0151935060e08b015192506101008b01519150620003076101208c016200013b565b90509295989b9194979a5092959850565b600181811c908216806200032d57607f821691505b6020821081036200034e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a4576000816000526020600020601f850160051c810160208610156200037f5750805b601f850160051c820191505b81811015620003a0578281556001016200038b565b5050505b505050565b81516001600160401b03811115620003c557620003c562000158565b620003dd81620003d6845462000318565b8462000354565b602080601f831160018114620004155760008415620003fc5750858301515b600019600386901b1c1916600185901b178555620003a0565b600085815260208120601f198616915b82811015620004465788860151825594840194600190910190840162000425565b5085821015620004655787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526200048f8160208601602086016200016e565b601f01601f19169290920160200192915050565b6060815260006060820152608060208201526000620004c6608083018562000475565b8281036040840152620004da818562000475565b95945050505050565b600060208284031215620004f657600080fd5b5051919050565b612a51806200050d6000396000f3fe6080604052600436106101bd5760003560e01c806383c4b7a3116100ed578063b6cd08c611610090578063b6cd08c614610551578063b6dc775414610571578063ba7079ca14610586578063bb0b86ff146105a6578063c4bd8519146105bc578063c5d55288146105d2578063cc2bcdb4146105f2578063dc17bbdb14610612578063f730c07f1461063257600080fd5b806383c4b7a31461040f5780639244c70414610440578063953d6651146104555780639c15d1a214610475578063a0af81f01461048b578063a3c595c9146104ab578063ad73349e146104db578063b51257001461053c57600080fd5b8063397c330f11610160578063397c330f146102f45780633e8686cc14610321578063402ff0db1461034e578063460478381461037b5780636c0b7e711461038e5780636cc6cde1146103a35780636cf39c2b146103c357806377b9fda8146103e35780637aa77f29146103f957600080fd5b80630c7ac7b6146101c95780631b1f5e7b146101f457806321cea5381461021757806322b52d6614610244578063246c76df1461025a57806324baacc71461027c5780632d68efc91461029c578063311a6c56146102d457600080fd5b366101c457005b600080fd5b3480156101d557600080fd5b506101de610648565b6040516101eb919061203a565b60405180910390f35b34801561020057600080fd5b506102096106d6565b6040519081526020016101eb565b34801561022357600080fd5b50610237610232366004612054565b61075b565b6040516101eb919061206d565b34801561025057600080fd5b5061020960075481565b34801561026657600080fd5b5061027a610275366004612054565b6107dd565b005b34801561028857600080fd5b5061027a610297366004612054565b610802565b3480156102a857600080fd5b506002546102bc906001600160a01b031681565b6040516001600160a01b0390911681526020016101eb565b3480156102e057600080fd5b5061027a6102ef3660046120b1565b610827565b34801561030057600080fd5b5061020961030f366004612054565b600e6020526000908152604090205481565b34801561032d57600080fd5b5061034161033c366004612054565b6109f9565b6040516101eb91906120d3565b34801561035a57600080fd5b5061036e610369366004612054565b610bf4565b6040516101eb919061220e565b61027a610389366004612468565b610ce2565b34801561039a57600080fd5b506102096112ea565b3480156103af57600080fd5b506000546102bc906001600160a01b031681565b3480156103cf57600080fd5b5061027a6103de366004612539565b6112fc565b3480156103ef57600080fd5b50610209600a5481565b34801561040557600080fd5b5061020960045481565b34801561041b57600080fd5b5061042f61042a366004612054565b6114c0565b6040516101eb959493929190612565565b34801561044c57600080fd5b5061027a611507565b34801561046157600080fd5b5061027a610470366004612054565b61189f565b34801561048157600080fd5b5061020960085481565b34801561049757600080fd5b506003546102bc906001600160a01b031681565b3480156104b757600080fd5b506104cb6104c63660046120b1565b611937565b6040516101eb9493929190612597565b3480156104e757600080fd5b506104fb6104f6366004612054565b611a51565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101eb565b34801561054857600080fd5b50610209611aad565b34801561055d57600080fd5b5061027a61056c3660046120b1565b611abd565b34801561057d57600080fd5b50600b54610209565b34801561059257600080fd5b5061027a6105a13660046125d1565b611d11565b3480156105b257600080fd5b5061020960055481565b3480156105c857600080fd5b5061020960065481565b3480156105de57600080fd5b5061027a6105ed366004612620565b611dd0565b3480156105fe57600080fd5b5061027a61060d366004612054565b611e6c565b34801561061e57600080fd5b5061020961062d366004612054565b611e91565b34801561063e57600080fd5b5061020960095481565b6001805461065590612679565b80601f016020809104026020016040519081016040528092919081815260200182805461068190612679565b80156106ce5780601f106106a3576101008083540402835291602001916106ce565b820191906000526020600020905b8154815290600101906020018083116106b157829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea99061070890600190600401612730565b602060405180830381865afa158015610725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107499190612743565b6005546107569190612772565b905090565b60606000600c83815481106107725761077261278b565b90600052602060002090600602019050806002018054806020026020016040519081016040528092919081815260200182805480156107d057602002820191906000526020600020905b8154815260200190600101908083116107bc575b5050505050915050919050565b3033146107fd57604051630b2db9b760e31b815260040160405180910390fd5b600855565b30331461082257604051630b2db9b760e31b815260040160405180910390fd5b600555565b600c80546000919061083b906001906127a1565b8154811061084b5761084b61278b565b600091825260208220915460069190910290910191506001600160a01b031633146108895760405163381a2cb560e11b815260040160405180910390fd5b6001600482015460ff1660028111156108a4576108a46121d6565b146108c2576040516310cec38560e21b815260040160405180910390fd5b60028101548211156108e757604051631f6edbfd60e01b815260040160405180910390fd5b8115610977576000600b600283016109006001866127a1565b815481106109105761091061278b565b90600052602060002001548154811061092b5761092b61278b565b600091825260209091206005600890920201908101805460ff1916600117905542600682015560038301546002548254929350610975926001600160a01b03908116929116611ec2565b505b8060030154600a600082825461098d91906127a1565b90915550506000600382018190554260095560048201805460ff19166002179055828255600c805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a4f60405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600b8281548110610a6257610a6261278b565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610bae576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610b0b90612679565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3790612679565b8015610b845780601f10610b5957610100808354040283529160200191610b84565b820191906000526020600020905b815481529060010190602001808311610b6757829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610ab8565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610bfc611fad565b600c8281548110610c0f57610c0f61278b565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610c8b57602002820191906000526020600020905b815481526020019060010190808311610c77575b505050918352505060038201546020820152600482015460409091019060ff166002811115610cbc57610cbc6121d6565b6002811115610ccd57610ccd6121d6565b81526020016005820154815250509050919050565b600c805460009190610cf6906001906127a1565b81548110610d0657610d0661278b565b906000526020600020906006020160050154905080600654610d289190612772565b600954610d3590426127a1565b1115610d545760405163d5ac976d60e01b815260040160405180910390fd5b8451865114610d7657604051638f32290560e01b815260040160405180910390fd5b8251865114610d9857604051633222108360e01b815260040160405180910390fd5b600c805460009190610dac906001906127a1565b81548110610dbc57610dbc61278b565b60009182526020808320600b8054600181018255945260089093027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610e4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e739190612743565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610ea990600190600401612730565b602060405180830381865afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea9190612743565b600554610ef79190612772565b60018201819055341015610f1e5760405163070f6eed60e11b815260040160405180910390fd5b60008080805b8b5181101561112a576000898281518110610f4157610f4161278b565b60200260200101516001600160401b03811115610f6057610f606122a1565b6040519080825280601f01601f191660200182016040528015610f8a576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110610fbf57610fbf61278b565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d9084908110610ff857610ff861278b565b6020026020010151816001018190555060005b8b848151811061101d5761101d61278b565b6020026020010151811015611083578c6110378287612772565b815181106110475761104761278b565b602001015160f81c60f81b8382815181106110645761106461278b565b60200101906001600160f81b031916908160001a90535060010161100b565b50600281016110928382612805565b508a83815181106110a5576110a561278b565b6020026020010151846110b89190612772565b815460018301546040519296506110e2926001600160a01b03909216916002850190602001612937565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610f24565b50600c54600d90600090611140906001906127a1565b81526020808201929092526040908101600090812086825290925290205460ff161561117f5760405163607cb3e760e01b815260040160405180910390fd5b6001600d60006001600c8054905061119791906127a1565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916111eb908490612772565b9091555050600b546002860190611204906001906127a1565b815460018181018455600093845260209093200155600286015490036112375760095461123190426127a1565b60058601555b600c54611246906001906127a1565b600b543390611257906001906127a1565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a604051611286919061203a565b60405180910390a460008460010154346112a091906127a1565b905080156112c1576002546112c190339083906001600160a01b0316611ec2565b8460010154600a60008282546112d79190612772565b9091555050505050505050505050505050565b600c54600090610756906001906127a1565b6000600b84815481106113115761131161278b565b60009182526020909120600890910201600581015490915060ff166113485760405162325f4560e91b815260040160405180910390fd5b600754600682015461135a90426127a1565b111561137957604051638b349aa560e01b815260040160405180910390fd5b825b60028201548110801561139e575082158061139e575061139b8385612772565b81105b156114b95760008260020182815481106113ba576113ba61278b565b9060005260206000209060040201905060006113d4611aad565b600383015490915060ff161580156113f0575080826001015411155b156114a457815460018301546040516000926001600160a01b0316919061141b90600287019061296a565b60006040518083038185875af1925050503d8060008114611458576040519150601f19603f3d011682016040523d82523d6000602084013e61145d565b606091505b50909150508015156001036114a257600383015460ff161561149257604051630dc1019760e01b815260040160405180910390fd5b60038301805460ff191660011790555b505b505080806114b190612976565b91505061137b565b5050505050565b600c81815481106114d057600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600c80546000919061151b906001906127a1565b8154811061152b5761152b61278b565b90600052602060002090600602016005015490508060065461154d9190612772565b60095461155a90426127a1565b1161157857604051631875ed4760e21b815260040160405180910390fd5b600c80546000919061158c906001906127a1565b8154811061159c5761159c61278b565b6000918252602082206006909102019150600482015460ff1660028111156115c6576115c66121d6565b146115e4576040516304ee891b60e11b815260040160405180910390fd5b60028101546000036116115742600955600401805460ff1916600217905550600c80546001018155600052565b60028101546001036116e0576000600b826002016000815481106116375761163761278b565b9060005260206000200154815481106116525761165261278b565b6000918252602082206005600890920201908101805460ff1916600117905542600682015560038401805492905560025481549193506116a0916001600160a01b0390811691849116611ec2565b4260095560048301805460ff19166002179055600c805460010181556000908152600a80548392906116d39084906127a1565b9091555061189b92505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926117229201612730565b602060405180830381865afa15801561173f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117639190612743565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e191849161179f919060019060040161298f565b60206040518083038185885af11580156117bd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117e29190612743565b600180840191909155600c546117f891906127a1565b60018301546000908152600e60205260409020556003820154811061181e57600061182e565b80826003015461182e91906127a1565b6003830155600a548110611843576000611851565b80600a5461185191906127a1565b600a5560018201546000546004546040519081526001600160a01b03909116907fee1017dcbefba87397fcdaab31f187328533572b6a5568177fa2eb64026003b6906020016109ec565b5050565b3033146118bf57604051630b2db9b760e31b815260040160405180910390fd5b600c8054600091906118d3906001906127a1565b815481106118e3576118e361278b565b9060005260206000209060060201600501549050806006546119059190612772565b60095461191290426127a1565b11156119315760405163d5ac976d60e01b815260040160405180910390fd5b50600655565b6000806060600080600b87815481106119525761195261278b565b9060005260206000209060080201905060008160020187815481106119795761197961278b565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff9091169082906119be90612679565b80601f01602080910402602001604051908101604052809291908181526020018280546119ea90612679565b8015611a375780601f10611a0c57610100808354040283529160200191611a37565b820191906000526020600020905b815481529060010190602001808311611a1a57829003601f168201915b505050505091509550955095509550505092959194509250565b600b8181548110611a6157600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600a544761075691906127a1565b600c805460009190611ad1906001906127a1565b81548110611ae157611ae161278b565b906000526020600020906006020190506000600b826002018581548110611b0a57611b0a61278b565b906000526020600020015481548110611b2557611b2561278b565b906000526020600020906008020190506002600654611b4491906129b0565b600954611b5190426127a1565b1115611b705760405163383f4af360e21b815260040160405180910390fd5b82816003015414611b94576040516306e671b760e31b815260040160405180910390fd5b80546001600160a01b03163314611bbe5760405163415360c560e11b815260040160405180910390fd5b6008546004820154611bd090426127a1565b1115611bef5760405163603c988d60e11b815260040160405180910390fd5b600282018054611c01906001906127a1565b81548110611c1157611c1161278b565b9060005260206000200154826002018581548110611c3157611c3161278b565b6000918252602082200191909155600c54600d908290611c53906001906127a1565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611c9257611c926129d2565b600190038181906000526020600020016000905590558060010154826003016000828254611cc091906127a1565b90915550506001810154600a8054600090611cdc9084906127a1565b90915550506001810154604051339180156108fc02916000818181858888f193505050501580156114b9573d6000803e3d6000fd5b303314611d3157604051630b2db9b760e31b815260040160405180910390fd5b600c805460009190611d45906001906127a1565b81548110611d5557611d5561278b565b906000526020600020906006020160050154905080600654611d779190612772565b600954611d8490426127a1565b1115611da35760405163d5ac976d60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0385161790556001611dca8382612805565b50505050565b303314611df057604051630b2db9b760e31b815260040160405180910390fd5b6003546040516312a6505d60e21b81526001600160a01b0390911690634a99417490611e2290859085906004016129e8565b6020604051808303816000875af1158015611e41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e659190612743565b6004555050565b303314611e8c57604051630b2db9b760e31b815260040160405180910390fd5b600755565b600080600b8381548110611ea757611ea761278b565b60009182526020909120600260089092020101549392505050565b6040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015611ef157505050565b806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f2c57600080fd5b505af1158015611f40573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018790528516935063a9059cbb92506044019050600060405180830381600087803b158015611f9057600080fd5b505af1158015611fa4573d6000803e3d6000fd5b50505050505050565b6040518060c001604052806000815260200160008152602001606081526020016000815260200160006002811115611fe757611fe76121d6565b8152602001600081525090565b6000815180845260005b8181101561201a57602081850181015186830182015201611ffe565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061204d6020830184611ff4565b9392505050565b60006020828403121561206657600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156120a557835183529284019291840191600101612089565b50909695505050505050565b600080604083850312156120c457600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156121875761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d0152612167828d0182611ff4565b9287015115159b87019b909b52509850958901959189019160010161212e565b5050505060608901516080890152608089015160a089015260a089015195506121b460c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b6003811061220a57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b8083101561226b578351825292840192600192909201919084019061224b565b50606087015160808701526080870151935061228a60a08701856121ec565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156122df576122df6122a1565b604052919050565b60006001600160401b03821115612300576123006122a1565b5060051b60200190565b6001600160a01b038116811461231f57600080fd5b50565b600082601f83011261233357600080fd5b81356020612348612343836122e7565b6122b7565b8083825260208201915060208460051b87010193508684111561236a57600080fd5b602086015b8481101561238f5780356123828161230a565b835291830191830161236f565b509695505050505050565b600082601f8301126123ab57600080fd5b813560206123bb612343836122e7565b8083825260208201915060208460051b8701019350868411156123dd57600080fd5b602086015b8481101561238f57803583529183019183016123e2565b600082601f83011261240a57600080fd5b81356001600160401b03811115612423576124236122a1565b612436601f8201601f19166020016122b7565b81815284602083860101111561244b57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561248057600080fd5b85356001600160401b038082111561249757600080fd5b6124a389838a01612322565b965060208801359150808211156124b957600080fd5b6124c589838a0161239a565b955060408801359150808211156124db57600080fd5b6124e789838a016123f9565b945060608801359150808211156124fd57600080fd5b61250989838a0161239a565b9350608088013591508082111561251f57600080fd5b5061252c888289016123f9565b9150509295509295909350565b60008060006060848603121561254e57600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a0810161258760608301856121ec565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006125be6080830185611ff4565b9050821515606083015295945050505050565b600080604083850312156125e457600080fd5b82356125ef8161230a565b915060208301356001600160401b0381111561260a57600080fd5b612616858286016123f9565b9150509250929050565b6000806040838503121561263357600080fd5b82356001600160401b038082111561264a57600080fd5b612656868387016123f9565b9350602085013591508082111561266c57600080fd5b50612616858286016123f9565b600181811c9082168061268d57607f821691505b6020821081036126ad57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546126c081612679565b8085526020600183811680156126dd57600181146126f757612725565b60ff1985168884015283151560051b880183019550612725565b866000528260002060005b8581101561271d5781548a8201860152908301908401612702565b890184019650505b505050505092915050565b60208152600061204d60208301846126b3565b60006020828403121561275557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156127855761278561275c565b92915050565b634e487b7160e01b600052603260045260246000fd5b818103818111156127855761278561275c565b601f821115612800576000816000526020600020601f850160051c810160208610156127dd5750805b601f850160051c820191505b818110156127fc578281556001016127e9565b5050505b505050565b81516001600160401b0381111561281e5761281e6122a1565b6128328161282c8454612679565b846127b4565b602080601f831160018114612867576000841561284f5750858301515b600019600386901b1c1916600185901b1785556127fc565b600085815260208120601f198616915b8281101561289657888601518255948401946001909101908401612877565b50858210156128b45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081546128d181612679565b600182811680156128e957600181146128fe5761292d565b60ff198416875282151583028701945061292d565b8560005260208060002060005b858110156129245781548a82015290840190820161290b565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b168152826014820152600061296160348301846128c4565b95945050505050565b600061204d82846128c4565b6000600182016129885761298861275c565b5060010190565b8281526040602082015260006129a860408301846126b3565b949350505050565b6000826129cd57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b6060815260006060820152608060208201526000612a096080830185611ff4565b82810360408401526129618185611ff456fea2646970667358221220f2b8282f42be09212ddb68862ebc46615235bf74de96255090619d9bb6ee9fbd64736f6c63430008180033a2646970667358221220d9ef780b440c1764328934ff7e4d469c5032bf5c7d9090eb358fed860d7aca4f64736f6c63430008180033", + "deployedBytecode": "0x60806040523480156200001157600080fd5b50600436106200003a5760003560e01c8063a17ad8a7146200003f578063a2f7b3a51462000058575b600080fd5b62000056620000503660046200025c565b6200008b565b005b6200006f620000693660046200034f565b6200015b565b6040516001600160a01b03909116815260200160405180910390f35b60008a8a8a8a8a8a8a8a8a8a604051620000a59062000186565b620000ba9a99989796959493929190620003b1565b604051809103906000f080158015620000d7573d6000803e3d6000fd5b50600080546001810182558180527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5630180546001600160a01b0319166001600160a01b038416908117909155604051929350917f5425363a03f182281120f5919107c49c7a1a623acc1cbc6df468b6f0c11fcf8c9190a25050505050505050505050565b600081815481106200016c57600080fd5b6000918252602090912001546001600160a01b0316905081565b612f5e806200044383390190565b80356001600160a01b0381168114620001ac57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001d957600080fd5b813567ffffffffffffffff80821115620001f757620001f7620001b1565b604051601f8301601f19908116603f01168101908282118183101715620002225762000222620001b1565b816040528381528660208588010111156200023c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806000806000806000806101408b8d0312156200027d57600080fd5b620002888b62000194565b995060208b013567ffffffffffffffff80821115620002a657600080fd5b620002b48e838f01620001c7565b9a50620002c460408e0162000194565b995060608d0135915080821115620002db57600080fd5b620002e98e838f01620001c7565b985060808d01359150808211156200030057600080fd5b506200030f8d828e01620001c7565b96505060a08b0135945060c08b0135935060e08b013592506101008b013591506200033e6101208c0162000194565b90509295989b9194979a5092959850565b6000602082840312156200036257600080fd5b5035919050565b6000815180845260005b81811015620003915760208185018101518683018201520162000373565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b038b8116825261014060208301819052600091620003d98483018e62000369565b9150808c1660408501528382036060850152620003f7828c62000369565b915083820360808501526200040d828b62000369565b92508860a08501528760c08501528660e08501528561010085015280851661012085015250509b9a505050505050505050505056fe60806040523480156200001157600080fd5b5060405162002f5e38038062002f5e833981016040819052620000349162000225565b600080546001600160a01b0319166001600160a01b038c1617905560016200005d8a82620003a9565b50600280546001600160a01b038084166001600160a01b031992831617909255426009556005879055600686905560078590556008849055600c80546001908101909155600b8054909101815560005260038054928b1692909116821790556040516312a6505d60e21b8152634a99417490620000e1908a908a90600401620004a3565b6020604051808303816000875af115801562000101573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001279190620004e3565b60045550620004fd98505050505050505050565b80516001600160a01b03811681146200015357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200018b57818101518382015260200162000171565b50506000910152565b600082601f830112620001a657600080fd5b81516001600160401b0380821115620001c357620001c362000158565b604051601f8301601f19908116603f01168101908282118183101715620001ee57620001ee62000158565b816040528381528660208588010111156200020857600080fd5b6200021b8460208301602089016200016e565b9695505050505050565b6000806000806000806000806000806101408b8d0312156200024657600080fd5b620002518b6200013b565b60208c0151909a506001600160401b03808211156200026f57600080fd5b6200027d8e838f0162000194565b9a506200028d60408e016200013b565b995060608d0151915080821115620002a457600080fd5b620002b28e838f0162000194565b985060808d0151915080821115620002c957600080fd5b50620002d88d828e0162000194565b96505060a08b0151945060c08b0151935060e08b015192506101008b01519150620003076101208c016200013b565b90509295989b9194979a5092959850565b600181811c908216806200032d57607f821691505b6020821081036200034e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a4576000816000526020600020601f850160051c810160208610156200037f5750805b601f850160051c820191505b81811015620003a0578281556001016200038b565b5050505b505050565b81516001600160401b03811115620003c557620003c562000158565b620003dd81620003d6845462000318565b8462000354565b602080601f831160018114620004155760008415620003fc5750858301515b600019600386901b1c1916600185901b178555620003a0565b600085815260208120601f198616915b82811015620004465788860151825594840194600190910190840162000425565b5085821015620004655787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526200048f8160208601602086016200016e565b601f01601f19169290920160200192915050565b6060815260006060820152608060208201526000620004c6608083018562000475565b8281036040840152620004da818562000475565b95945050505050565b600060208284031215620004f657600080fd5b5051919050565b612a51806200050d6000396000f3fe6080604052600436106101bd5760003560e01c806383c4b7a3116100ed578063b6cd08c611610090578063b6cd08c614610551578063b6dc775414610571578063ba7079ca14610586578063bb0b86ff146105a6578063c4bd8519146105bc578063c5d55288146105d2578063cc2bcdb4146105f2578063dc17bbdb14610612578063f730c07f1461063257600080fd5b806383c4b7a31461040f5780639244c70414610440578063953d6651146104555780639c15d1a214610475578063a0af81f01461048b578063a3c595c9146104ab578063ad73349e146104db578063b51257001461053c57600080fd5b8063397c330f11610160578063397c330f146102f45780633e8686cc14610321578063402ff0db1461034e578063460478381461037b5780636c0b7e711461038e5780636cc6cde1146103a35780636cf39c2b146103c357806377b9fda8146103e35780637aa77f29146103f957600080fd5b80630c7ac7b6146101c95780631b1f5e7b146101f457806321cea5381461021757806322b52d6614610244578063246c76df1461025a57806324baacc71461027c5780632d68efc91461029c578063311a6c56146102d457600080fd5b366101c457005b600080fd5b3480156101d557600080fd5b506101de610648565b6040516101eb919061203a565b60405180910390f35b34801561020057600080fd5b506102096106d6565b6040519081526020016101eb565b34801561022357600080fd5b50610237610232366004612054565b61075b565b6040516101eb919061206d565b34801561025057600080fd5b5061020960075481565b34801561026657600080fd5b5061027a610275366004612054565b6107dd565b005b34801561028857600080fd5b5061027a610297366004612054565b610802565b3480156102a857600080fd5b506002546102bc906001600160a01b031681565b6040516001600160a01b0390911681526020016101eb565b3480156102e057600080fd5b5061027a6102ef3660046120b1565b610827565b34801561030057600080fd5b5061020961030f366004612054565b600e6020526000908152604090205481565b34801561032d57600080fd5b5061034161033c366004612054565b6109f9565b6040516101eb91906120d3565b34801561035a57600080fd5b5061036e610369366004612054565b610bf4565b6040516101eb919061220e565b61027a610389366004612468565b610ce2565b34801561039a57600080fd5b506102096112ea565b3480156103af57600080fd5b506000546102bc906001600160a01b031681565b3480156103cf57600080fd5b5061027a6103de366004612539565b6112fc565b3480156103ef57600080fd5b50610209600a5481565b34801561040557600080fd5b5061020960045481565b34801561041b57600080fd5b5061042f61042a366004612054565b6114c0565b6040516101eb959493929190612565565b34801561044c57600080fd5b5061027a611507565b34801561046157600080fd5b5061027a610470366004612054565b61189f565b34801561048157600080fd5b5061020960085481565b34801561049757600080fd5b506003546102bc906001600160a01b031681565b3480156104b757600080fd5b506104cb6104c63660046120b1565b611937565b6040516101eb9493929190612597565b3480156104e757600080fd5b506104fb6104f6366004612054565b611a51565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101eb565b34801561054857600080fd5b50610209611aad565b34801561055d57600080fd5b5061027a61056c3660046120b1565b611abd565b34801561057d57600080fd5b50600b54610209565b34801561059257600080fd5b5061027a6105a13660046125d1565b611d11565b3480156105b257600080fd5b5061020960055481565b3480156105c857600080fd5b5061020960065481565b3480156105de57600080fd5b5061027a6105ed366004612620565b611dd0565b3480156105fe57600080fd5b5061027a61060d366004612054565b611e6c565b34801561061e57600080fd5b5061020961062d366004612054565b611e91565b34801561063e57600080fd5b5061020960095481565b6001805461065590612679565b80601f016020809104026020016040519081016040528092919081815260200182805461068190612679565b80156106ce5780601f106106a3576101008083540402835291602001916106ce565b820191906000526020600020905b8154815290600101906020018083116106b157829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea99061070890600190600401612730565b602060405180830381865afa158015610725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107499190612743565b6005546107569190612772565b905090565b60606000600c83815481106107725761077261278b565b90600052602060002090600602019050806002018054806020026020016040519081016040528092919081815260200182805480156107d057602002820191906000526020600020905b8154815260200190600101908083116107bc575b5050505050915050919050565b3033146107fd57604051630b2db9b760e31b815260040160405180910390fd5b600855565b30331461082257604051630b2db9b760e31b815260040160405180910390fd5b600555565b600c80546000919061083b906001906127a1565b8154811061084b5761084b61278b565b600091825260208220915460069190910290910191506001600160a01b031633146108895760405163381a2cb560e11b815260040160405180910390fd5b6001600482015460ff1660028111156108a4576108a46121d6565b146108c2576040516310cec38560e21b815260040160405180910390fd5b60028101548211156108e757604051631f6edbfd60e01b815260040160405180910390fd5b8115610977576000600b600283016109006001866127a1565b815481106109105761091061278b565b90600052602060002001548154811061092b5761092b61278b565b600091825260209091206005600890920201908101805460ff1916600117905542600682015560038301546002548254929350610975926001600160a01b03908116929116611ec2565b505b8060030154600a600082825461098d91906127a1565b90915550506000600382018190554260095560048201805460ff19166002179055828255600c805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a4f60405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600b8281548110610a6257610a6261278b565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610bae576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610b0b90612679565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3790612679565b8015610b845780601f10610b5957610100808354040283529160200191610b84565b820191906000526020600020905b815481529060010190602001808311610b6757829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610ab8565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610bfc611fad565b600c8281548110610c0f57610c0f61278b565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610c8b57602002820191906000526020600020905b815481526020019060010190808311610c77575b505050918352505060038201546020820152600482015460409091019060ff166002811115610cbc57610cbc6121d6565b6002811115610ccd57610ccd6121d6565b81526020016005820154815250509050919050565b600c805460009190610cf6906001906127a1565b81548110610d0657610d0661278b565b906000526020600020906006020160050154905080600654610d289190612772565b600954610d3590426127a1565b1115610d545760405163d5ac976d60e01b815260040160405180910390fd5b8451865114610d7657604051638f32290560e01b815260040160405180910390fd5b8251865114610d9857604051633222108360e01b815260040160405180910390fd5b600c805460009190610dac906001906127a1565b81548110610dbc57610dbc61278b565b60009182526020808320600b8054600181018255945260089093027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610e4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e739190612743565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610ea990600190600401612730565b602060405180830381865afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea9190612743565b600554610ef79190612772565b60018201819055341015610f1e5760405163070f6eed60e11b815260040160405180910390fd5b60008080805b8b5181101561112a576000898281518110610f4157610f4161278b565b60200260200101516001600160401b03811115610f6057610f606122a1565b6040519080825280601f01601f191660200182016040528015610f8a576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110610fbf57610fbf61278b565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d9084908110610ff857610ff861278b565b6020026020010151816001018190555060005b8b848151811061101d5761101d61278b565b6020026020010151811015611083578c6110378287612772565b815181106110475761104761278b565b602001015160f81c60f81b8382815181106110645761106461278b565b60200101906001600160f81b031916908160001a90535060010161100b565b50600281016110928382612805565b508a83815181106110a5576110a561278b565b6020026020010151846110b89190612772565b815460018301546040519296506110e2926001600160a01b03909216916002850190602001612937565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610f24565b50600c54600d90600090611140906001906127a1565b81526020808201929092526040908101600090812086825290925290205460ff161561117f5760405163607cb3e760e01b815260040160405180910390fd5b6001600d60006001600c8054905061119791906127a1565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916111eb908490612772565b9091555050600b546002860190611204906001906127a1565b815460018181018455600093845260209093200155600286015490036112375760095461123190426127a1565b60058601555b600c54611246906001906127a1565b600b543390611257906001906127a1565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a604051611286919061203a565b60405180910390a460008460010154346112a091906127a1565b905080156112c1576002546112c190339083906001600160a01b0316611ec2565b8460010154600a60008282546112d79190612772565b9091555050505050505050505050505050565b600c54600090610756906001906127a1565b6000600b84815481106113115761131161278b565b60009182526020909120600890910201600581015490915060ff166113485760405162325f4560e91b815260040160405180910390fd5b600754600682015461135a90426127a1565b111561137957604051638b349aa560e01b815260040160405180910390fd5b825b60028201548110801561139e575082158061139e575061139b8385612772565b81105b156114b95760008260020182815481106113ba576113ba61278b565b9060005260206000209060040201905060006113d4611aad565b600383015490915060ff161580156113f0575080826001015411155b156114a457815460018301546040516000926001600160a01b0316919061141b90600287019061296a565b60006040518083038185875af1925050503d8060008114611458576040519150601f19603f3d011682016040523d82523d6000602084013e61145d565b606091505b50909150508015156001036114a257600383015460ff161561149257604051630dc1019760e01b815260040160405180910390fd5b60038301805460ff191660011790555b505b505080806114b190612976565b91505061137b565b5050505050565b600c81815481106114d057600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600c80546000919061151b906001906127a1565b8154811061152b5761152b61278b565b90600052602060002090600602016005015490508060065461154d9190612772565b60095461155a90426127a1565b1161157857604051631875ed4760e21b815260040160405180910390fd5b600c80546000919061158c906001906127a1565b8154811061159c5761159c61278b565b6000918252602082206006909102019150600482015460ff1660028111156115c6576115c66121d6565b146115e4576040516304ee891b60e11b815260040160405180910390fd5b60028101546000036116115742600955600401805460ff1916600217905550600c80546001018155600052565b60028101546001036116e0576000600b826002016000815481106116375761163761278b565b9060005260206000200154815481106116525761165261278b565b6000918252602082206005600890920201908101805460ff1916600117905542600682015560038401805492905560025481549193506116a0916001600160a01b0390811691849116611ec2565b4260095560048301805460ff19166002179055600c805460010181556000908152600a80548392906116d39084906127a1565b9091555061189b92505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926117229201612730565b602060405180830381865afa15801561173f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117639190612743565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e191849161179f919060019060040161298f565b60206040518083038185885af11580156117bd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117e29190612743565b600180840191909155600c546117f891906127a1565b60018301546000908152600e60205260409020556003820154811061181e57600061182e565b80826003015461182e91906127a1565b6003830155600a548110611843576000611851565b80600a5461185191906127a1565b600a5560018201546000546004546040519081526001600160a01b03909116907fee1017dcbefba87397fcdaab31f187328533572b6a5568177fa2eb64026003b6906020016109ec565b5050565b3033146118bf57604051630b2db9b760e31b815260040160405180910390fd5b600c8054600091906118d3906001906127a1565b815481106118e3576118e361278b565b9060005260206000209060060201600501549050806006546119059190612772565b60095461191290426127a1565b11156119315760405163d5ac976d60e01b815260040160405180910390fd5b50600655565b6000806060600080600b87815481106119525761195261278b565b9060005260206000209060080201905060008160020187815481106119795761197961278b565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff9091169082906119be90612679565b80601f01602080910402602001604051908101604052809291908181526020018280546119ea90612679565b8015611a375780601f10611a0c57610100808354040283529160200191611a37565b820191906000526020600020905b815481529060010190602001808311611a1a57829003601f168201915b505050505091509550955095509550505092959194509250565b600b8181548110611a6157600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600a544761075691906127a1565b600c805460009190611ad1906001906127a1565b81548110611ae157611ae161278b565b906000526020600020906006020190506000600b826002018581548110611b0a57611b0a61278b565b906000526020600020015481548110611b2557611b2561278b565b906000526020600020906008020190506002600654611b4491906129b0565b600954611b5190426127a1565b1115611b705760405163383f4af360e21b815260040160405180910390fd5b82816003015414611b94576040516306e671b760e31b815260040160405180910390fd5b80546001600160a01b03163314611bbe5760405163415360c560e11b815260040160405180910390fd5b6008546004820154611bd090426127a1565b1115611bef5760405163603c988d60e11b815260040160405180910390fd5b600282018054611c01906001906127a1565b81548110611c1157611c1161278b565b9060005260206000200154826002018581548110611c3157611c3161278b565b6000918252602082200191909155600c54600d908290611c53906001906127a1565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611c9257611c926129d2565b600190038181906000526020600020016000905590558060010154826003016000828254611cc091906127a1565b90915550506001810154600a8054600090611cdc9084906127a1565b90915550506001810154604051339180156108fc02916000818181858888f193505050501580156114b9573d6000803e3d6000fd5b303314611d3157604051630b2db9b760e31b815260040160405180910390fd5b600c805460009190611d45906001906127a1565b81548110611d5557611d5561278b565b906000526020600020906006020160050154905080600654611d779190612772565b600954611d8490426127a1565b1115611da35760405163d5ac976d60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0385161790556001611dca8382612805565b50505050565b303314611df057604051630b2db9b760e31b815260040160405180910390fd5b6003546040516312a6505d60e21b81526001600160a01b0390911690634a99417490611e2290859085906004016129e8565b6020604051808303816000875af1158015611e41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e659190612743565b6004555050565b303314611e8c57604051630b2db9b760e31b815260040160405180910390fd5b600755565b600080600b8381548110611ea757611ea761278b565b60009182526020909120600260089092020101549392505050565b6040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015611ef157505050565b806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f2c57600080fd5b505af1158015611f40573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018790528516935063a9059cbb92506044019050600060405180830381600087803b158015611f9057600080fd5b505af1158015611fa4573d6000803e3d6000fd5b50505050505050565b6040518060c001604052806000815260200160008152602001606081526020016000815260200160006002811115611fe757611fe76121d6565b8152602001600081525090565b6000815180845260005b8181101561201a57602081850181015186830182015201611ffe565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061204d6020830184611ff4565b9392505050565b60006020828403121561206657600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156120a557835183529284019291840191600101612089565b50909695505050505050565b600080604083850312156120c457600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156121875761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d0152612167828d0182611ff4565b9287015115159b87019b909b52509850958901959189019160010161212e565b5050505060608901516080890152608089015160a089015260a089015195506121b460c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b6003811061220a57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b8083101561226b578351825292840192600192909201919084019061224b565b50606087015160808701526080870151935061228a60a08701856121ec565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156122df576122df6122a1565b604052919050565b60006001600160401b03821115612300576123006122a1565b5060051b60200190565b6001600160a01b038116811461231f57600080fd5b50565b600082601f83011261233357600080fd5b81356020612348612343836122e7565b6122b7565b8083825260208201915060208460051b87010193508684111561236a57600080fd5b602086015b8481101561238f5780356123828161230a565b835291830191830161236f565b509695505050505050565b600082601f8301126123ab57600080fd5b813560206123bb612343836122e7565b8083825260208201915060208460051b8701019350868411156123dd57600080fd5b602086015b8481101561238f57803583529183019183016123e2565b600082601f83011261240a57600080fd5b81356001600160401b03811115612423576124236122a1565b612436601f8201601f19166020016122b7565b81815284602083860101111561244b57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561248057600080fd5b85356001600160401b038082111561249757600080fd5b6124a389838a01612322565b965060208801359150808211156124b957600080fd5b6124c589838a0161239a565b955060408801359150808211156124db57600080fd5b6124e789838a016123f9565b945060608801359150808211156124fd57600080fd5b61250989838a0161239a565b9350608088013591508082111561251f57600080fd5b5061252c888289016123f9565b9150509295509295909350565b60008060006060848603121561254e57600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a0810161258760608301856121ec565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006125be6080830185611ff4565b9050821515606083015295945050505050565b600080604083850312156125e457600080fd5b82356125ef8161230a565b915060208301356001600160401b0381111561260a57600080fd5b612616858286016123f9565b9150509250929050565b6000806040838503121561263357600080fd5b82356001600160401b038082111561264a57600080fd5b612656868387016123f9565b9350602085013591508082111561266c57600080fd5b50612616858286016123f9565b600181811c9082168061268d57607f821691505b6020821081036126ad57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546126c081612679565b8085526020600183811680156126dd57600181146126f757612725565b60ff1985168884015283151560051b880183019550612725565b866000528260002060005b8581101561271d5781548a8201860152908301908401612702565b890184019650505b505050505092915050565b60208152600061204d60208301846126b3565b60006020828403121561275557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156127855761278561275c565b92915050565b634e487b7160e01b600052603260045260246000fd5b818103818111156127855761278561275c565b601f821115612800576000816000526020600020601f850160051c810160208610156127dd5750805b601f850160051c820191505b818110156127fc578281556001016127e9565b5050505b505050565b81516001600160401b0381111561281e5761281e6122a1565b6128328161282c8454612679565b846127b4565b602080601f831160018114612867576000841561284f5750858301515b600019600386901b1c1916600185901b1785556127fc565b600085815260208120601f198616915b8281101561289657888601518255948401946001909101908401612877565b50858210156128b45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081546128d181612679565b600182811680156128e957600181146128fe5761292d565b60ff198416875282151583028701945061292d565b8560005260208060002060005b858110156129245781548a82015290840190820161290b565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b168152826014820152600061296160348301846128c4565b95945050505050565b600061204d82846128c4565b6000600182016129885761298861275c565b5060010190565b8281526040602082015260006129a860408301846126b3565b949350505050565b6000826129cd57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b6060815260006060820152608060208201526000612a096080830185611ff4565b82810360408401526129618185611ff456fea2646970667358221220f2b8282f42be09212ddb68862ebc46615235bf74de96255090619d9bb6ee9fbd64736f6c63430008180033a2646970667358221220d9ef780b440c1764328934ff7e4d469c5032bf5c7d9090eb358fed860d7aca4f64736f6c63430008180033", "devdoc": { "events": { "NewGovernor(address)": { @@ -136,6 +136,7 @@ "_templateData": "The dispute template data.", "_templateDataMappings": "The dispute template data mappings.", "_templateRegistry": "Dispute Template registry address", + "_wNative": "The wrapped native token address, typically wETH.", "_withdrawTimeout": "Time in seconds after submission that allows to withdraw submitted list." } } @@ -151,22 +152,22 @@ "storageLayout": { "storage": [ { - "astId": 256, + "astId": 257, "contract": "src/GovernorFactory.sol:GovernorFactory", "label": "instances", "offset": 0, "slot": "0", - "type": "t_array(t_contract(KlerosGovernor)1762)dyn_storage" + "type": "t_array(t_contract(KlerosGovernor)1779)dyn_storage" } ], "types": { - "t_array(t_contract(KlerosGovernor)1762)dyn_storage": { - "base": "t_contract(KlerosGovernor)1762", + "t_array(t_contract(KlerosGovernor)1779)dyn_storage": { + "base": "t_contract(KlerosGovernor)1779", "encoding": "dynamic_array", "label": "contract KlerosGovernor[]", "numberOfBytes": "32" }, - "t_contract(KlerosGovernor)1762": { + "t_contract(KlerosGovernor)1779": { "encoding": "inplace", "label": "contract KlerosGovernor", "numberOfBytes": "20" diff --git a/contracts/deployments/arbitrumSepoliaDevnet/KlerosGovernor.json b/contracts/deployments/arbitrumSepoliaDevnet/KlerosGovernor.json index 742fa38..4b53084 100644 --- a/contracts/deployments/arbitrumSepoliaDevnet/KlerosGovernor.json +++ b/contracts/deployments/arbitrumSepoliaDevnet/KlerosGovernor.json @@ -1,5 +1,5 @@ { - "address": "0xCac020AD8BfBB9f32eC2802489aa571a218025b4", + "address": "0x52e6766e6C4fB05Caec92e5318668b3E366D649a", "abi": [ { "inputs": [ @@ -241,6 +241,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "disputeID", + "type": "uint256" + } + ], + "name": "arbitratorDisputeIDToSessionIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "sessionIndex", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "arbitratorExtraData", @@ -914,34 +933,34 @@ "type": "receive" } ], - "transactionHash": "0x0bf761c3e70dbaef24d9664ca0af2922b51a3298031dbf7da7284ff8864cb496", + "transactionHash": "0x4eef521268ff06b1f16e73ac2be117a54a485646da8d6da7c0329394de0fd468", "receipt": { "to": null, "from": "0x88AB19C0c7b57EeBa545acbD4368748194cd796B", - "contractAddress": "0xCac020AD8BfBB9f32eC2802489aa571a218025b4", - "transactionIndex": 1, - "gasUsed": "2745395", - "logsBloom": "0x04000000400000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000400000000000100000000000000008000000000000000000800", - "blockHash": "0x690e8659299ce902f1e3a6c88b93d0195d6fa9f99e7fa7100cf2c078092df9fc", - "transactionHash": "0x0bf761c3e70dbaef24d9664ca0af2922b51a3298031dbf7da7284ff8864cb496", + "contractAddress": "0x52e6766e6C4fB05Caec92e5318668b3E366D649a", + "transactionIndex": 2, + "gasUsed": "2780666", + "logsBloom": "0x20000000400000000000000000800000000000000000000000000000000000008000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000400000000000100000000000000000000000000000000000800", + "blockHash": "0xd4cfaf57298ffab8d7fdf878616340932c0011bfc7efd36345a716a1750f3fe7", + "transactionHash": "0x4eef521268ff06b1f16e73ac2be117a54a485646da8d6da7c0329394de0fd468", "logs": [ { - "transactionIndex": 1, - "blockNumber": 216122794, - "transactionHash": "0x0bf761c3e70dbaef24d9664ca0af2922b51a3298031dbf7da7284ff8864cb496", + "transactionIndex": 2, + "blockNumber": 216491663, + "transactionHash": "0x4eef521268ff06b1f16e73ac2be117a54a485646da8d6da7c0329394de0fd468", "address": "0xa28cA6364B40537B3e73c395cc2B1Bb6de1F1161", "topics": [ "0x00f7cd7255d1073b4e136dd477c38ea0020c051ab17110cc5bfab0c840ff9924", - "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000013", "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000004127b0a20202224736368656d61223a20222e2e2f4e65774469737075746554656d706c6174652e736368656d612e6a736f6e222c0a2020227469746c65223a2022457865637574652061207472616e73616374696f6e206c69737420696e204b6c65726f7320476f7665726e6f72222c0a2020226465736372697074696f6e223a20224d756c7469706c65207472616e73616374696f6e206c697374732077657265207375626d697474656420696e204b6c65726f7320476f7665726e6f722073657373696f6e207b7b65787465726e616c4469737075746549447d7d2c20706c6561736520766f746520666f72207768696368206c697374207472616e73616374696f6e206c6973742073686f756c642062652065786563757465642e222c0a2020227175657374696f6e223a20225768696368207472616e73616374696f6e206c6973742073686f756c642062652065786563757465643f222c0a20202022616e7377657273223a205b0a2020202020207b7b236c6973744964737d7d0a2020202020207b0a20202020202020202020226964223a20227b7b236865787d7d7b7b2e7d7d7b7b2f6865787d7d222c0a20202020202020202020227469746c65223a20224c697374202d207b7b202e207d7d222c0a20202020202020202020226465736372697074696f6e223a202245786563757465204c697374207b7b202e207d7d220a202020202020202020200a2020202020207d2c0a2020202020207b7b2f206c697374496473207d7d0a2020202020207b0a2020202020202020226964223a2230783030222c0a2020202020202020227469746c65223a202252656675736520746f20417262697472617465222c0a2020202020202020226465736372697074696f6e223a20224e6f206c6973742077696c6c2062652065786563757465642e220a2020202020207d0a0a202020205d2c0a202022706f6c696379555249223a20222f697066732f516d5074326f544843595a59555368754c78694b3451574836735850486a76675854714d44704353684b6f6751592f4b6c65726f73476f7665726e6f725072696d617279446f63756d656e742e706466222c0a20202266726f6e74656e6455726c223a202268747470733a2f2f676f7665726e6f722d76322e6b6c65726f732e6275696c646572732f676f7665726e6f722f7b7b61726269747261626c65416464726573737d7d222c0a20202261726269747261746f72436861696e4944223a2022343231363134222c0a20202261726269747261746f7241646472657373223a2022307839456643616546373837643062353364376132346664654142303637413442414643446238393246222c0a20202263617465676f7279223a20224b6c65726f7320476f7665726e6f72222c0a20202276657273696f6e223a2022312e30220a7d0a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001620a5b0a20207b0a202020202274797065223a20226162692f63616c6c222c0a2020202022616269223a202266756e6374696f6e2067657453657373696f6e2875696e743235362920766965772072657475726e7320282875696e74323536202c2075696e74323536202c2075696e743235365b5d202c2075696e74323536202c2075696e7438202c2075696e74323536202929222c0a202020202261646472657373223a20227b7b7b61726269747261626c65416464726573737d7d7d222c0a202020202266756e6374696f6e4e616d65223a202267657453657373696f6e222c0a202020202261726773223a205b0a202020202020227b7b7b65787465726e616c4469737075746549447d7d7d220a202020205d2c0a20202020227365656b223a205b0a202020202232220a202020205d2c0a2020202022706f70756c617465223a205b0a202020202020226c697374496473220a202020205d0a20207d0a5d0a000000000000000000000000000000000000000000000000000000000000", - "logIndex": 0, - "blockHash": "0x690e8659299ce902f1e3a6c88b93d0195d6fa9f99e7fa7100cf2c078092df9fc" + "data": "0x0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000004c67b0a20202224736368656d61223a20222e2e2f4e65774469737075746554656d706c6174652e736368656d612e6a736f6e222c0a2020227469746c65223a2022457865637574652061207472616e73616374696f6e206c69737420696e204b6c65726f7320476f7665726e6f72222c0a2020226465736372697074696f6e223a20224d756c7469706c65207472616e73616374696f6e206c697374732077657265207375626d697474656420696e204b6c65726f7320476f7665726e6f722073657373696f6e207b7b73657373696f6e496e6465787d7d2c20706c6561736520766f746520666f72207768696368206c697374207472616e73616374696f6e206c6973742073686f756c642062652065786563757465642e5c6e5c6e42656c6f77206172652074686520617661696c61626c65206c697374733a5c6e5c6e7b7b236c6973744964737d7d2d202a2a4c697374207b7b2e7d7d2a2a20e28692205b56696577205472616e73616374696f6e735d2868747470733a2f2f676f7665726e6f722d76322e6b6c65726f732e6275696c646572732f676f7665726e6f722f7b7b61726269747261626c65416464726573737d7d3f6c69737449643d7b7b2e7d7d295c6e7b7b2f6c6973744964737d7d222c0a2020227175657374696f6e223a20225768696368207472616e73616374696f6e206c6973742073686f756c642062652065786563757465643f222c0a20202022616e7377657273223a205b0a2020202020207b7b236c6973744964737d7d0a2020202020207b0a20202020202020202020226964223a20227b7b236865787d7d7b7b2e7d7d7b7b2f6865787d7d222c0a20202020202020202020227469746c65223a20224c697374202d207b7b202e207d7d222c0a20202020202020202020226465736372697074696f6e223a202245786563757465204c697374207b7b202e207d7d220a202020202020202020200a2020202020207d2c0a2020202020207b7b2f206c697374496473207d7d0a2020202020207b0a2020202020202020226964223a2230783030222c0a2020202020202020227469746c65223a202252656675736520746f20417262697472617465222c0a2020202020202020226465736372697074696f6e223a20224e6f206c6973742077696c6c2062652065786563757465642e220a2020202020207d0a0a202020205d2c0a202022706f6c696379555249223a20222f697066732f516d5074326f544843595a59555368754c78694b3451574836735850486a76675854714d44704353684b6f6751592f4b6c65726f73476f7665726e6f725072696d617279446f63756d656e742e706466222c0a20202266726f6e74656e6455726c223a202268747470733a2f2f676f7665726e6f722d76322e6b6c65726f732e6275696c646572732f676f7665726e6f722f7b7b61726269747261626c65416464726573737d7d222c0a20202261726269747261746f72436861696e4944223a2022343231363134222c0a20202261726269747261746f7241646472657373223a2022307839456643616546373837643062353364376132346664654142303637413442414643446238393246222c0a20202263617465676f7279223a20224b6c65726f7320476f7665726e6f72222c0a20202276657273696f6e223a2022312e30220a7d0a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bf0a5b0a20207b0a202020202274797065223a20226162692f63616c6c222c0a2020202022616269223a202266756e6374696f6e2061726269747261746f72446973707574654944546f53657373696f6e496e6465782875696e743235362920766965772072657475726e73202875696e7432353629222c0a202020202261646472657373223a20227b7b7b61726269747261626c65416464726573737d7d7d222c0a202020202266756e6374696f6e4e616d65223a202261726269747261746f72446973707574654944546f53657373696f6e496e646578222c0a202020202261726773223a205b0a202020202020227b7b7b61726269747261746f724469737075746549447d7d7d220a202020205d2c0a20202020227365656b223a205b0a202020202276616c7565220a202020205d2c0a2020202022706f70756c617465223a205b0a2020202020202273657373696f6e496e646578220a202020205d0a20207d2c0a20207b0a202020202274797065223a20226162692f63616c6c222c0a2020202022616269223a202266756e6374696f6e2067657453657373696f6e2875696e743235362920766965772072657475726e7320282875696e74323536202c2075696e74323536202c2075696e743235365b5d202c2075696e74323536202c2075696e7438202c2075696e74323536202929222c0a202020202261646472657373223a20227b7b7b61726269747261626c65416464726573737d7d7d222c0a202020202266756e6374696f6e4e616d65223a202267657453657373696f6e222c0a202020202261726773223a205b0a202020202020227b7b7b73657373696f6e496e6465787d7d7d220a202020205d2c0a20202020227365656b223a205b0a202020202232220a202020205d2c0a2020202022706f70756c617465223a205b0a202020202020226c697374496473220a202020205d0a20207d0a5d0a00", + "logIndex": 4, + "blockHash": "0xd4cfaf57298ffab8d7fdf878616340932c0011bfc7efd36345a716a1750f3fe7" } ], - "blockNumber": 216122794, - "cumulativeGasUsed": "2745395", + "blockNumber": 216491663, + "cumulativeGasUsed": "2894809", "status": 1, "byzantium": true }, @@ -949,19 +968,19 @@ "0x9EfCaeF787d0b53d7a24fdeAB067A4BAFCDb892F", "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003", "0xa28cA6364B40537B3e73c395cc2B1Bb6de1F1161", - "{\n \"$schema\": \"../NewDisputeTemplate.schema.json\",\n \"title\": \"Execute a transaction list in Kleros Governor\",\n \"description\": \"Multiple transaction lists were submitted in Kleros Governor session {{externalDisputeID}}, please vote for which list transaction list should be executed.\",\n \"question\": \"Which transaction list should be executed?\",\n \"answers\": [\n {{#listIds}}\n {\n \"id\": \"{{#hex}}{{.}}{{/hex}}\",\n \"title\": \"List - {{ . }}\",\n \"description\": \"Execute List {{ . }}\"\n \n },\n {{/ listIds }}\n {\n \"id\":\"0x00\",\n \"title\": \"Refuse to Arbitrate\",\n \"description\": \"No list will be executed.\"\n }\n\n ],\n \"policyURI\": \"/ipfs/QmPt2oTHCYZYUShuLxiK4QWH6sXPHjvgXTqMDpCShKogQY/KlerosGovernorPrimaryDocument.pdf\",\n \"frontendUrl\": \"https://governor-v2.kleros.builders/governor/{{arbitrableAddress}}\",\n \"arbitratorChainID\": \"421614\",\n \"arbitratorAddress\": \"0x9EfCaeF787d0b53d7a24fdeAB067A4BAFCDb892F\",\n \"category\": \"Kleros Governor\",\n \"version\": \"1.0\"\n}\n", - "\n[\n {\n \"type\": \"abi/call\",\n \"abi\": \"function getSession(uint256) view returns ((uint256 , uint256 , uint256[] , uint256 , uint8 , uint256 ))\",\n \"address\": \"{{{arbitrableAddress}}}\",\n \"functionName\": \"getSession\",\n \"args\": [\n \"{{{externalDisputeID}}}\"\n ],\n \"seek\": [\n \"2\"\n ],\n \"populate\": [\n \"listIds\"\n ]\n }\n]\n", + "{\n \"$schema\": \"../NewDisputeTemplate.schema.json\",\n \"title\": \"Execute a transaction list in Kleros Governor\",\n \"description\": \"Multiple transaction lists were submitted in Kleros Governor session {{sessionIndex}}, please vote for which list transaction list should be executed.\\n\\nBelow are the available lists:\\n\\n{{#listIds}}- **List {{.}}** → [View Transactions](https://governor-v2.kleros.builders/governor/{{arbitrableAddress}}?listId={{.}})\\n{{/listIds}}\",\n \"question\": \"Which transaction list should be executed?\",\n \"answers\": [\n {{#listIds}}\n {\n \"id\": \"{{#hex}}{{.}}{{/hex}}\",\n \"title\": \"List - {{ . }}\",\n \"description\": \"Execute List {{ . }}\"\n \n },\n {{/ listIds }}\n {\n \"id\":\"0x00\",\n \"title\": \"Refuse to Arbitrate\",\n \"description\": \"No list will be executed.\"\n }\n\n ],\n \"policyURI\": \"/ipfs/QmPt2oTHCYZYUShuLxiK4QWH6sXPHjvgXTqMDpCShKogQY/KlerosGovernorPrimaryDocument.pdf\",\n \"frontendUrl\": \"https://governor-v2.kleros.builders/governor/{{arbitrableAddress}}\",\n \"arbitratorChainID\": \"421614\",\n \"arbitratorAddress\": \"0x9EfCaeF787d0b53d7a24fdeAB067A4BAFCDb892F\",\n \"category\": \"Kleros Governor\",\n \"version\": \"1.0\"\n}\n", + "\n[\n {\n \"type\": \"abi/call\",\n \"abi\": \"function arbitratorDisputeIDToSessionIndex(uint256) view returns (uint256)\",\n \"address\": \"{{{arbitrableAddress}}}\",\n \"functionName\": \"arbitratorDisputeIDToSessionIndex\",\n \"args\": [\n \"{{{arbitratorDisputeID}}}\"\n ],\n \"seek\": [\n \"value\"\n ],\n \"populate\": [\n \"sessionIndex\"\n ]\n },\n {\n \"type\": \"abi/call\",\n \"abi\": \"function getSession(uint256) view returns ((uint256 , uint256 , uint256[] , uint256 , uint8 , uint256 ))\",\n \"address\": \"{{{arbitrableAddress}}}\",\n \"functionName\": \"getSession\",\n \"args\": [\n \"{{{sessionIndex}}}\"\n ],\n \"seek\": [\n \"2\"\n ],\n \"populate\": [\n \"listIds\"\n ]\n }\n]\n", 0, 600, 600, 600, "0x3829A2486d53ee984a0ca2D76552715726b77138" ], - "numDeployments": 18, - "solcInputHash": "334f9bb4703835bd27add7ada7992ca0", - "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_arbitratorExtraData\",\"type\":\"bytes\"},{\"internalType\":\"contract IDisputeTemplateRegistry\",\"name\":\"_templateRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_templateData\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_templateDataMappings\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_submissionBaseDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_submissionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_executionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_withdrawTimeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_wNative\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyDisputed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalTimeNotStarted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientDeposit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ListAlreadySubmitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotDisputed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyArbitratorAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySubmitterCanWithdraw\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerOnly\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RulingOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ShouldOnlyWithdrawInFirstHalf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubmissionNotApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubmissionTimeHasEnded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TimeToExecuteHasPassed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WithdrawingTimeHasPassed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongInputTargetAndDatasize\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongInputTargetAndValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongListHash\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_arbitratorDisputeID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_templateId\",\"type\":\"uint256\"}],\"name\":\"DisputeRequest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_submitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_session\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"}],\"name\":\"ListSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_disputeID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_ruling\",\"type\":\"uint256\"}],\"name\":\"Ruling\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"arbitrator\",\"outputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"arbitratorExtraData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_arbitratorExtraData\",\"type\":\"bytes\"}],\"name\":\"changeArbitrator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_templateData\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_templateDataMappings\",\"type\":\"string\"}],\"name\":\"changeDisputeTemplate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_executionTimeout\",\"type\":\"uint256\"}],\"name\":\"changeExecutionTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionBaseDeposit\",\"type\":\"uint256\"}],\"name\":\"changeSubmissionDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionTimeout\",\"type\":\"uint256\"}],\"name\":\"changeSubmissionTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_withdrawTimeout\",\"type\":\"uint256\"}],\"name\":\"changeWithdrawTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executeSubmissions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_cursor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"executeTransactionList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentSessionNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpendableFunds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumberOfCreatedLists\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"}],\"name\":\"getNumberOfTransactions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"txCount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_sessionIndex\",\"type\":\"uint256\"}],\"name\":\"getSession\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"ruling\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"disputeID\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"submittedLists\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"sumDeposit\",\"type\":\"uint256\"},{\"internalType\":\"enum KlerosGovernor.Status\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"durationOffset\",\"type\":\"uint256\"}],\"internalType\":\"struct KlerosGovernor.Session\",\"name\":\"_session\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listId\",\"type\":\"uint256\"}],\"name\":\"getSubmission\",\"outputs\":[{\"components\":[{\"internalType\":\"address payable\",\"name\":\"submitter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"executed\",\"type\":\"bool\"}],\"internalType\":\"struct KlerosGovernor.Transaction[]\",\"name\":\"txs\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes32\",\"name\":\"listHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"submissionTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"approvalTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"submissionBlock\",\"type\":\"uint256\"}],\"internalType\":\"struct KlerosGovernor.Submission\",\"name\":\"submission\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_session\",\"type\":\"uint256\"}],\"name\":\"getSubmittedLists\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"submittedLists\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalSubmissionDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_requiredDeposit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_transactionIndex\",\"type\":\"uint256\"}],\"name\":\"getTransactionInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"executed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastApprovalTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reservedETH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_disputeID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ruling\",\"type\":\"uint256\"}],\"name\":\"rule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"sessions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ruling\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"disputeID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sumDeposit\",\"type\":\"uint256\"},{\"internalType\":\"enum KlerosGovernor.Status\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"durationOffset\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"submissionBaseDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"submissionTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"submissions\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"submitter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"listHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"submissionTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"approvalTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"submissionBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_target\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_value\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"uint256[]\",\"name\":\"_dataSize\",\"type\":\"uint256[]\"},{\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"}],\"name\":\"submitList\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"templateId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"templateRegistry\",\"outputs\":[{\"internalType\":\"contract IDisputeTemplateRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wNative\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionID\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_listHash\",\"type\":\"bytes32\"}],\"name\":\"withdrawTransactionList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"Appeal and evidence submission is handled by the court.\",\"events\":{\"DisputeRequest(address,uint256,uint256)\":{\"params\":{\"_arbitrator\":\"The arbitrator of the contract.\",\"_arbitratorDisputeID\":\"The identifier of the dispute in the Arbitrator contract.\",\"_templateId\":\"The identifier of the dispute template.\"}},\"ListSubmitted(uint256,address,uint256,string)\":{\"params\":{\"_description\":\"The string in CSV format that contains labels of list's transactions. Note that the submitter may give bad descriptions of correct actions, but this is to be seen as UI enhancement, not a critical feature and that would play against him in case of dispute.\",\"_listID\":\"The index of the transaction list in the array of lists.\",\"_session\":\"The number of the current session.\",\"_submitter\":\"The address that submitted the list.\"}},\"Ruling(address,uint256,uint256)\":{\"params\":{\"_arbitrator\":\"The arbitrator giving the ruling.\",\"_disputeID\":\"The identifier of the dispute in the Arbitrator contract.\",\"_ruling\":\"The ruling which was given.\"}}},\"kind\":\"dev\",\"methods\":{\"changeArbitrator(address,bytes)\":{\"details\":\"It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract.\",\"params\":{\"_arbitrator\":\"The new trusted arbitrator.\",\"_arbitratorExtraData\":\"The extra data used by the new arbitrator.\"}},\"changeDisputeTemplate(string,string)\":{\"params\":{\"_templateData\":\"The new dispute template data.\",\"_templateDataMappings\":\"The new dispute template data mappings.\"}},\"changeExecutionTimeout(uint256)\":{\"params\":{\"_executionTimeout\":\"The new duration of the execution timeout, in seconds.\"}},\"changeSubmissionDeposit(uint256)\":{\"params\":{\"_submissionBaseDeposit\":\"The new value of the base deposit, in wei.\"}},\"changeSubmissionTimeout(uint256)\":{\"details\":\"It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract and prolonging submission timeout might switch it back to submission period.\",\"params\":{\"_submissionTimeout\":\"The new duration of the submission period, in seconds.\"}},\"changeWithdrawTimeout(uint256)\":{\"params\":{\"_withdrawTimeout\":\"The new duration of withdraw period, in seconds.\"}},\"constructor\":{\"params\":{\"_arbitrator\":\"The arbitrator of the contract.\",\"_arbitratorExtraData\":\"Extra data for the arbitrator.\",\"_executionTimeout\":\"Time in seconds after approval that allows to execute transactions of the approved list.\",\"_submissionBaseDeposit\":\"The base deposit required for submission.\",\"_submissionTimeout\":\"Time in seconds allocated for submitting transaction list.\",\"_templateData\":\"The dispute template data.\",\"_templateDataMappings\":\"The dispute template data mappings.\",\"_templateRegistry\":\"Dispute Template registry address\",\"_wNative\":\"The wrapped native token address, typically wETH.\",\"_withdrawTimeout\":\"Time in seconds after submission that allows to withdraw submitted list.\"}},\"executeSubmissions()\":{\"details\":\"If nothing was submitted changes session.\"},\"executeTransactionList(uint256,uint256,uint256)\":{\"params\":{\"_count\":\"Number of transactions to execute. Executes until the end if set to \\\"0\\\" or number higher than number of transactions in the list.\",\"_cursor\":\"Index of the transaction from which to start executing.\",\"_listID\":\"The index of the transaction list in the array of lists.\"}},\"getCurrentSessionNumber()\":{\"returns\":{\"_0\":\"The number of the ongoing session.\"}},\"getExpendableFunds()\":{\"returns\":{\"_0\":\"Contract balance without reserved ETH.\"}},\"getNumberOfCreatedLists()\":{\"returns\":{\"_0\":\"The number of created lists.\"}},\"getNumberOfTransactions(uint256)\":{\"params\":{\"_listID\":\"The index of the transaction list in the array of lists.\"},\"returns\":{\"txCount\":\"The number of transactions in the list.\"}},\"getSession(uint256)\":{\"returns\":{\"_session\":\"The session info.\"}},\"getSubmission(uint256)\":{\"params\":{\"_listId\":\"The index of the transaction list in the array of lists.\"},\"returns\":{\"submission\":\"List belonging to that listId.\"}},\"getSubmittedLists(uint256)\":{\"details\":\"This function is O(n), where `n` is the number of submissions in the session. This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts.\",\"params\":{\"_session\":\"The ID of the session.\"},\"returns\":{\"submittedLists\":\"Indexes of lists that were submitted during the session.\"}},\"getTotalSubmissionDeposit()\":{\"returns\":{\"_requiredDeposit\":\"required deposit value\"}},\"getTransactionInfo(uint256,uint256)\":{\"params\":{\"_listID\":\"The index of the transaction list in the array of lists.\",\"_transactionIndex\":\"The index of the transaction.\"},\"returns\":{\"data\":\"The data of the transaction.\",\"executed\":\"Whether the transaction was executed or not.\",\"target\":\"The target of the transaction.\",\"value\":\"The value of the transaction.\"}},\"rule(uint256,uint256)\":{\"details\":\"Must be called by the arbitrator.\",\"params\":{\"_disputeID\":\"ID of the dispute in the Arbitrator contract.\",\"_ruling\":\"Ruling given by the arbitrator. Note that 0 is reserved for \\\"Refuse to arbitrate\\\". Note If the final ruling is \\\"0\\\" nothing is approved and deposits will stay locked in the contract.\"}},\"submitList(address[],uint256[],bytes,uint256[],string)\":{\"params\":{\"_data\":\"Concatenated calldata of all transactions of this list.\",\"_dataSize\":\"List of lengths in bytes required to split calldata for its respective targets.\",\"_description\":\"String in CSV format that describes list's transactions.\",\"_target\":\"List of addresses to call.\",\"_value\":\"List of values required for respective addresses.\"}},\"withdrawTransactionList(uint256,bytes32)\":{\"details\":\"Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made.\",\"params\":{\"_listHash\":\"Hash of a withdrawing list.\",\"_submissionID\":\"Submission's index in the array of submitted lists of the current session.\"}}},\"title\":\"KlerosGovernor for V2.\",\"version\":1},\"userdoc\":{\"events\":{\"DisputeRequest(address,uint256,uint256)\":{\"notice\":\"To be emitted when a dispute is created to link the correct template to the disputeID.\"},\"ListSubmitted(uint256,address,uint256,string)\":{\"notice\":\"Emitted when a new list is submitted.\"},\"Ruling(address,uint256,uint256)\":{\"notice\":\"To be raised when a ruling is given.\"}},\"kind\":\"user\",\"methods\":{\"changeArbitrator(address,bytes)\":{\"notice\":\"Changes the arbitrator of the contract.\"},\"changeDisputeTemplate(string,string)\":{\"notice\":\"Update the dispute template data.\"},\"changeExecutionTimeout(uint256)\":{\"notice\":\"Changes the time allocated for list's execution.\"},\"changeSubmissionDeposit(uint256)\":{\"notice\":\"Changes the value of the base deposit required for submitting a list.\"},\"changeSubmissionTimeout(uint256)\":{\"notice\":\"Changes the time allocated for submission.\"},\"changeWithdrawTimeout(uint256)\":{\"notice\":\"Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period.\"},\"constructor\":{\"notice\":\"Constructor.\"},\"executeSubmissions()\":{\"notice\":\"Approves a transaction list or creates a dispute if more than one list was submitted.\"},\"executeTransactionList(uint256,uint256,uint256)\":{\"notice\":\"Executes selected transactions of the list.\"},\"getCurrentSessionNumber()\":{\"notice\":\"Gets the number of the ongoing session.\"},\"getExpendableFunds()\":{\"notice\":\"Gets the sum of contract funds that are used for the execution of transactions.\"},\"getNumberOfCreatedLists()\":{\"notice\":\"Gets the number of lists created in contract's lifetime.\"},\"getNumberOfTransactions(uint256)\":{\"notice\":\"Gets the number of transactions in the list.\"},\"getSession(uint256)\":{\"notice\":\"Gets the session from the session index.\"},\"getSubmission(uint256)\":{\"notice\":\"Gets the submission from listId.\"},\"getSubmittedLists(uint256)\":{\"notice\":\"Gets the array of submitted lists in the session.\"},\"getTotalSubmissionDeposit()\":{\"notice\":\"Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost).\"},\"getTransactionInfo(uint256,uint256)\":{\"notice\":\"Gets the info of the specific transaction in the specific list.\"},\"rule(uint256,uint256)\":{\"notice\":\"Gives a ruling for a dispute.\"},\"submitList(address[],uint256[],bytes,uint256[],string)\":{\"notice\":\"Creates transaction list based on input parameters and submits it for potential approval and execution.\"},\"withdrawTransactionList(uint256,bytes32)\":{\"notice\":\"Withdraws submitted transaction list. Reimburses submission deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KlerosGovernor.sol\":\"KlerosGovernor\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[]},\"sources\":{\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport {IArbitratorV2} from \\\"./IArbitratorV2.sol\\\";\\n\\n/// @title IArbitrableV2\\n/// @notice Arbitrable interface.\\n/// @dev When developing arbitrable contracts, we need to:\\n/// - Define the action taken when a ruling is received by the contract.\\n/// - Allow dispute creation which calls `arbitrator.createDispute{value: _fee}(_choices,_extraData)`.\\ninterface IArbitrableV2 {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a dispute is created to link the correct template to the disputeID.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorDisputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _templateId The identifier of the dispute template.\\n event DisputeRequest(IArbitratorV2 indexed _arbitrator, uint256 indexed _arbitratorDisputeID, uint256 _templateId);\\n\\n /// @notice To be raised when a ruling is given.\\n /// @param _arbitrator The arbitrator giving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitratorV2 indexed _arbitrator, uint256 indexed _disputeID, uint256 _ruling);\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Give a ruling for a dispute.\\n ///\\n /// @dev This is a callback function for the arbitrator to provide the ruling to this contract.\\n /// Only the arbitrator must be allowed to call this function.\\n /// Ruling 0 is reserved for \\\"Not able/wanting to make a decision\\\".\\n ///\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator.\\n function rule(uint256 _disputeID, uint256 _ruling) external;\\n}\\n\",\"keccak256\":\"0x97c6455e4b9f57e76f338f43eea612ea47ac933dda85c08ef29d418e34879a9b\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitratorV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport {IArbitrableV2} from \\\"./IArbitrableV2.sol\\\";\\n\\n/// @title Arbitrator\\n/// @notice Arbitrator interface for the Kleros V2 protocol.\\n/// @dev Unlike the ERC-792 this standard is not concerned with appeals, so each arbitrator can implement an appeal system that suits it the most.\\ninterface IArbitratorV2 {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a dispute is created.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _arbitrable The contract which created the dispute.\\n event DisputeCreation(uint256 indexed _disputeID, IArbitrableV2 indexed _arbitrable);\\n\\n /// @notice To be raised when a ruling is given.\\n /// @param _arbitrable The arbitrable receiving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitrableV2 indexed _arbitrable, uint256 indexed _disputeID, uint256 _ruling);\\n\\n /// @notice To be emitted when an ERC20 token is added or removed as a method to pay fees.\\n /// @param _token The ERC20 token.\\n /// @param _accepted Whether the token is accepted or not.\\n event AcceptedFeeToken(IERC20 indexed _token, bool indexed _accepted);\\n\\n /// @notice To be emitted when the fee for a particular ERC20 token is updated.\\n /// @param _feeToken The ERC20 token.\\n /// @param _rateInEth The new rate of the fee token in ETH.\\n /// @param _rateDecimals The new decimals of the fee token rate.\\n event NewCurrencyRate(IERC20 indexed _feeToken, uint64 _rateInEth, uint8 _rateDecimals);\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Create a dispute and pay for the fees in the native currency, typically ETH.\\n /// @dev Must be called by the arbitrable contract and pay at least `arbitrationCost(_extraData)` in ETH.\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData\\n ) external payable returns (uint256 disputeID);\\n\\n /// @notice Create a dispute and pay for the fees in a supported ERC20 token.\\n /// @dev Must be called by the arbitrable contract and pay at least `arbitrationCost(_extraData, _feeToken)` in the supported ERC20 token.\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @param _feeAmount Amount of the ERC20 token used to pay fees.\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData,\\n IERC20 _feeToken,\\n uint256 _feeAmount\\n ) external returns (uint256 disputeID);\\n\\n // ************************************* //\\n // * Public Views * //\\n // ************************************* //\\n\\n /// @notice Compute the cost of arbitration denominated in the native currency, typically ETH.\\n /// @dev It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return cost The arbitration cost in ETH.\\n function arbitrationCost(bytes calldata _extraData) external view returns (uint256 cost);\\n\\n /// @notice Compute the cost of arbitration denominated in `_feeToken`.\\n /// @dev It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @return cost The arbitration cost in `_feeToken`.\\n function arbitrationCost(bytes calldata _extraData, IERC20 _feeToken) external view returns (uint256 cost);\\n\\n /// @notice Gets the current ruling of a specified dispute.\\n /// @param _disputeID The ID of the dispute.\\n /// @return ruling The current ruling.\\n /// @return tied Whether it's a tie or not.\\n /// @return overridden Whether the ruling was overridden by appeal funding or not.\\n function currentRuling(uint256 _disputeID) external view returns (uint256 ruling, bool tied, bool overridden);\\n}\\n\",\"keccak256\":\"0x1f4e84e23034f3a291e305e8c69f283c9c97354a49a24f8c02ca366b3eaae00f\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\n/// @title IDisputeTemplateRegistry\\n/// @notice Dispute Template Registry interface.\\ninterface IDisputeTemplateRegistry {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a new dispute template is created.\\n /// @param _templateId The identifier of the dispute template.\\n /// @param _templateTag An optional tag for the dispute template, such as \\\"registration\\\" or \\\"removal\\\".\\n /// @param _templateData The template data.\\n /// @param _templateDataMappings The data mappings.\\n event DisputeTemplate(\\n uint256 indexed _templateId,\\n string indexed _templateTag,\\n string _templateData,\\n string _templateDataMappings\\n );\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Registers a new dispute template.\\n /// @param _templateTag An optional tag for the dispute template, such as \\\"registration\\\" or \\\"removal\\\".\\n /// @param _templateData The template data.\\n /// @param _templateDataMappings The data mappings for the template.\\n /// @return templateId The identifier of the dispute template.\\n function setDisputeTemplate(\\n string memory _templateTag,\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external returns (uint256 templateId);\\n}\\n\",\"keccak256\":\"0x1d6ad6549baabcbfe306ac3a9a3c339bb2d5dcb67fa9f3c5eaed0c9bd3548b12\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\"},\"src/KlerosGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.24;\\n\\nimport {IArbitrableV2, IArbitratorV2} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\\\";\\nimport \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\\\";\\nimport {SafeSend} from \\\"./libraries/SafeSend.sol\\\";\\nimport \\\"./interfaces/IArbSys.sol\\\";\\n\\n/// @title KlerosGovernor for V2.\\n/// @dev Appeal and evidence submission is handled by the court.\\ncontract KlerosGovernor is IArbitrableV2 {\\n using SafeSend for address payable;\\n\\n // ************************************* //\\n // * Enums / Structs * //\\n // ************************************* //\\n\\n enum Status {\\n NoDispute,\\n DisputeCreated,\\n Resolved\\n }\\n\\n struct Session {\\n uint256 ruling; // The ruling that was given in this session, if any.\\n uint256 disputeID; // ID given to the dispute of the session, if any.\\n uint256[] submittedLists; // Tracks all lists that were submitted in a session in the form submittedLists[submissionID].\\n uint256 sumDeposit; // Sum of all submission deposits in a session (minus arbitration fees). This is used to calculate the reward.\\n Status status; // Status of a session.\\n uint256 durationOffset; // Time in seconds that prolongs the submission period after the first submission, to give other submitters time to react.\\n }\\n\\n struct Transaction {\\n address target; // The address to call.\\n uint256 value; // Value paid by governor contract that will be used as msg.value in the execution.\\n bytes data; // Calldata of the transaction.\\n bool executed; // Whether the transaction was already executed or not.\\n }\\n\\n struct Submission {\\n address payable submitter; // The one who submits the list.\\n uint256 deposit; // Value of the deposit paid upon submission of the list.\\n Transaction[] txs; // Transactions stored in the list in the form txs[_transactionIndex].\\n bytes32 listHash; // A hash chain of all transactions stored in the list. This is used as a unique identifier within a session.\\n uint256 submissionTime; // The time when the list was submitted.\\n bool approved; // Whether the list was approved for execution or not.\\n uint256 approvalTime; // The time when the list was approved.\\n uint256 submissionBlock; // Block of list submission.\\n }\\n\\n ArbSys constant arbSys = ArbSys(address(100)); // ArbSys implementation https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference#arbsys\\n IArbitratorV2 public arbitrator; // Arbitrator contract.\\n bytes public arbitratorExtraData; // Extra data for arbitrator.\\n address public wNative; // The wrapped native token for safeSend().\\n IDisputeTemplateRegistry public templateRegistry; // The dispute template registry.\\n uint256 public templateId; // The current dispute template identifier.\\n\\n uint256 public submissionBaseDeposit; // The base deposit in wei that needs to be paid in order to submit the list.\\n uint256 public submissionTimeout; // Time in seconds allowed for submitting the lists. Once it's passed the contract enters the approval period.\\n uint256 public executionTimeout; // Time in seconds allowed for the execution of approved lists.\\n uint256 public withdrawTimeout; // Time in seconds allowed to withdraw a submitted list.\\n\\n uint256 public lastApprovalTime; // The time of the last approval of a transaction list.\\n uint256 public reservedETH; // Sum of contract's submission deposits. These funds are not to be used in the execution of transactions.\\n\\n Submission[] public submissions; // Stores all created transaction lists. submissions[_listID].\\n Session[] public sessions; // Stores all submitting sessions. sessions[_session].\\n mapping(uint256 sessionIndex => mapping(bytes32 listHash => bool)) alreadySubmitted; // Indicates whether or not the transaction list was already submitted in order to catch duplicates in the form alreadySubmitted[listHash].\\n\\n // ************************************* //\\n // * Function Modifiers * //\\n // ************************************* //\\n\\n modifier duringSubmissionPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n if (block.timestamp - lastApprovalTime > submissionTimeout + offset) revert SubmissionTimeHasEnded();\\n _;\\n }\\n\\n modifier duringApprovalPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n if (block.timestamp - lastApprovalTime <= submissionTimeout + offset) revert ApprovalTimeNotStarted();\\n _;\\n }\\n\\n modifier onlyByOwner() {\\n if (address(this) != msg.sender) revert OwnerOnly();\\n _;\\n }\\n\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice Emitted when a new list is submitted.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _submitter The address that submitted the list.\\n /// @param _session The number of the current session.\\n /// @param _description The string in CSV format that contains labels of list's transactions.\\n /// Note that the submitter may give bad descriptions of correct actions, but this is to be seen as UI enhancement, not a critical feature and that would play against him in case of dispute.\\n event ListSubmitted(\\n uint256 indexed _listID,\\n address indexed _submitter,\\n uint256 indexed _session,\\n string _description\\n );\\n\\n // ************************************* //\\n // * Constructor * //\\n // ************************************* //\\n\\n /// @notice Constructor.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorExtraData Extra data for the arbitrator.\\n /// @param _templateRegistry Dispute Template registry address\\n /// @param _templateData The dispute template data.\\n /// @param _templateDataMappings The dispute template data mappings.\\n /// @param _submissionBaseDeposit The base deposit required for submission.\\n /// @param _submissionTimeout Time in seconds allocated for submitting transaction list.\\n /// @param _executionTimeout Time in seconds after approval that allows to execute transactions of the approved list.\\n /// @param _withdrawTimeout Time in seconds after submission that allows to withdraw submitted list.\\n /// @param _wNative The wrapped native token address, typically wETH.\\n constructor(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData,\\n IDisputeTemplateRegistry _templateRegistry,\\n string memory _templateData,\\n string memory _templateDataMappings,\\n uint256 _submissionBaseDeposit,\\n uint256 _submissionTimeout,\\n uint256 _executionTimeout,\\n uint256 _withdrawTimeout,\\n address _wNative\\n ) {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n wNative = _wNative;\\n\\n lastApprovalTime = block.timestamp;\\n submissionBaseDeposit = _submissionBaseDeposit;\\n submissionTimeout = _submissionTimeout;\\n executionTimeout = _executionTimeout;\\n withdrawTimeout = _withdrawTimeout;\\n sessions.push();\\n submissions.push();\\n\\n templateRegistry = _templateRegistry;\\n templateId = IDisputeTemplateRegistry(templateRegistry).setDisputeTemplate(\\n \\\"\\\",\\n _templateData,\\n _templateDataMappings\\n );\\n }\\n\\n // ************************************* //\\n // * Governance * //\\n // ************************************* //\\n\\n /// @notice Changes the value of the base deposit required for submitting a list.\\n /// @param _submissionBaseDeposit The new value of the base deposit, in wei.\\n function changeSubmissionDeposit(uint256 _submissionBaseDeposit) external onlyByOwner {\\n submissionBaseDeposit = _submissionBaseDeposit;\\n }\\n\\n /// @notice Changes the time allocated for submission.\\n /// @dev It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract\\n /// and prolonging submission timeout might switch it back to submission period.\\n /// @param _submissionTimeout The new duration of the submission period, in seconds.\\n function changeSubmissionTimeout(uint256 _submissionTimeout) external onlyByOwner duringSubmissionPeriod {\\n submissionTimeout = _submissionTimeout;\\n }\\n\\n /// @notice Changes the time allocated for list's execution.\\n /// @param _executionTimeout The new duration of the execution timeout, in seconds.\\n function changeExecutionTimeout(uint256 _executionTimeout) external onlyByOwner {\\n executionTimeout = _executionTimeout;\\n }\\n\\n /// @notice Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period.\\n /// @param _withdrawTimeout The new duration of withdraw period, in seconds.\\n function changeWithdrawTimeout(uint256 _withdrawTimeout) external onlyByOwner {\\n withdrawTimeout = _withdrawTimeout;\\n }\\n\\n /// @notice Changes the arbitrator of the contract.\\n /// @dev It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract.\\n /// @param _arbitrator The new trusted arbitrator.\\n /// @param _arbitratorExtraData The extra data used by the new arbitrator.\\n function changeArbitrator(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData\\n ) external onlyByOwner duringSubmissionPeriod {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n }\\n\\n /// @notice Update the dispute template data.\\n /// @param _templateData The new dispute template data.\\n /// @param _templateDataMappings The new dispute template data mappings.\\n function changeDisputeTemplate(\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external onlyByOwner {\\n templateId = templateRegistry.setDisputeTemplate(\\\"\\\", _templateData, _templateDataMappings);\\n }\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Creates transaction list based on input parameters and submits it for potential approval and execution.\\n /// @param _target List of addresses to call.\\n /// @param _value List of values required for respective addresses.\\n /// @param _data Concatenated calldata of all transactions of this list.\\n /// @param _dataSize List of lengths in bytes required to split calldata for its respective targets.\\n /// @param _description String in CSV format that describes list's transactions.\\n function submitList(\\n address[] memory _target,\\n uint256[] memory _value,\\n bytes memory _data,\\n uint256[] memory _dataSize,\\n string memory _description\\n ) external payable duringSubmissionPeriod {\\n if (_target.length != _value.length) revert WrongInputTargetAndValue();\\n if (_target.length != _dataSize.length) revert WrongInputTargetAndDatasize();\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions.push();\\n submission.submitter = payable(msg.sender);\\n\\n // https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/block-numbers-and-time\\n submission.submissionBlock = arbSys.arbBlockNumber();\\n\\n // Do the assignment first to avoid creating a new variable and bypass a 'stack too deep' error.\\n submission.deposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n if (msg.value < submission.deposit) revert InsufficientDeposit();\\n\\n bytes32 listHash;\\n bytes32 currentTxHash;\\n uint256 readingPosition;\\n for (uint256 i = 0; i < _target.length; i++) {\\n bytes memory readData = new bytes(_dataSize[i]);\\n Transaction storage transaction = submission.txs.push();\\n transaction.target = _target[i];\\n transaction.value = _value[i];\\n for (uint256 j = 0; j < _dataSize[i]; j++) {\\n readData[j] = _data[readingPosition + j];\\n }\\n transaction.data = readData;\\n readingPosition += _dataSize[i];\\n currentTxHash = keccak256(abi.encodePacked(transaction.target, transaction.value, transaction.data));\\n listHash = keccak256(abi.encodePacked(currentTxHash, listHash));\\n }\\n if (!alreadySubmitted[sessions.length - 1][listHash]) revert ListAlreadySubmitted();\\n alreadySubmitted[sessions.length - 1][listHash] = true;\\n submission.listHash = listHash;\\n submission.submissionTime = block.timestamp;\\n session.sumDeposit += submission.deposit;\\n session.submittedLists.push(submissions.length - 1);\\n if (session.submittedLists.length == 1) session.durationOffset = block.timestamp - lastApprovalTime;\\n\\n emit ListSubmitted(submissions.length - 1, msg.sender, sessions.length - 1, _description);\\n\\n uint256 remainder = msg.value - submission.deposit;\\n if (remainder > 0) payable(msg.sender).safeSend(remainder, wNative);\\n\\n reservedETH += submission.deposit;\\n }\\n\\n /// @notice Withdraws submitted transaction list. Reimburses submission deposit.\\n /// @dev Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made.\\n /// @param _submissionID Submission's index in the array of submitted lists of the current session.\\n /// @param _listHash Hash of a withdrawing list.\\n function withdrawTransactionList(uint256 _submissionID, bytes32 _listHash) external {\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions[session.submittedLists[_submissionID]];\\n if (block.timestamp - lastApprovalTime > submissionTimeout / 2) revert ShouldOnlyWithdrawInFirstHalf();\\n // This is an extra check to prevent _submissionID linking to the wrong list because of index swap during withdrawal.\\n if (submission.listHash != _listHash) revert WrongListHash();\\n if (submission.submitter != msg.sender) revert OnlySubmitterCanWithdraw();\\n if (block.timestamp - submission.submissionTime > withdrawTimeout) revert WithdrawingTimeHasPassed();\\n session.submittedLists[_submissionID] = session.submittedLists[session.submittedLists.length - 1];\\n alreadySubmitted[sessions.length - 1][_listHash] = false;\\n session.submittedLists.pop();\\n session.sumDeposit -= submission.deposit;\\n reservedETH -= submission.deposit;\\n payable(msg.sender).transfer(submission.deposit);\\n }\\n\\n /// @notice Approves a transaction list or creates a dispute if more than one list was submitted.\\n /// @dev If nothing was submitted changes session.\\n function executeSubmissions() external duringApprovalPeriod {\\n Session storage session = sessions[sessions.length - 1];\\n if (session.status != Status.NoDispute) revert AlreadyDisputed();\\n if (session.submittedLists.length == 0) {\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n } else if (session.submittedLists.length == 1) {\\n Submission storage submission = submissions[session.submittedLists[0]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n uint256 sumDeposit = session.sumDeposit;\\n session.sumDeposit = 0;\\n submission.submitter.safeSend(sumDeposit, wNative);\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n\\n reservedETH -= sumDeposit;\\n } else {\\n session.status = Status.DisputeCreated;\\n uint256 arbitrationCost = arbitrator.arbitrationCost(arbitratorExtraData);\\n session.disputeID = arbitrator.createDispute{value: arbitrationCost}(\\n session.submittedLists.length,\\n arbitratorExtraData\\n );\\n // Check in case arbitration cost increased after the submission. It's unlikely that its increase won't be covered by the base deposit, but technically possible.\\n session.sumDeposit = session.sumDeposit > arbitrationCost ? session.sumDeposit - arbitrationCost : 0;\\n reservedETH = reservedETH > arbitrationCost ? reservedETH - arbitrationCost : 0;\\n emit DisputeRequest(arbitrator, session.disputeID, templateId);\\n }\\n }\\n\\n /// @notice Gives a ruling for a dispute.\\n /// @dev Must be called by the arbitrator.\\n /// @param _disputeID ID of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator. Note that 0 is reserved for \\\"Refuse to arbitrate\\\".\\n /// Note If the final ruling is \\\"0\\\" nothing is approved and deposits will stay locked in the contract.\\n function rule(uint256 _disputeID, uint256 _ruling) external override {\\n Session storage session = sessions[sessions.length - 1];\\n if (msg.sender != address(arbitrator)) revert OnlyArbitratorAllowed();\\n if (session.status != Status.DisputeCreated) revert NotDisputed();\\n if (_ruling > session.submittedLists.length) revert RulingOutOfBounds();\\n\\n if (_ruling != 0) {\\n Submission storage submission = submissions[session.submittedLists[_ruling - 1]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n submission.submitter.safeSend(session.sumDeposit, wNative);\\n }\\n // If the ruling is \\\"0\\\" the reserved funds of this session become expendable.\\n reservedETH -= session.sumDeposit;\\n\\n session.sumDeposit = 0;\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n session.ruling = _ruling;\\n sessions.push();\\n\\n emit Ruling(IArbitratorV2(msg.sender), _disputeID, _ruling);\\n }\\n\\n /// @notice Executes selected transactions of the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _cursor Index of the transaction from which to start executing.\\n /// @param _count Number of transactions to execute. Executes until the end if set to \\\"0\\\" or number higher than number of transactions in the list.\\n function executeTransactionList(uint256 _listID, uint256 _cursor, uint256 _count) external {\\n Submission storage submission = submissions[_listID];\\n if (!submission.approved) revert SubmissionNotApproved();\\n if (block.timestamp - submission.approvalTime > executionTimeout) revert TimeToExecuteHasPassed();\\n for (uint256 i = _cursor; i < submission.txs.length && (_count == 0 || i < _cursor + _count); i++) {\\n Transaction storage transaction = submission.txs[i];\\n uint256 expendableFunds = getExpendableFunds();\\n if (!transaction.executed && transaction.value <= expendableFunds) {\\n (bool callResult, ) = transaction.target.call{value: transaction.value}(transaction.data);\\n // An extra check to prevent re-entrancy through target call.\\n if (callResult == true) {\\n if (transaction.executed) revert AlreadyExecuted();\\n transaction.executed = true;\\n }\\n }\\n }\\n }\\n\\n /// @notice Receive function to receive funds for the execution of transactions.\\n receive() external payable {}\\n\\n /// @notice Gets the sum of contract funds that are used for the execution of transactions.\\n /// @return Contract balance without reserved ETH.\\n function getExpendableFunds() public view returns (uint256) {\\n return address(this).balance - reservedETH;\\n }\\n\\n /// @notice Gets the info of the specific transaction in the specific list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _transactionIndex The index of the transaction.\\n /// @return target The target of the transaction.\\n /// @return value The value of the transaction.\\n /// @return data The data of the transaction.\\n /// @return executed Whether the transaction was executed or not.\\n function getTransactionInfo(\\n uint256 _listID,\\n uint256 _transactionIndex\\n ) external view returns (address target, uint256 value, bytes memory data, bool executed) {\\n Submission storage submission = submissions[_listID];\\n Transaction storage transaction = submission.txs[_transactionIndex];\\n return (transaction.target, transaction.value, transaction.data, transaction.executed);\\n }\\n\\n /// @notice Gets the array of submitted lists in the session.\\n ///\\n /// @dev This function is O(n), where `n` is the number of submissions in the session.\\n /// This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts.\\n ///\\n /// @param _session The ID of the session.\\n /// @return submittedLists Indexes of lists that were submitted during the session.\\n function getSubmittedLists(uint256 _session) external view returns (uint256[] memory submittedLists) {\\n Session storage session = sessions[_session];\\n submittedLists = session.submittedLists;\\n }\\n\\n /// @notice Gets the submission from listId.\\n /// @param _listId The index of the transaction list in the array of lists.\\n /// @return submission List belonging to that listId.\\n function getSubmission(uint256 _listId) external view returns (Submission memory submission) {\\n submission = submissions[_listId];\\n }\\n\\n /// @notice Gets the number of transactions in the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @return txCount The number of transactions in the list.\\n function getNumberOfTransactions(uint256 _listID) external view returns (uint256 txCount) {\\n Submission storage submission = submissions[_listID];\\n return submission.txs.length;\\n }\\n\\n /// @notice Gets the number of lists created in contract's lifetime.\\n /// @return The number of created lists.\\n function getNumberOfCreatedLists() external view returns (uint256) {\\n return submissions.length;\\n }\\n\\n /// @notice Gets the number of the ongoing session.\\n /// @return The number of the ongoing session.\\n function getCurrentSessionNumber() external view returns (uint256) {\\n return sessions.length - 1;\\n }\\n\\n /// @notice Gets the session from the session index.\\n /// @return _session The session info.\\n function getSession(uint256 _sessionIndex) external view returns (Session memory _session) {\\n _session = sessions[_sessionIndex];\\n }\\n\\n /// @notice Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost).\\n /// @return _requiredDeposit required deposit value\\n function getTotalSubmissionDeposit() external view returns (uint256 _requiredDeposit) {\\n _requiredDeposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n }\\n\\n // ************************************* //\\n // * Errors * //\\n // ************************************* //\\n\\n error SubmissionTimeHasEnded();\\n error ApprovalTimeNotStarted();\\n error OwnerOnly();\\n error WrongInputTargetAndValue();\\n error WrongInputTargetAndDatasize();\\n error InsufficientDeposit();\\n error ListAlreadySubmitted();\\n error ShouldOnlyWithdrawInFirstHalf();\\n error WrongListHash();\\n error OnlySubmitterCanWithdraw();\\n error WithdrawingTimeHasPassed();\\n error AlreadyDisputed();\\n error OnlyArbitratorAllowed();\\n error NotDisputed();\\n error RulingOutOfBounds();\\n error SubmissionNotApproved();\\n error TimeToExecuteHasPassed();\\n error AlreadyExecuted();\\n}\\n\",\"keccak256\":\"0xe43c23fe08e7022e619a9514d2a7dc5d05e454919a0ed51ca91164d95e04b028\",\"license\":\"MIT\"},\"src/interfaces/IArbSys.sol\":{\"content\":\"// https://github.com/OffchainLabs/nitro-contracts/blob/bdb8f8c68b2229fe9309fe9c03b37017abd1a2cd/src/precompiles/ArbSys.sol\\n// Copyright 2021-2022, Offchain Labs, Inc.\\n// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE\\n// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity >=0.4.21 <0.9.0;\\n\\n/**\\n * @title System level functionality\\n * @notice For use by contracts to interact with core L2-specific functionality.\\n * Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064.\\n */\\ninterface ArbSys {\\n /**\\n * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)\\n * @return block number as int\\n */\\n function arbBlockNumber() external view returns (uint256);\\n\\n /**\\n * @notice Get Arbitrum block hash (reverts unless currentBlockNum-256 <= arbBlockNum < currentBlockNum)\\n * @return block hash\\n */\\n function arbBlockHash(uint256 arbBlockNum) external view returns (bytes32);\\n\\n /**\\n * @notice Gets the rollup's unique chain identifier\\n * @return Chain identifier as int\\n */\\n function arbChainID() external view returns (uint256);\\n\\n /**\\n * @notice Get internal version number identifying an ArbOS build, this is `55 + nitroArbOS version number`\\n * e.g. on ArbOS 31 this would return 86. This is the only function that have the 55 offset.\\n * @return version number as int\\n */\\n function arbOSVersion() external view returns (uint256);\\n\\n /**\\n * @notice Returns 0 since Nitro has no concept of storage gas\\n * @return uint 0\\n */\\n function getStorageGasAvailable() external view returns (uint256);\\n\\n /**\\n * @notice (deprecated) check if current call is top level (meaning it was triggered by an EoA or a L1 contract)\\n * @dev this call has been deprecated and may be removed in a future release\\n * @return true if current execution frame is not a call by another L2 contract\\n */\\n function isTopLevelCall() external view returns (bool);\\n\\n /**\\n * @notice map L1 sender contract address to its L2 alias\\n * @param sender sender address\\n * @param unused argument no longer used\\n * @return aliased sender address\\n */\\n function mapL1SenderContractAddressToL2Alias(address sender, address unused) external pure returns (address);\\n\\n /**\\n * @notice check if the caller (of this caller of this) is an aliased L1 contract address\\n * @return true iff the caller's address is an alias for an L1 contract address\\n */\\n function wasMyCallersAddressAliased() external view returns (bool);\\n\\n /**\\n * @notice return the address of the caller (of this caller of this), without applying L1 contract address aliasing\\n * @return address of the caller's caller, without applying L1 contract address aliasing\\n */\\n function myCallersAddressWithoutAliasing() external view returns (address);\\n\\n /**\\n * @notice Send given amount of Eth to dest from sender.\\n * This is a convenience function, which is equivalent to calling sendTxToL1 with empty data.\\n * @param destination recipient address on L1\\n * @return unique identifier for this L2-to-L1 transaction.\\n */\\n function withdrawEth(address destination) external payable returns (uint256);\\n\\n /**\\n * @notice Send a transaction to L1\\n * @dev it is not possible to execute on the L1 any L2-to-L1 transaction which contains data\\n * to a contract address without any code (as enforced by the Bridge contract).\\n * @param destination recipient address on L1\\n * @param data (optional) calldata for L1 contract call\\n * @return a unique identifier for this L2-to-L1 transaction.\\n */\\n function sendTxToL1(address destination, bytes calldata data) external payable returns (uint256);\\n\\n /**\\n * @notice Get send Merkle tree state\\n * @return size number of sends in the history\\n * @return root root hash of the send history\\n * @return partials hashes of partial subtrees in the send history tree\\n */\\n function sendMerkleTreeState() external view returns (uint256 size, bytes32 root, bytes32[] memory partials);\\n\\n /**\\n * @notice creates a send txn from L2 to L1\\n * @param position = (level << 192) + leaf = (0 << 192) + leaf = leaf\\n */\\n event L2ToL1Tx(\\n address caller,\\n address indexed destination,\\n uint256 indexed hash,\\n uint256 indexed position,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /// @dev DEPRECATED in favour of the new L2ToL1Tx event above after the nitro upgrade\\n event L2ToL1Transaction(\\n address caller,\\n address indexed destination,\\n uint256 indexed uniqueId,\\n uint256 indexed batchNumber,\\n uint256 indexInBatch,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /**\\n * @notice logs a merkle branch for proof synthesis\\n * @param reserved an index meant only to align the 4th index with L2ToL1Transaction's 4th event\\n * @param hash the merkle hash\\n * @param position = (level << 192) + leaf\\n */\\n event SendMerkleUpdate(uint256 indexed reserved, bytes32 indexed hash, uint256 indexed position);\\n\\n error InvalidBlockNumber(uint256 requested, uint256 current);\\n}\\n\",\"keccak256\":\"0x9f2e1c9d8d19db1d3c6baa0549d14a68d09526764f4bd6f3bf030f0af7fd12fe\",\"license\":\"BUSL-1.1\"},\"src/libraries/SafeSend.sol\":{\"content\":\"/**\\n * @authors: [@andreimvp]\\n * @reviewers: [@divyangchauhan, @wadader, @fcanela, @unknownunknown1]\\n * @auditors: []\\n * @bounties: []\\n * SPDX-License-Identifier: MIT\\n */\\n\\npragma solidity ^0.8.24;\\n\\ninterface WethLike {\\n function deposit() external payable;\\n\\n function transfer(address dst, uint256 wad) external;\\n}\\n\\nlibrary SafeSend {\\n function safeSend(address payable _to, uint256 _value, address _wethLike) internal {\\n if (_to.send(_value)) return;\\n\\n WethLike(_wethLike).deposit{value: _value}();\\n WethLike(_wethLike).transfer(_to, _value); /// forge-lint: disable-line(erc20-unchecked-transfer)\\n }\\n}\\n\",\"keccak256\":\"0xd4d5b25d0eb7f7965ea7a9e3d3d6bc13368de9aaf882543a75dc9c57c85e9283\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b5060405162002f0038038062002f00833981016040819052620000349162000225565b600080546001600160a01b0319166001600160a01b038c1617905560016200005d8a82620003a9565b50600280546001600160a01b038084166001600160a01b031992831617909255426009556005879055600686905560078590556008849055600c80546001908101909155600b8054909101815560005260038054928b1692909116821790556040516312a6505d60e21b8152634a99417490620000e1908a908a90600401620004a3565b6020604051808303816000875af115801562000101573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001279190620004e3565b60045550620004fd98505050505050505050565b80516001600160a01b03811681146200015357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200018b57818101518382015260200162000171565b50506000910152565b600082601f830112620001a657600080fd5b81516001600160401b0380821115620001c357620001c362000158565b604051601f8301601f19908116603f01168101908282118183101715620001ee57620001ee62000158565b816040528381528660208588010111156200020857600080fd5b6200021b8460208301602089016200016e565b9695505050505050565b6000806000806000806000806000806101408b8d0312156200024657600080fd5b620002518b6200013b565b60208c0151909a506001600160401b03808211156200026f57600080fd5b6200027d8e838f0162000194565b9a506200028d60408e016200013b565b995060608d0151915080821115620002a457600080fd5b620002b28e838f0162000194565b985060808d0151915080821115620002c957600080fd5b50620002d88d828e0162000194565b96505060a08b0151945060c08b0151935060e08b015192506101008b01519150620003076101208c016200013b565b90509295989b9194979a5092959850565b600181811c908216806200032d57607f821691505b6020821081036200034e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a4576000816000526020600020601f850160051c810160208610156200037f5750805b601f850160051c820191505b81811015620003a0578281556001016200038b565b5050505b505050565b81516001600160401b03811115620003c557620003c562000158565b620003dd81620003d6845462000318565b8462000354565b602080601f831160018114620004155760008415620003fc5750858301515b600019600386901b1c1916600185901b178555620003a0565b600085815260208120601f198616915b82811015620004465788860151825594840194600190910190840162000425565b5085821015620004655787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526200048f8160208601602086016200016e565b601f01601f19169290920160200192915050565b6060815260006060820152608060208201526000620004c6608083018562000475565b8281036040840152620004da818562000475565b95945050505050565b600060208284031215620004f657600080fd5b5051919050565b6129f3806200050d6000396000f3fe6080604052600436106101b25760003560e01c806383c4b7a3116100ed578063b6cd08c611610090578063b6cd08c614610519578063b6dc775414610539578063ba7079ca1461054e578063bb0b86ff1461056e578063c4bd851914610584578063c5d552881461059a578063cc2bcdb4146105ba578063dc17bbdb146105da578063f730c07f146105fa57600080fd5b806383c4b7a3146103d75780639244c70414610408578063953d66511461041d5780639c15d1a21461043d578063a0af81f014610453578063a3c595c914610473578063ad73349e146104a3578063b51257001461050457600080fd5b80633e8686cc116101555780633e8686cc146102e9578063402ff0db1461031657806346047838146103435780636c0b7e71146103565780636cc6cde11461036b5780636cf39c2b1461038b57806377b9fda8146103ab5780637aa77f29146103c157600080fd5b80630c7ac7b6146101be5780631b1f5e7b146101e957806321cea5381461020c57806322b52d6614610239578063246c76df1461024f57806324baacc7146102715780632d68efc914610291578063311a6c56146102c957600080fd5b366101b957005b600080fd5b3480156101ca57600080fd5b506101d3610610565b6040516101e09190611fdc565b60405180910390f35b3480156101f557600080fd5b506101fe61069e565b6040519081526020016101e0565b34801561021857600080fd5b5061022c610227366004611ff6565b610723565b6040516101e0919061200f565b34801561024557600080fd5b506101fe60075481565b34801561025b57600080fd5b5061026f61026a366004611ff6565b6107a5565b005b34801561027d57600080fd5b5061026f61028c366004611ff6565b6107ca565b34801561029d57600080fd5b506002546102b1906001600160a01b031681565b6040516001600160a01b0390911681526020016101e0565b3480156102d557600080fd5b5061026f6102e4366004612053565b6107ef565b3480156102f557600080fd5b50610309610304366004611ff6565b6109c1565b6040516101e09190612075565b34801561032257600080fd5b50610336610331366004611ff6565b610bbc565b6040516101e091906121b0565b61026f61035136600461240a565b610caa565b34801561036257600080fd5b506101fe6112b1565b34801561037757600080fd5b506000546102b1906001600160a01b031681565b34801561039757600080fd5b5061026f6103a63660046124db565b6112c3565b3480156103b757600080fd5b506101fe600a5481565b3480156103cd57600080fd5b506101fe60045481565b3480156103e357600080fd5b506103f76103f2366004611ff6565b611487565b6040516101e0959493929190612507565b34801561041457600080fd5b5061026f6114ce565b34801561042957600080fd5b5061026f610438366004611ff6565b611841565b34801561044957600080fd5b506101fe60085481565b34801561045f57600080fd5b506003546102b1906001600160a01b031681565b34801561047f57600080fd5b5061049361048e366004612053565b6118d9565b6040516101e09493929190612539565b3480156104af57600080fd5b506104c36104be366004611ff6565b6119f3565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101e0565b34801561051057600080fd5b506101fe611a4f565b34801561052557600080fd5b5061026f610534366004612053565b611a5f565b34801561054557600080fd5b50600b546101fe565b34801561055a57600080fd5b5061026f610569366004612573565b611cb3565b34801561057a57600080fd5b506101fe60055481565b34801561059057600080fd5b506101fe60065481565b3480156105a657600080fd5b5061026f6105b53660046125c2565b611d72565b3480156105c657600080fd5b5061026f6105d5366004611ff6565b611e0e565b3480156105e657600080fd5b506101fe6105f5366004611ff6565b611e33565b34801561060657600080fd5b506101fe60095481565b6001805461061d9061261b565b80601f01602080910402602001604051908101604052809291908181526020018280546106499061261b565b80156106965780601f1061066b57610100808354040283529160200191610696565b820191906000526020600020905b81548152906001019060200180831161067957829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea9906106d0906001906004016126d2565b602060405180830381865afa1580156106ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071191906126e5565b60055461071e9190612714565b905090565b60606000600c838154811061073a5761073a61272d565b906000526020600020906006020190508060020180548060200260200160405190810160405280929190818152602001828054801561079857602002820191906000526020600020905b815481526020019060010190808311610784575b5050505050915050919050565b3033146107c557604051630b2db9b760e31b815260040160405180910390fd5b600855565b3033146107ea57604051630b2db9b760e31b815260040160405180910390fd5b600555565b600c80546000919061080390600190612743565b815481106108135761081361272d565b600091825260208220915460069190910290910191506001600160a01b031633146108515760405163381a2cb560e11b815260040160405180910390fd5b6001600482015460ff16600281111561086c5761086c612178565b1461088a576040516310cec38560e21b815260040160405180910390fd5b60028101548211156108af57604051631f6edbfd60e01b815260040160405180910390fd5b811561093f576000600b600283016108c8600186612743565b815481106108d8576108d861272d565b9060005260206000200154815481106108f3576108f361272d565b600091825260209091206005600890920201908101805460ff191660011790554260068201556003830154600254825492935061093d926001600160a01b03908116929116611e64565b505b8060030154600a60008282546109559190612743565b90915550506000600382018190554260095560048201805460ff19166002179055828255600c805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a1760405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600b8281548110610a2a57610a2a61272d565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610b76576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610ad39061261b565b80601f0160208091040260200160405190810160405280929190818152602001828054610aff9061261b565b8015610b4c5780601f10610b2157610100808354040283529160200191610b4c565b820191906000526020600020905b815481529060010190602001808311610b2f57829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610a80565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610bc4611f4f565b600c8281548110610bd757610bd761272d565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610c5357602002820191906000526020600020905b815481526020019060010190808311610c3f575b505050918352505060038201546020820152600482015460409091019060ff166002811115610c8457610c84612178565b6002811115610c9557610c95612178565b81526020016005820154815250509050919050565b600c805460009190610cbe90600190612743565b81548110610cce57610cce61272d565b906000526020600020906006020160050154905080600654610cf09190612714565b600954610cfd9042612743565b1115610d1c5760405163d5ac976d60e01b815260040160405180910390fd5b8451865114610d3e57604051638f32290560e01b815260040160405180910390fd5b8251865114610d6057604051633222108360e01b815260040160405180910390fd5b600c805460009190610d7490600190612743565b81548110610d8457610d8461272d565b60009182526020808320600b8054600181018255945260089093027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3b91906126e5565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610e71906001906004016126d2565b602060405180830381865afa158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb291906126e5565b600554610ebf9190612714565b60018201819055341015610ee65760405163070f6eed60e11b815260040160405180910390fd5b60008080805b8b518110156110f2576000898281518110610f0957610f0961272d565b60200260200101516001600160401b03811115610f2857610f28612243565b6040519080825280601f01601f191660200182016040528015610f52576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110610f8757610f8761272d565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d9084908110610fc057610fc061272d565b6020026020010151816001018190555060005b8b8481518110610fe557610fe561272d565b602002602001015181101561104b578c610fff8287612714565b8151811061100f5761100f61272d565b602001015160f81c60f81b83828151811061102c5761102c61272d565b60200101906001600160f81b031916908160001a905350600101610fd3565b506002810161105a83826127a7565b508a838151811061106d5761106d61272d565b6020026020010151846110809190612714565b815460018301546040519296506110aa926001600160a01b039092169160028501906020016128d9565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610eec565b50600c54600d9060009061110890600190612743565b81526020808201929092526040908101600090812086825290925290205460ff166111465760405163607cb3e760e01b815260040160405180910390fd5b6001600d60006001600c8054905061115e9190612743565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916111b2908490612714565b9091555050600b5460028601906111cb90600190612743565b815460018181018455600093845260209093200155600286015490036111fe576009546111f89042612743565b60058601555b600c5461120d90600190612743565b600b54339061121e90600190612743565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a60405161124d9190611fdc565b60405180910390a460008460010154346112679190612743565b905080156112885760025461128890339083906001600160a01b0316611e64565b8460010154600a600082825461129e9190612714565b9091555050505050505050505050505050565b600c5460009061071e90600190612743565b6000600b84815481106112d8576112d861272d565b60009182526020909120600890910201600581015490915060ff1661130f5760405162325f4560e91b815260040160405180910390fd5b60075460068201546113219042612743565b111561134057604051638b349aa560e01b815260040160405180910390fd5b825b600282015481108015611365575082158061136557506113628385612714565b81105b156114805760008260020182815481106113815761138161272d565b90600052602060002090600402019050600061139b611a4f565b600383015490915060ff161580156113b7575080826001015411155b1561146b57815460018301546040516000926001600160a01b031691906113e290600287019061290c565b60006040518083038185875af1925050503d806000811461141f576040519150601f19603f3d011682016040523d82523d6000602084013e611424565b606091505b509091505080151560010361146957600383015460ff161561145957604051630dc1019760e01b815260040160405180910390fd5b60038301805460ff191660011790555b505b5050808061147890612918565b915050611342565b5050505050565b600c818154811061149757600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600c8054600091906114e290600190612743565b815481106114f2576114f261272d565b9060005260206000209060060201600501549050806006546115149190612714565b6009546115219042612743565b1161153f57604051631875ed4760e21b815260040160405180910390fd5b600c80546000919061155390600190612743565b815481106115635761156361272d565b6000918252602082206006909102019150600482015460ff16600281111561158d5761158d612178565b146115ab576040516304ee891b60e11b815260040160405180910390fd5b60028101546000036115d85742600955600401805460ff1916600217905550600c80546001018155600052565b60028101546001036116a7576000600b826002016000815481106115fe576115fe61272d565b9060005260206000200154815481106116195761161961272d565b6000918252602082206005600890920201908101805460ff191660011790554260068201556003840180549290556002548154919350611667916001600160a01b0390811691849116611e64565b4260095560048301805460ff19166002179055600c805460010181556000908152600a805483929061169a908490612743565b9091555061183d92505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926116e992016126d2565b602060405180830381865afa158015611706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172a91906126e5565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e19184916117669190600190600401612931565b60206040518083038185885af1158015611784573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117a991906126e5565b6001830155600382015481106117c05760006117d0565b8082600301546117d09190612743565b6003830155600a5481106117e55760006117f3565b80600a546117f39190612743565b600a5560018201546000546004546040519081526001600160a01b03909116907fee1017dcbefba87397fcdaab31f187328533572b6a5568177fa2eb64026003b6906020016109b4565b5050565b30331461186157604051630b2db9b760e31b815260040160405180910390fd5b600c80546000919061187590600190612743565b815481106118855761188561272d565b9060005260206000209060060201600501549050806006546118a79190612714565b6009546118b49042612743565b11156118d35760405163d5ac976d60e01b815260040160405180910390fd5b50600655565b6000806060600080600b87815481106118f4576118f461272d565b90600052602060002090600802019050600081600201878154811061191b5761191b61272d565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff9091169082906119609061261b565b80601f016020809104026020016040519081016040528092919081815260200182805461198c9061261b565b80156119d95780601f106119ae576101008083540402835291602001916119d9565b820191906000526020600020905b8154815290600101906020018083116119bc57829003601f168201915b505050505091509550955095509550505092959194509250565b600b8181548110611a0357600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600a544761071e9190612743565b600c805460009190611a7390600190612743565b81548110611a8357611a8361272d565b906000526020600020906006020190506000600b826002018581548110611aac57611aac61272d565b906000526020600020015481548110611ac757611ac761272d565b906000526020600020906008020190506002600654611ae69190612952565b600954611af39042612743565b1115611b125760405163383f4af360e21b815260040160405180910390fd5b82816003015414611b36576040516306e671b760e31b815260040160405180910390fd5b80546001600160a01b03163314611b605760405163415360c560e11b815260040160405180910390fd5b6008546004820154611b729042612743565b1115611b915760405163603c988d60e11b815260040160405180910390fd5b600282018054611ba390600190612743565b81548110611bb357611bb361272d565b9060005260206000200154826002018581548110611bd357611bd361272d565b6000918252602082200191909155600c54600d908290611bf590600190612743565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611c3457611c34612974565b600190038181906000526020600020016000905590558060010154826003016000828254611c629190612743565b90915550506001810154600a8054600090611c7e908490612743565b90915550506001810154604051339180156108fc02916000818181858888f19350505050158015611480573d6000803e3d6000fd5b303314611cd357604051630b2db9b760e31b815260040160405180910390fd5b600c805460009190611ce790600190612743565b81548110611cf757611cf761272d565b906000526020600020906006020160050154905080600654611d199190612714565b600954611d269042612743565b1115611d455760405163d5ac976d60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0385161790556001611d6c83826127a7565b50505050565b303314611d9257604051630b2db9b760e31b815260040160405180910390fd5b6003546040516312a6505d60e21b81526001600160a01b0390911690634a99417490611dc4908590859060040161298a565b6020604051808303816000875af1158015611de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0791906126e5565b6004555050565b303314611e2e57604051630b2db9b760e31b815260040160405180910390fd5b600755565b600080600b8381548110611e4957611e4961272d565b60009182526020909120600260089092020101549392505050565b6040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015611e9357505050565b806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ece57600080fd5b505af1158015611ee2573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018790528516935063a9059cbb92506044019050600060405180830381600087803b158015611f3257600080fd5b505af1158015611f46573d6000803e3d6000fd5b50505050505050565b6040518060c001604052806000815260200160008152602001606081526020016000815260200160006002811115611f8957611f89612178565b8152602001600081525090565b6000815180845260005b81811015611fbc57602081850181015186830182015201611fa0565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611fef6020830184611f96565b9392505050565b60006020828403121561200857600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156120475783518352928401929184019160010161202b565b50909695505050505050565b6000806040838503121561206657600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156121295761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d0152612109828d0182611f96565b9287015115159b87019b909b5250985095890195918901916001016120d0565b5050505060608901516080890152608089015160a089015260a0890151955061215660c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b600381106121ac57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b8083101561220d57835182529284019260019290920191908401906121ed565b50606087015160808701526080870151935061222c60a087018561218e565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561228157612281612243565b604052919050565b60006001600160401b038211156122a2576122a2612243565b5060051b60200190565b6001600160a01b03811681146122c157600080fd5b50565b600082601f8301126122d557600080fd5b813560206122ea6122e583612289565b612259565b8083825260208201915060208460051b87010193508684111561230c57600080fd5b602086015b84811015612331578035612324816122ac565b8352918301918301612311565b509695505050505050565b600082601f83011261234d57600080fd5b8135602061235d6122e583612289565b8083825260208201915060208460051b87010193508684111561237f57600080fd5b602086015b848110156123315780358352918301918301612384565b600082601f8301126123ac57600080fd5b81356001600160401b038111156123c5576123c5612243565b6123d8601f8201601f1916602001612259565b8181528460208386010111156123ed57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561242257600080fd5b85356001600160401b038082111561243957600080fd5b61244589838a016122c4565b9650602088013591508082111561245b57600080fd5b61246789838a0161233c565b9550604088013591508082111561247d57600080fd5b61248989838a0161239b565b9450606088013591508082111561249f57600080fd5b6124ab89838a0161233c565b935060808801359150808211156124c157600080fd5b506124ce8882890161239b565b9150509295509295909350565b6000806000606084860312156124f057600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a08101612529606083018561218e565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006125606080830185611f96565b9050821515606083015295945050505050565b6000806040838503121561258657600080fd5b8235612591816122ac565b915060208301356001600160401b038111156125ac57600080fd5b6125b88582860161239b565b9150509250929050565b600080604083850312156125d557600080fd5b82356001600160401b03808211156125ec57600080fd5b6125f88683870161239b565b9350602085013591508082111561260e57600080fd5b506125b88582860161239b565b600181811c9082168061262f57607f821691505b60208210810361264f57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546126628161261b565b80855260206001838116801561267f5760018114612699576126c7565b60ff1985168884015283151560051b8801830195506126c7565b866000528260002060005b858110156126bf5781548a82018601529083019084016126a4565b890184019650505b505050505092915050565b602081526000611fef6020830184612655565b6000602082840312156126f757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115612727576127276126fe565b92915050565b634e487b7160e01b600052603260045260246000fd5b81810381811115612727576127276126fe565b601f8211156127a2576000816000526020600020601f850160051c8101602086101561277f5750805b601f850160051c820191505b8181101561279e5782815560010161278b565b5050505b505050565b81516001600160401b038111156127c0576127c0612243565b6127d4816127ce845461261b565b84612756565b602080601f83116001811461280957600084156127f15750858301515b600019600386901b1c1916600185901b17855561279e565b600085815260208120601f198616915b8281101561283857888601518255948401946001909101908401612819565b50858210156128565787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081546128738161261b565b6001828116801561288b57600181146128a0576128cf565b60ff19841687528215158302870194506128cf565b8560005260208060002060005b858110156128c65781548a8201529084019082016128ad565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b16815282601482015260006129036034830184612866565b95945050505050565b6000611fef8284612866565b60006001820161292a5761292a6126fe565b5060010190565b82815260406020820152600061294a6040830184612655565b949350505050565b60008261296f57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b60608152600060608201526080602082015260006129ab6080830185611f96565b82810360408401526129038185611f9656fea26469706673582212203eb0ce20128709ce0e25d07609542c5c1fd2df8b0d773b52b6377b98d8fada1f64736f6c63430008180033", - "deployedBytecode": "0x6080604052600436106101b25760003560e01c806383c4b7a3116100ed578063b6cd08c611610090578063b6cd08c614610519578063b6dc775414610539578063ba7079ca1461054e578063bb0b86ff1461056e578063c4bd851914610584578063c5d552881461059a578063cc2bcdb4146105ba578063dc17bbdb146105da578063f730c07f146105fa57600080fd5b806383c4b7a3146103d75780639244c70414610408578063953d66511461041d5780639c15d1a21461043d578063a0af81f014610453578063a3c595c914610473578063ad73349e146104a3578063b51257001461050457600080fd5b80633e8686cc116101555780633e8686cc146102e9578063402ff0db1461031657806346047838146103435780636c0b7e71146103565780636cc6cde11461036b5780636cf39c2b1461038b57806377b9fda8146103ab5780637aa77f29146103c157600080fd5b80630c7ac7b6146101be5780631b1f5e7b146101e957806321cea5381461020c57806322b52d6614610239578063246c76df1461024f57806324baacc7146102715780632d68efc914610291578063311a6c56146102c957600080fd5b366101b957005b600080fd5b3480156101ca57600080fd5b506101d3610610565b6040516101e09190611fdc565b60405180910390f35b3480156101f557600080fd5b506101fe61069e565b6040519081526020016101e0565b34801561021857600080fd5b5061022c610227366004611ff6565b610723565b6040516101e0919061200f565b34801561024557600080fd5b506101fe60075481565b34801561025b57600080fd5b5061026f61026a366004611ff6565b6107a5565b005b34801561027d57600080fd5b5061026f61028c366004611ff6565b6107ca565b34801561029d57600080fd5b506002546102b1906001600160a01b031681565b6040516001600160a01b0390911681526020016101e0565b3480156102d557600080fd5b5061026f6102e4366004612053565b6107ef565b3480156102f557600080fd5b50610309610304366004611ff6565b6109c1565b6040516101e09190612075565b34801561032257600080fd5b50610336610331366004611ff6565b610bbc565b6040516101e091906121b0565b61026f61035136600461240a565b610caa565b34801561036257600080fd5b506101fe6112b1565b34801561037757600080fd5b506000546102b1906001600160a01b031681565b34801561039757600080fd5b5061026f6103a63660046124db565b6112c3565b3480156103b757600080fd5b506101fe600a5481565b3480156103cd57600080fd5b506101fe60045481565b3480156103e357600080fd5b506103f76103f2366004611ff6565b611487565b6040516101e0959493929190612507565b34801561041457600080fd5b5061026f6114ce565b34801561042957600080fd5b5061026f610438366004611ff6565b611841565b34801561044957600080fd5b506101fe60085481565b34801561045f57600080fd5b506003546102b1906001600160a01b031681565b34801561047f57600080fd5b5061049361048e366004612053565b6118d9565b6040516101e09493929190612539565b3480156104af57600080fd5b506104c36104be366004611ff6565b6119f3565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101e0565b34801561051057600080fd5b506101fe611a4f565b34801561052557600080fd5b5061026f610534366004612053565b611a5f565b34801561054557600080fd5b50600b546101fe565b34801561055a57600080fd5b5061026f610569366004612573565b611cb3565b34801561057a57600080fd5b506101fe60055481565b34801561059057600080fd5b506101fe60065481565b3480156105a657600080fd5b5061026f6105b53660046125c2565b611d72565b3480156105c657600080fd5b5061026f6105d5366004611ff6565b611e0e565b3480156105e657600080fd5b506101fe6105f5366004611ff6565b611e33565b34801561060657600080fd5b506101fe60095481565b6001805461061d9061261b565b80601f01602080910402602001604051908101604052809291908181526020018280546106499061261b565b80156106965780601f1061066b57610100808354040283529160200191610696565b820191906000526020600020905b81548152906001019060200180831161067957829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea9906106d0906001906004016126d2565b602060405180830381865afa1580156106ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071191906126e5565b60055461071e9190612714565b905090565b60606000600c838154811061073a5761073a61272d565b906000526020600020906006020190508060020180548060200260200160405190810160405280929190818152602001828054801561079857602002820191906000526020600020905b815481526020019060010190808311610784575b5050505050915050919050565b3033146107c557604051630b2db9b760e31b815260040160405180910390fd5b600855565b3033146107ea57604051630b2db9b760e31b815260040160405180910390fd5b600555565b600c80546000919061080390600190612743565b815481106108135761081361272d565b600091825260208220915460069190910290910191506001600160a01b031633146108515760405163381a2cb560e11b815260040160405180910390fd5b6001600482015460ff16600281111561086c5761086c612178565b1461088a576040516310cec38560e21b815260040160405180910390fd5b60028101548211156108af57604051631f6edbfd60e01b815260040160405180910390fd5b811561093f576000600b600283016108c8600186612743565b815481106108d8576108d861272d565b9060005260206000200154815481106108f3576108f361272d565b600091825260209091206005600890920201908101805460ff191660011790554260068201556003830154600254825492935061093d926001600160a01b03908116929116611e64565b505b8060030154600a60008282546109559190612743565b90915550506000600382018190554260095560048201805460ff19166002179055828255600c805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a1760405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600b8281548110610a2a57610a2a61272d565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610b76576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610ad39061261b565b80601f0160208091040260200160405190810160405280929190818152602001828054610aff9061261b565b8015610b4c5780601f10610b2157610100808354040283529160200191610b4c565b820191906000526020600020905b815481529060010190602001808311610b2f57829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610a80565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610bc4611f4f565b600c8281548110610bd757610bd761272d565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610c5357602002820191906000526020600020905b815481526020019060010190808311610c3f575b505050918352505060038201546020820152600482015460409091019060ff166002811115610c8457610c84612178565b6002811115610c9557610c95612178565b81526020016005820154815250509050919050565b600c805460009190610cbe90600190612743565b81548110610cce57610cce61272d565b906000526020600020906006020160050154905080600654610cf09190612714565b600954610cfd9042612743565b1115610d1c5760405163d5ac976d60e01b815260040160405180910390fd5b8451865114610d3e57604051638f32290560e01b815260040160405180910390fd5b8251865114610d6057604051633222108360e01b815260040160405180910390fd5b600c805460009190610d7490600190612743565b81548110610d8457610d8461272d565b60009182526020808320600b8054600181018255945260089093027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610e17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3b91906126e5565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610e71906001906004016126d2565b602060405180830381865afa158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb291906126e5565b600554610ebf9190612714565b60018201819055341015610ee65760405163070f6eed60e11b815260040160405180910390fd5b60008080805b8b518110156110f2576000898281518110610f0957610f0961272d565b60200260200101516001600160401b03811115610f2857610f28612243565b6040519080825280601f01601f191660200182016040528015610f52576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110610f8757610f8761272d565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d9084908110610fc057610fc061272d565b6020026020010151816001018190555060005b8b8481518110610fe557610fe561272d565b602002602001015181101561104b578c610fff8287612714565b8151811061100f5761100f61272d565b602001015160f81c60f81b83828151811061102c5761102c61272d565b60200101906001600160f81b031916908160001a905350600101610fd3565b506002810161105a83826127a7565b508a838151811061106d5761106d61272d565b6020026020010151846110809190612714565b815460018301546040519296506110aa926001600160a01b039092169160028501906020016128d9565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610eec565b50600c54600d9060009061110890600190612743565b81526020808201929092526040908101600090812086825290925290205460ff166111465760405163607cb3e760e01b815260040160405180910390fd5b6001600d60006001600c8054905061115e9190612743565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916111b2908490612714565b9091555050600b5460028601906111cb90600190612743565b815460018181018455600093845260209093200155600286015490036111fe576009546111f89042612743565b60058601555b600c5461120d90600190612743565b600b54339061121e90600190612743565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a60405161124d9190611fdc565b60405180910390a460008460010154346112679190612743565b905080156112885760025461128890339083906001600160a01b0316611e64565b8460010154600a600082825461129e9190612714565b9091555050505050505050505050505050565b600c5460009061071e90600190612743565b6000600b84815481106112d8576112d861272d565b60009182526020909120600890910201600581015490915060ff1661130f5760405162325f4560e91b815260040160405180910390fd5b60075460068201546113219042612743565b111561134057604051638b349aa560e01b815260040160405180910390fd5b825b600282015481108015611365575082158061136557506113628385612714565b81105b156114805760008260020182815481106113815761138161272d565b90600052602060002090600402019050600061139b611a4f565b600383015490915060ff161580156113b7575080826001015411155b1561146b57815460018301546040516000926001600160a01b031691906113e290600287019061290c565b60006040518083038185875af1925050503d806000811461141f576040519150601f19603f3d011682016040523d82523d6000602084013e611424565b606091505b509091505080151560010361146957600383015460ff161561145957604051630dc1019760e01b815260040160405180910390fd5b60038301805460ff191660011790555b505b5050808061147890612918565b915050611342565b5050505050565b600c818154811061149757600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600c8054600091906114e290600190612743565b815481106114f2576114f261272d565b9060005260206000209060060201600501549050806006546115149190612714565b6009546115219042612743565b1161153f57604051631875ed4760e21b815260040160405180910390fd5b600c80546000919061155390600190612743565b815481106115635761156361272d565b6000918252602082206006909102019150600482015460ff16600281111561158d5761158d612178565b146115ab576040516304ee891b60e11b815260040160405180910390fd5b60028101546000036115d85742600955600401805460ff1916600217905550600c80546001018155600052565b60028101546001036116a7576000600b826002016000815481106115fe576115fe61272d565b9060005260206000200154815481106116195761161961272d565b6000918252602082206005600890920201908101805460ff191660011790554260068201556003840180549290556002548154919350611667916001600160a01b0390811691849116611e64565b4260095560048301805460ff19166002179055600c805460010181556000908152600a805483929061169a908490612743565b9091555061183d92505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926116e992016126d2565b602060405180830381865afa158015611706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172a91906126e5565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e19184916117669190600190600401612931565b60206040518083038185885af1158015611784573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117a991906126e5565b6001830155600382015481106117c05760006117d0565b8082600301546117d09190612743565b6003830155600a5481106117e55760006117f3565b80600a546117f39190612743565b600a5560018201546000546004546040519081526001600160a01b03909116907fee1017dcbefba87397fcdaab31f187328533572b6a5568177fa2eb64026003b6906020016109b4565b5050565b30331461186157604051630b2db9b760e31b815260040160405180910390fd5b600c80546000919061187590600190612743565b815481106118855761188561272d565b9060005260206000209060060201600501549050806006546118a79190612714565b6009546118b49042612743565b11156118d35760405163d5ac976d60e01b815260040160405180910390fd5b50600655565b6000806060600080600b87815481106118f4576118f461272d565b90600052602060002090600802019050600081600201878154811061191b5761191b61272d565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff9091169082906119609061261b565b80601f016020809104026020016040519081016040528092919081815260200182805461198c9061261b565b80156119d95780601f106119ae576101008083540402835291602001916119d9565b820191906000526020600020905b8154815290600101906020018083116119bc57829003601f168201915b505050505091509550955095509550505092959194509250565b600b8181548110611a0357600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600a544761071e9190612743565b600c805460009190611a7390600190612743565b81548110611a8357611a8361272d565b906000526020600020906006020190506000600b826002018581548110611aac57611aac61272d565b906000526020600020015481548110611ac757611ac761272d565b906000526020600020906008020190506002600654611ae69190612952565b600954611af39042612743565b1115611b125760405163383f4af360e21b815260040160405180910390fd5b82816003015414611b36576040516306e671b760e31b815260040160405180910390fd5b80546001600160a01b03163314611b605760405163415360c560e11b815260040160405180910390fd5b6008546004820154611b729042612743565b1115611b915760405163603c988d60e11b815260040160405180910390fd5b600282018054611ba390600190612743565b81548110611bb357611bb361272d565b9060005260206000200154826002018581548110611bd357611bd361272d565b6000918252602082200191909155600c54600d908290611bf590600190612743565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611c3457611c34612974565b600190038181906000526020600020016000905590558060010154826003016000828254611c629190612743565b90915550506001810154600a8054600090611c7e908490612743565b90915550506001810154604051339180156108fc02916000818181858888f19350505050158015611480573d6000803e3d6000fd5b303314611cd357604051630b2db9b760e31b815260040160405180910390fd5b600c805460009190611ce790600190612743565b81548110611cf757611cf761272d565b906000526020600020906006020160050154905080600654611d199190612714565b600954611d269042612743565b1115611d455760405163d5ac976d60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0385161790556001611d6c83826127a7565b50505050565b303314611d9257604051630b2db9b760e31b815260040160405180910390fd5b6003546040516312a6505d60e21b81526001600160a01b0390911690634a99417490611dc4908590859060040161298a565b6020604051808303816000875af1158015611de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0791906126e5565b6004555050565b303314611e2e57604051630b2db9b760e31b815260040160405180910390fd5b600755565b600080600b8381548110611e4957611e4961272d565b60009182526020909120600260089092020101549392505050565b6040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015611e9357505050565b806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ece57600080fd5b505af1158015611ee2573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018790528516935063a9059cbb92506044019050600060405180830381600087803b158015611f3257600080fd5b505af1158015611f46573d6000803e3d6000fd5b50505050505050565b6040518060c001604052806000815260200160008152602001606081526020016000815260200160006002811115611f8957611f89612178565b8152602001600081525090565b6000815180845260005b81811015611fbc57602081850181015186830182015201611fa0565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611fef6020830184611f96565b9392505050565b60006020828403121561200857600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156120475783518352928401929184019160010161202b565b50909695505050505050565b6000806040838503121561206657600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156121295761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d0152612109828d0182611f96565b9287015115159b87019b909b5250985095890195918901916001016120d0565b5050505060608901516080890152608089015160a089015260a0890151955061215660c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b600381106121ac57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b8083101561220d57835182529284019260019290920191908401906121ed565b50606087015160808701526080870151935061222c60a087018561218e565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561228157612281612243565b604052919050565b60006001600160401b038211156122a2576122a2612243565b5060051b60200190565b6001600160a01b03811681146122c157600080fd5b50565b600082601f8301126122d557600080fd5b813560206122ea6122e583612289565b612259565b8083825260208201915060208460051b87010193508684111561230c57600080fd5b602086015b84811015612331578035612324816122ac565b8352918301918301612311565b509695505050505050565b600082601f83011261234d57600080fd5b8135602061235d6122e583612289565b8083825260208201915060208460051b87010193508684111561237f57600080fd5b602086015b848110156123315780358352918301918301612384565b600082601f8301126123ac57600080fd5b81356001600160401b038111156123c5576123c5612243565b6123d8601f8201601f1916602001612259565b8181528460208386010111156123ed57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561242257600080fd5b85356001600160401b038082111561243957600080fd5b61244589838a016122c4565b9650602088013591508082111561245b57600080fd5b61246789838a0161233c565b9550604088013591508082111561247d57600080fd5b61248989838a0161239b565b9450606088013591508082111561249f57600080fd5b6124ab89838a0161233c565b935060808801359150808211156124c157600080fd5b506124ce8882890161239b565b9150509295509295909350565b6000806000606084860312156124f057600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a08101612529606083018561218e565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006125606080830185611f96565b9050821515606083015295945050505050565b6000806040838503121561258657600080fd5b8235612591816122ac565b915060208301356001600160401b038111156125ac57600080fd5b6125b88582860161239b565b9150509250929050565b600080604083850312156125d557600080fd5b82356001600160401b03808211156125ec57600080fd5b6125f88683870161239b565b9350602085013591508082111561260e57600080fd5b506125b88582860161239b565b600181811c9082168061262f57607f821691505b60208210810361264f57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546126628161261b565b80855260206001838116801561267f5760018114612699576126c7565b60ff1985168884015283151560051b8801830195506126c7565b866000528260002060005b858110156126bf5781548a82018601529083019084016126a4565b890184019650505b505050505092915050565b602081526000611fef6020830184612655565b6000602082840312156126f757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115612727576127276126fe565b92915050565b634e487b7160e01b600052603260045260246000fd5b81810381811115612727576127276126fe565b601f8211156127a2576000816000526020600020601f850160051c8101602086101561277f5750805b601f850160051c820191505b8181101561279e5782815560010161278b565b5050505b505050565b81516001600160401b038111156127c0576127c0612243565b6127d4816127ce845461261b565b84612756565b602080601f83116001811461280957600084156127f15750858301515b600019600386901b1c1916600185901b17855561279e565b600085815260208120601f198616915b8281101561283857888601518255948401946001909101908401612819565b50858210156128565787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081546128738161261b565b6001828116801561288b57600181146128a0576128cf565b60ff19841687528215158302870194506128cf565b8560005260208060002060005b858110156128c65781548a8201529084019082016128ad565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b16815282601482015260006129036034830184612866565b95945050505050565b6000611fef8284612866565b60006001820161292a5761292a6126fe565b5060010190565b82815260406020820152600061294a6040830184612655565b949350505050565b60008261296f57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b60608152600060608201526080602082015260006129ab6080830185611f96565b82810360408401526129038185611f9656fea26469706673582212203eb0ce20128709ce0e25d07609542c5c1fd2df8b0d773b52b6377b98d8fada1f64736f6c63430008180033", + "numDeployments": 25, + "solcInputHash": "cd6d9ab2234a0ebc82824f25c5ddf74e", + "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_arbitratorExtraData\",\"type\":\"bytes\"},{\"internalType\":\"contract IDisputeTemplateRegistry\",\"name\":\"_templateRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_templateData\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_templateDataMappings\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_submissionBaseDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_submissionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_executionTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_withdrawTimeout\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_wNative\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyDisputed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalTimeNotStarted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientDeposit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ListAlreadySubmitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotDisputed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyArbitratorAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySubmitterCanWithdraw\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerOnly\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RulingOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ShouldOnlyWithdrawInFirstHalf\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubmissionNotApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubmissionTimeHasEnded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TimeToExecuteHasPassed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WithdrawingTimeHasPassed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongInputTargetAndDatasize\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongInputTargetAndValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongListHash\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_arbitratorDisputeID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_templateId\",\"type\":\"uint256\"}],\"name\":\"DisputeRequest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_submitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_session\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"}],\"name\":\"ListSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_disputeID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_ruling\",\"type\":\"uint256\"}],\"name\":\"Ruling\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"arbitrator\",\"outputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"disputeID\",\"type\":\"uint256\"}],\"name\":\"arbitratorDisputeIDToSessionIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"sessionIndex\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"arbitratorExtraData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IArbitratorV2\",\"name\":\"_arbitrator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_arbitratorExtraData\",\"type\":\"bytes\"}],\"name\":\"changeArbitrator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_templateData\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_templateDataMappings\",\"type\":\"string\"}],\"name\":\"changeDisputeTemplate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_executionTimeout\",\"type\":\"uint256\"}],\"name\":\"changeExecutionTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionBaseDeposit\",\"type\":\"uint256\"}],\"name\":\"changeSubmissionDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionTimeout\",\"type\":\"uint256\"}],\"name\":\"changeSubmissionTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_withdrawTimeout\",\"type\":\"uint256\"}],\"name\":\"changeWithdrawTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executeSubmissions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_cursor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"executeTransactionList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentSessionNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpendableFunds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumberOfCreatedLists\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"}],\"name\":\"getNumberOfTransactions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"txCount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_sessionIndex\",\"type\":\"uint256\"}],\"name\":\"getSession\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"ruling\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"disputeID\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"submittedLists\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256\",\"name\":\"sumDeposit\",\"type\":\"uint256\"},{\"internalType\":\"enum KlerosGovernor.Status\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"durationOffset\",\"type\":\"uint256\"}],\"internalType\":\"struct KlerosGovernor.Session\",\"name\":\"_session\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listId\",\"type\":\"uint256\"}],\"name\":\"getSubmission\",\"outputs\":[{\"components\":[{\"internalType\":\"address payable\",\"name\":\"submitter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"executed\",\"type\":\"bool\"}],\"internalType\":\"struct KlerosGovernor.Transaction[]\",\"name\":\"txs\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes32\",\"name\":\"listHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"submissionTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"approvalTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"submissionBlock\",\"type\":\"uint256\"}],\"internalType\":\"struct KlerosGovernor.Submission\",\"name\":\"submission\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_session\",\"type\":\"uint256\"}],\"name\":\"getSubmittedLists\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"submittedLists\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalSubmissionDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_requiredDeposit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_transactionIndex\",\"type\":\"uint256\"}],\"name\":\"getTransactionInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"executed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastApprovalTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reservedETH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_disputeID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_ruling\",\"type\":\"uint256\"}],\"name\":\"rule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"sessions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ruling\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"disputeID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sumDeposit\",\"type\":\"uint256\"},{\"internalType\":\"enum KlerosGovernor.Status\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"durationOffset\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"submissionBaseDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"submissionTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"submissions\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"submitter\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"listHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"submissionTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"approvalTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"submissionBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_target\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_value\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"uint256[]\",\"name\":\"_dataSize\",\"type\":\"uint256[]\"},{\"internalType\":\"string\",\"name\":\"_description\",\"type\":\"string\"}],\"name\":\"submitList\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"templateId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"templateRegistry\",\"outputs\":[{\"internalType\":\"contract IDisputeTemplateRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wNative\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionID\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_listHash\",\"type\":\"bytes32\"}],\"name\":\"withdrawTransactionList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"Appeal and evidence submission is handled by the court.\",\"events\":{\"DisputeRequest(address,uint256,uint256)\":{\"params\":{\"_arbitrator\":\"The arbitrator of the contract.\",\"_arbitratorDisputeID\":\"The identifier of the dispute in the Arbitrator contract.\",\"_templateId\":\"The identifier of the dispute template.\"}},\"ListSubmitted(uint256,address,uint256,string)\":{\"params\":{\"_description\":\"The string in CSV format that contains labels of list's transactions. Note that the submitter may give bad descriptions of correct actions, but this is to be seen as UI enhancement, not a critical feature and that would play against him in case of dispute.\",\"_listID\":\"The index of the transaction list in the array of lists.\",\"_session\":\"The number of the current session.\",\"_submitter\":\"The address that submitted the list.\"}},\"Ruling(address,uint256,uint256)\":{\"params\":{\"_arbitrator\":\"The arbitrator giving the ruling.\",\"_disputeID\":\"The identifier of the dispute in the Arbitrator contract.\",\"_ruling\":\"The ruling which was given.\"}}},\"kind\":\"dev\",\"methods\":{\"changeArbitrator(address,bytes)\":{\"details\":\"It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract.\",\"params\":{\"_arbitrator\":\"The new trusted arbitrator.\",\"_arbitratorExtraData\":\"The extra data used by the new arbitrator.\"}},\"changeDisputeTemplate(string,string)\":{\"params\":{\"_templateData\":\"The new dispute template data.\",\"_templateDataMappings\":\"The new dispute template data mappings.\"}},\"changeExecutionTimeout(uint256)\":{\"params\":{\"_executionTimeout\":\"The new duration of the execution timeout, in seconds.\"}},\"changeSubmissionDeposit(uint256)\":{\"params\":{\"_submissionBaseDeposit\":\"The new value of the base deposit, in wei.\"}},\"changeSubmissionTimeout(uint256)\":{\"details\":\"It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract and prolonging submission timeout might switch it back to submission period.\",\"params\":{\"_submissionTimeout\":\"The new duration of the submission period, in seconds.\"}},\"changeWithdrawTimeout(uint256)\":{\"params\":{\"_withdrawTimeout\":\"The new duration of withdraw period, in seconds.\"}},\"constructor\":{\"params\":{\"_arbitrator\":\"The arbitrator of the contract.\",\"_arbitratorExtraData\":\"Extra data for the arbitrator.\",\"_executionTimeout\":\"Time in seconds after approval that allows to execute transactions of the approved list.\",\"_submissionBaseDeposit\":\"The base deposit required for submission.\",\"_submissionTimeout\":\"Time in seconds allocated for submitting transaction list.\",\"_templateData\":\"The dispute template data.\",\"_templateDataMappings\":\"The dispute template data mappings.\",\"_templateRegistry\":\"Dispute Template registry address\",\"_wNative\":\"The wrapped native token address, typically wETH.\",\"_withdrawTimeout\":\"Time in seconds after submission that allows to withdraw submitted list.\"}},\"executeSubmissions()\":{\"details\":\"If nothing was submitted changes session.\"},\"executeTransactionList(uint256,uint256,uint256)\":{\"params\":{\"_count\":\"Number of transactions to execute. Executes until the end if set to \\\"0\\\" or number higher than number of transactions in the list.\",\"_cursor\":\"Index of the transaction from which to start executing.\",\"_listID\":\"The index of the transaction list in the array of lists.\"}},\"getCurrentSessionNumber()\":{\"returns\":{\"_0\":\"The number of the ongoing session.\"}},\"getExpendableFunds()\":{\"returns\":{\"_0\":\"Contract balance without reserved ETH.\"}},\"getNumberOfCreatedLists()\":{\"returns\":{\"_0\":\"The number of created lists.\"}},\"getNumberOfTransactions(uint256)\":{\"params\":{\"_listID\":\"The index of the transaction list in the array of lists.\"},\"returns\":{\"txCount\":\"The number of transactions in the list.\"}},\"getSession(uint256)\":{\"returns\":{\"_session\":\"The session info.\"}},\"getSubmission(uint256)\":{\"params\":{\"_listId\":\"The index of the transaction list in the array of lists.\"},\"returns\":{\"submission\":\"List belonging to that listId.\"}},\"getSubmittedLists(uint256)\":{\"details\":\"This function is O(n), where `n` is the number of submissions in the session. This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts.\",\"params\":{\"_session\":\"The ID of the session.\"},\"returns\":{\"submittedLists\":\"Indexes of lists that were submitted during the session.\"}},\"getTotalSubmissionDeposit()\":{\"returns\":{\"_requiredDeposit\":\"required deposit value\"}},\"getTransactionInfo(uint256,uint256)\":{\"params\":{\"_listID\":\"The index of the transaction list in the array of lists.\",\"_transactionIndex\":\"The index of the transaction.\"},\"returns\":{\"data\":\"The data of the transaction.\",\"executed\":\"Whether the transaction was executed or not.\",\"target\":\"The target of the transaction.\",\"value\":\"The value of the transaction.\"}},\"rule(uint256,uint256)\":{\"details\":\"Must be called by the arbitrator.\",\"params\":{\"_disputeID\":\"ID of the dispute in the Arbitrator contract.\",\"_ruling\":\"Ruling given by the arbitrator. Note that 0 is reserved for \\\"Refuse to arbitrate\\\". Note If the final ruling is \\\"0\\\" nothing is approved and deposits will stay locked in the contract.\"}},\"submitList(address[],uint256[],bytes,uint256[],string)\":{\"params\":{\"_data\":\"Concatenated calldata of all transactions of this list.\",\"_dataSize\":\"List of lengths in bytes required to split calldata for its respective targets.\",\"_description\":\"String in CSV format that describes list's transactions.\",\"_target\":\"List of addresses to call.\",\"_value\":\"List of values required for respective addresses.\"}},\"withdrawTransactionList(uint256,bytes32)\":{\"details\":\"Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made.\",\"params\":{\"_listHash\":\"Hash of a withdrawing list.\",\"_submissionID\":\"Submission's index in the array of submitted lists of the current session.\"}}},\"title\":\"KlerosGovernor for V2.\",\"version\":1},\"userdoc\":{\"events\":{\"DisputeRequest(address,uint256,uint256)\":{\"notice\":\"To be emitted when a dispute is created to link the correct template to the disputeID.\"},\"ListSubmitted(uint256,address,uint256,string)\":{\"notice\":\"Emitted when a new list is submitted.\"},\"Ruling(address,uint256,uint256)\":{\"notice\":\"To be raised when a ruling is given.\"}},\"kind\":\"user\",\"methods\":{\"changeArbitrator(address,bytes)\":{\"notice\":\"Changes the arbitrator of the contract.\"},\"changeDisputeTemplate(string,string)\":{\"notice\":\"Update the dispute template data.\"},\"changeExecutionTimeout(uint256)\":{\"notice\":\"Changes the time allocated for list's execution.\"},\"changeSubmissionDeposit(uint256)\":{\"notice\":\"Changes the value of the base deposit required for submitting a list.\"},\"changeSubmissionTimeout(uint256)\":{\"notice\":\"Changes the time allocated for submission.\"},\"changeWithdrawTimeout(uint256)\":{\"notice\":\"Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period.\"},\"constructor\":{\"notice\":\"Constructor.\"},\"executeSubmissions()\":{\"notice\":\"Approves a transaction list or creates a dispute if more than one list was submitted.\"},\"executeTransactionList(uint256,uint256,uint256)\":{\"notice\":\"Executes selected transactions of the list.\"},\"getCurrentSessionNumber()\":{\"notice\":\"Gets the number of the ongoing session.\"},\"getExpendableFunds()\":{\"notice\":\"Gets the sum of contract funds that are used for the execution of transactions.\"},\"getNumberOfCreatedLists()\":{\"notice\":\"Gets the number of lists created in contract's lifetime.\"},\"getNumberOfTransactions(uint256)\":{\"notice\":\"Gets the number of transactions in the list.\"},\"getSession(uint256)\":{\"notice\":\"Gets the session from the session index.\"},\"getSubmission(uint256)\":{\"notice\":\"Gets the submission from listId.\"},\"getSubmittedLists(uint256)\":{\"notice\":\"Gets the array of submitted lists in the session.\"},\"getTotalSubmissionDeposit()\":{\"notice\":\"Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost).\"},\"getTransactionInfo(uint256,uint256)\":{\"notice\":\"Gets the info of the specific transaction in the specific list.\"},\"rule(uint256,uint256)\":{\"notice\":\"Gives a ruling for a dispute.\"},\"submitList(address[],uint256[],bytes,uint256[],string)\":{\"notice\":\"Creates transaction list based on input parameters and submits it for potential approval and execution.\"},\"withdrawTransactionList(uint256,bytes32)\":{\"notice\":\"Withdraws submitted transaction list. Reimburses submission deposit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/KlerosGovernor.sol\":\"KlerosGovernor\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[]},\"sources\":{\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport {IArbitratorV2} from \\\"./IArbitratorV2.sol\\\";\\n\\n/// @title IArbitrableV2\\n/// @notice Arbitrable interface.\\n/// @dev When developing arbitrable contracts, we need to:\\n/// - Define the action taken when a ruling is received by the contract.\\n/// - Allow dispute creation which calls `arbitrator.createDispute{value: _fee}(_choices,_extraData)`.\\ninterface IArbitrableV2 {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a dispute is created to link the correct template to the disputeID.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorDisputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _templateId The identifier of the dispute template.\\n event DisputeRequest(IArbitratorV2 indexed _arbitrator, uint256 indexed _arbitratorDisputeID, uint256 _templateId);\\n\\n /// @notice To be raised when a ruling is given.\\n /// @param _arbitrator The arbitrator giving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitratorV2 indexed _arbitrator, uint256 indexed _disputeID, uint256 _ruling);\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Give a ruling for a dispute.\\n ///\\n /// @dev This is a callback function for the arbitrator to provide the ruling to this contract.\\n /// Only the arbitrator must be allowed to call this function.\\n /// Ruling 0 is reserved for \\\"Not able/wanting to make a decision\\\".\\n ///\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator.\\n function rule(uint256 _disputeID, uint256 _ruling) external;\\n}\\n\",\"keccak256\":\"0x97c6455e4b9f57e76f338f43eea612ea47ac933dda85c08ef29d418e34879a9b\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitratorV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport {IArbitrableV2} from \\\"./IArbitrableV2.sol\\\";\\n\\n/// @title Arbitrator\\n/// @notice Arbitrator interface for the Kleros V2 protocol.\\n/// @dev Unlike the ERC-792 this standard is not concerned with appeals, so each arbitrator can implement an appeal system that suits it the most.\\ninterface IArbitratorV2 {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a dispute is created.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _arbitrable The contract which created the dispute.\\n event DisputeCreation(uint256 indexed _disputeID, IArbitrableV2 indexed _arbitrable);\\n\\n /// @notice To be raised when a ruling is given.\\n /// @param _arbitrable The arbitrable receiving the ruling.\\n /// @param _disputeID The identifier of the dispute in the Arbitrator contract.\\n /// @param _ruling The ruling which was given.\\n event Ruling(IArbitrableV2 indexed _arbitrable, uint256 indexed _disputeID, uint256 _ruling);\\n\\n /// @notice To be emitted when an ERC20 token is added or removed as a method to pay fees.\\n /// @param _token The ERC20 token.\\n /// @param _accepted Whether the token is accepted or not.\\n event AcceptedFeeToken(IERC20 indexed _token, bool indexed _accepted);\\n\\n /// @notice To be emitted when the fee for a particular ERC20 token is updated.\\n /// @param _feeToken The ERC20 token.\\n /// @param _rateInEth The new rate of the fee token in ETH.\\n /// @param _rateDecimals The new decimals of the fee token rate.\\n event NewCurrencyRate(IERC20 indexed _feeToken, uint64 _rateInEth, uint8 _rateDecimals);\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Create a dispute and pay for the fees in the native currency, typically ETH.\\n /// @dev Must be called by the arbitrable contract and pay at least `arbitrationCost(_extraData)` in ETH.\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData\\n ) external payable returns (uint256 disputeID);\\n\\n /// @notice Create a dispute and pay for the fees in a supported ERC20 token.\\n /// @dev Must be called by the arbitrable contract and pay at least `arbitrationCost(_extraData, _feeToken)` in the supported ERC20 token.\\n /// @param _numberOfChoices The number of choices the arbitrator can choose from in this dispute.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @param _feeAmount Amount of the ERC20 token used to pay fees.\\n /// @return disputeID The identifier of the dispute created.\\n function createDispute(\\n uint256 _numberOfChoices,\\n bytes calldata _extraData,\\n IERC20 _feeToken,\\n uint256 _feeAmount\\n ) external returns (uint256 disputeID);\\n\\n // ************************************* //\\n // * Public Views * //\\n // ************************************* //\\n\\n /// @notice Compute the cost of arbitration denominated in the native currency, typically ETH.\\n /// @dev It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @return cost The arbitration cost in ETH.\\n function arbitrationCost(bytes calldata _extraData) external view returns (uint256 cost);\\n\\n /// @notice Compute the cost of arbitration denominated in `_feeToken`.\\n /// @dev It is recommended not to increase it often, as it can be highly time and gas consuming for the arbitrated contracts to cope with fee augmentation.\\n /// @param _extraData Additional info about the dispute. We use it to pass the ID of the dispute's court (first 32 bytes), the minimum number of jurors required (next 32 bytes) and the ID of the specific dispute kit (last 32 bytes).\\n /// @param _feeToken The ERC20 token used to pay fees.\\n /// @return cost The arbitration cost in `_feeToken`.\\n function arbitrationCost(bytes calldata _extraData, IERC20 _feeToken) external view returns (uint256 cost);\\n\\n /// @notice Gets the current ruling of a specified dispute.\\n /// @param _disputeID The ID of the dispute.\\n /// @return ruling The current ruling.\\n /// @return tied Whether it's a tie or not.\\n /// @return overridden Whether the ruling was overridden by appeal funding or not.\\n function currentRuling(uint256 _disputeID) external view returns (uint256 ruling, bool tied, bool overridden);\\n}\\n\",\"keccak256\":\"0x1f4e84e23034f3a291e305e8c69f283c9c97354a49a24f8c02ca366b3eaae00f\",\"license\":\"MIT\"},\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0 <0.9.0;\\n\\n/// @title IDisputeTemplateRegistry\\n/// @notice Dispute Template Registry interface.\\ninterface IDisputeTemplateRegistry {\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice To be emitted when a new dispute template is created.\\n /// @param _templateId The identifier of the dispute template.\\n /// @param _templateTag An optional tag for the dispute template, such as \\\"registration\\\" or \\\"removal\\\".\\n /// @param _templateData The template data.\\n /// @param _templateDataMappings The data mappings.\\n event DisputeTemplate(\\n uint256 indexed _templateId,\\n string indexed _templateTag,\\n string _templateData,\\n string _templateDataMappings\\n );\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Registers a new dispute template.\\n /// @param _templateTag An optional tag for the dispute template, such as \\\"registration\\\" or \\\"removal\\\".\\n /// @param _templateData The template data.\\n /// @param _templateDataMappings The data mappings for the template.\\n /// @return templateId The identifier of the dispute template.\\n function setDisputeTemplate(\\n string memory _templateTag,\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external returns (uint256 templateId);\\n}\\n\",\"keccak256\":\"0x1d6ad6549baabcbfe306ac3a9a3c339bb2d5dcb67fa9f3c5eaed0c9bd3548b12\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC-20 standard as defined in the ERC.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the value of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the value of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n * caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 value) external returns (bool);\\n\\n /**\\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n * allowance mechanism. `value` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\"},\"src/KlerosGovernor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.24;\\n\\nimport {IArbitrableV2} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitrableV2.sol\\\";\\nimport {IArbitratorV2} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IArbitratorV2.sol\\\";\\nimport {\\n IDisputeTemplateRegistry\\n} from \\\"@kleros/kleros-v2-contracts/arbitration/interfaces/IDisputeTemplateRegistry.sol\\\";\\nimport {SafeSend} from \\\"./libraries/SafeSend.sol\\\";\\nimport {ArbSys} from \\\"./interfaces/IArbSys.sol\\\";\\n\\n/// @title KlerosGovernor for V2.\\n/// @dev Appeal and evidence submission is handled by the court.\\ncontract KlerosGovernor is IArbitrableV2 {\\n using SafeSend for address payable;\\n\\n // ************************************* //\\n // * Enums / Structs * //\\n // ************************************* //\\n\\n enum Status {\\n NoDispute,\\n DisputeCreated,\\n Resolved\\n }\\n\\n struct Session {\\n uint256 ruling; // The ruling that was given in this session, if any.\\n uint256 disputeID; // ID given to the dispute of the session, if any.\\n uint256[] submittedLists; // Tracks all lists that were submitted in a session in the form submittedLists[submissionID].\\n uint256 sumDeposit; // Sum of all submission deposits in a session (minus arbitration fees). This is used to calculate the reward.\\n Status status; // Status of a session.\\n uint256 durationOffset; // Time in seconds that prolongs the submission period after the first submission, to give other submitters time to react.\\n }\\n\\n struct Transaction {\\n address target; // The address to call.\\n uint256 value; // Value paid by governor contract that will be used as msg.value in the execution.\\n bytes data; // Calldata of the transaction.\\n bool executed; // Whether the transaction was already executed or not.\\n }\\n\\n struct Submission {\\n address payable submitter; // The one who submits the list.\\n uint256 deposit; // Value of the deposit paid upon submission of the list.\\n Transaction[] txs; // Transactions stored in the list in the form txs[_transactionIndex].\\n bytes32 listHash; // A hash chain of all transactions stored in the list. This is used as a unique identifier within a session.\\n uint256 submissionTime; // The time when the list was submitted.\\n bool approved; // Whether the list was approved for execution or not.\\n uint256 approvalTime; // The time when the list was approved.\\n uint256 submissionBlock; // Block of list submission.\\n }\\n\\n ArbSys constant arbSys = ArbSys(address(100)); // ArbSys implementation https://docs.arbitrum.io/build-decentralized-apps/precompiles/reference#arbsys\\n IArbitratorV2 public arbitrator; // Arbitrator contract.\\n bytes public arbitratorExtraData; // Extra data for arbitrator.\\n address public wNative; // The wrapped native token for safeSend().\\n IDisputeTemplateRegistry public templateRegistry; // The dispute template registry.\\n uint256 public templateId; // The current dispute template identifier.\\n\\n uint256 public submissionBaseDeposit; // The base deposit in wei that needs to be paid in order to submit the list.\\n uint256 public submissionTimeout; // Time in seconds allowed for submitting the lists. Once it's passed the contract enters the approval period.\\n uint256 public executionTimeout; // Time in seconds allowed for the execution of approved lists.\\n uint256 public withdrawTimeout; // Time in seconds allowed to withdraw a submitted list.\\n\\n uint256 public lastApprovalTime; // The time of the last approval of a transaction list.\\n uint256 public reservedETH; // Sum of contract's submission deposits. These funds are not to be used in the execution of transactions.\\n\\n Submission[] public submissions; // Stores all created transaction lists. submissions[_listID].\\n Session[] public sessions; // Stores all submitting sessions. sessions[_session].\\n mapping(uint256 sessionIndex => mapping(bytes32 listHash => bool)) alreadySubmitted; // Indicates whether or not the transaction list was already submitted in order to catch duplicates in the form alreadySubmitted[listHash].\\n mapping(uint256 disputeID => uint256 sessionIndex) public arbitratorDisputeIDToSessionIndex; // Maps core arbitrator's dispute ID to session index.\\n // ************************************* //\\n // * Function Modifiers * //\\n // ************************************* //\\n\\n modifier duringSubmissionPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n if (block.timestamp - lastApprovalTime > submissionTimeout + offset) revert SubmissionTimeHasEnded();\\n _;\\n }\\n\\n modifier duringApprovalPeriod() {\\n uint256 offset = sessions[sessions.length - 1].durationOffset;\\n if (block.timestamp - lastApprovalTime <= submissionTimeout + offset) revert ApprovalTimeNotStarted();\\n _;\\n }\\n\\n modifier onlyByOwner() {\\n if (address(this) != msg.sender) revert OwnerOnly();\\n _;\\n }\\n\\n // ************************************* //\\n // * Events * //\\n // ************************************* //\\n\\n /// @notice Emitted when a new list is submitted.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _submitter The address that submitted the list.\\n /// @param _session The number of the current session.\\n /// @param _description The string in CSV format that contains labels of list's transactions.\\n /// Note that the submitter may give bad descriptions of correct actions, but this is to be seen as UI enhancement, not a critical feature and that would play against him in case of dispute.\\n event ListSubmitted(\\n uint256 indexed _listID,\\n address indexed _submitter,\\n uint256 indexed _session,\\n string _description\\n );\\n\\n // ************************************* //\\n // * Constructor * //\\n // ************************************* //\\n\\n /// @notice Constructor.\\n /// @param _arbitrator The arbitrator of the contract.\\n /// @param _arbitratorExtraData Extra data for the arbitrator.\\n /// @param _templateRegistry Dispute Template registry address\\n /// @param _templateData The dispute template data.\\n /// @param _templateDataMappings The dispute template data mappings.\\n /// @param _submissionBaseDeposit The base deposit required for submission.\\n /// @param _submissionTimeout Time in seconds allocated for submitting transaction list.\\n /// @param _executionTimeout Time in seconds after approval that allows to execute transactions of the approved list.\\n /// @param _withdrawTimeout Time in seconds after submission that allows to withdraw submitted list.\\n /// @param _wNative The wrapped native token address, typically wETH.\\n constructor(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData,\\n IDisputeTemplateRegistry _templateRegistry,\\n string memory _templateData,\\n string memory _templateDataMappings,\\n uint256 _submissionBaseDeposit,\\n uint256 _submissionTimeout,\\n uint256 _executionTimeout,\\n uint256 _withdrawTimeout,\\n address _wNative\\n ) {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n wNative = _wNative;\\n\\n lastApprovalTime = block.timestamp;\\n submissionBaseDeposit = _submissionBaseDeposit;\\n submissionTimeout = _submissionTimeout;\\n executionTimeout = _executionTimeout;\\n withdrawTimeout = _withdrawTimeout;\\n sessions.push();\\n submissions.push();\\n\\n templateRegistry = _templateRegistry;\\n templateId = IDisputeTemplateRegistry(templateRegistry).setDisputeTemplate(\\n \\\"\\\",\\n _templateData,\\n _templateDataMappings\\n );\\n }\\n\\n // ************************************* //\\n // * Governance * //\\n // ************************************* //\\n\\n /// @notice Changes the value of the base deposit required for submitting a list.\\n /// @param _submissionBaseDeposit The new value of the base deposit, in wei.\\n function changeSubmissionDeposit(uint256 _submissionBaseDeposit) external onlyByOwner {\\n submissionBaseDeposit = _submissionBaseDeposit;\\n }\\n\\n /// @notice Changes the time allocated for submission.\\n /// @dev It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract\\n /// and prolonging submission timeout might switch it back to submission period.\\n /// @param _submissionTimeout The new duration of the submission period, in seconds.\\n function changeSubmissionTimeout(uint256 _submissionTimeout) external onlyByOwner duringSubmissionPeriod {\\n submissionTimeout = _submissionTimeout;\\n }\\n\\n /// @notice Changes the time allocated for list's execution.\\n /// @param _executionTimeout The new duration of the execution timeout, in seconds.\\n function changeExecutionTimeout(uint256 _executionTimeout) external onlyByOwner {\\n executionTimeout = _executionTimeout;\\n }\\n\\n /// @notice Changes list withdrawal timeout. Note that withdrawals are only possible in the first half of the submission period.\\n /// @param _withdrawTimeout The new duration of withdraw period, in seconds.\\n function changeWithdrawTimeout(uint256 _withdrawTimeout) external onlyByOwner {\\n withdrawTimeout = _withdrawTimeout;\\n }\\n\\n /// @notice Changes the arbitrator of the contract.\\n /// @dev It cannot be changed during approval period because there can be an active dispute in the old arbitrator contract.\\n /// @param _arbitrator The new trusted arbitrator.\\n /// @param _arbitratorExtraData The extra data used by the new arbitrator.\\n function changeArbitrator(\\n IArbitratorV2 _arbitrator,\\n bytes memory _arbitratorExtraData\\n ) external onlyByOwner duringSubmissionPeriod {\\n arbitrator = _arbitrator;\\n arbitratorExtraData = _arbitratorExtraData;\\n }\\n\\n /// @notice Update the dispute template data.\\n /// @param _templateData The new dispute template data.\\n /// @param _templateDataMappings The new dispute template data mappings.\\n function changeDisputeTemplate(\\n string memory _templateData,\\n string memory _templateDataMappings\\n ) external onlyByOwner {\\n templateId = templateRegistry.setDisputeTemplate(\\\"\\\", _templateData, _templateDataMappings);\\n }\\n\\n // ************************************* //\\n // * State Modifiers * //\\n // ************************************* //\\n\\n /// @notice Creates transaction list based on input parameters and submits it for potential approval and execution.\\n /// @param _target List of addresses to call.\\n /// @param _value List of values required for respective addresses.\\n /// @param _data Concatenated calldata of all transactions of this list.\\n /// @param _dataSize List of lengths in bytes required to split calldata for its respective targets.\\n /// @param _description String in CSV format that describes list's transactions.\\n function submitList(\\n address[] memory _target,\\n uint256[] memory _value,\\n bytes memory _data,\\n uint256[] memory _dataSize,\\n string memory _description\\n ) external payable duringSubmissionPeriod {\\n if (_target.length != _value.length) revert WrongInputTargetAndValue();\\n if (_target.length != _dataSize.length) revert WrongInputTargetAndDatasize();\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions.push();\\n submission.submitter = payable(msg.sender);\\n\\n // https://docs.arbitrum.io/build-decentralized-apps/arbitrum-vs-ethereum/block-numbers-and-time\\n submission.submissionBlock = arbSys.arbBlockNumber();\\n\\n // Do the assignment first to avoid creating a new variable and bypass a 'stack too deep' error.\\n submission.deposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n if (msg.value < submission.deposit) revert InsufficientDeposit();\\n\\n bytes32 listHash;\\n bytes32 currentTxHash;\\n uint256 readingPosition;\\n for (uint256 i = 0; i < _target.length; i++) {\\n bytes memory readData = new bytes(_dataSize[i]);\\n Transaction storage transaction = submission.txs.push();\\n transaction.target = _target[i];\\n transaction.value = _value[i];\\n for (uint256 j = 0; j < _dataSize[i]; j++) {\\n readData[j] = _data[readingPosition + j];\\n }\\n transaction.data = readData;\\n readingPosition += _dataSize[i];\\n currentTxHash = keccak256(abi.encodePacked(transaction.target, transaction.value, transaction.data));\\n listHash = keccak256(abi.encodePacked(currentTxHash, listHash));\\n }\\n if (alreadySubmitted[sessions.length - 1][listHash]) revert ListAlreadySubmitted();\\n alreadySubmitted[sessions.length - 1][listHash] = true;\\n submission.listHash = listHash;\\n submission.submissionTime = block.timestamp;\\n session.sumDeposit += submission.deposit;\\n session.submittedLists.push(submissions.length - 1);\\n if (session.submittedLists.length == 1) session.durationOffset = block.timestamp - lastApprovalTime;\\n\\n emit ListSubmitted(submissions.length - 1, msg.sender, sessions.length - 1, _description);\\n\\n uint256 remainder = msg.value - submission.deposit;\\n if (remainder > 0) payable(msg.sender).safeSend(remainder, wNative);\\n\\n reservedETH += submission.deposit;\\n }\\n\\n /// @notice Withdraws submitted transaction list. Reimburses submission deposit.\\n /// @dev Withdrawal is only possible during the first half of the submission period and during withdrawTimeout after the submission is made.\\n /// @param _submissionID Submission's index in the array of submitted lists of the current session.\\n /// @param _listHash Hash of a withdrawing list.\\n function withdrawTransactionList(uint256 _submissionID, bytes32 _listHash) external {\\n Session storage session = sessions[sessions.length - 1];\\n Submission storage submission = submissions[session.submittedLists[_submissionID]];\\n if (block.timestamp - lastApprovalTime > submissionTimeout / 2) revert ShouldOnlyWithdrawInFirstHalf();\\n // This is an extra check to prevent _submissionID linking to the wrong list because of index swap during withdrawal.\\n if (submission.listHash != _listHash) revert WrongListHash();\\n if (submission.submitter != msg.sender) revert OnlySubmitterCanWithdraw();\\n if (block.timestamp - submission.submissionTime > withdrawTimeout) revert WithdrawingTimeHasPassed();\\n session.submittedLists[_submissionID] = session.submittedLists[session.submittedLists.length - 1];\\n alreadySubmitted[sessions.length - 1][_listHash] = false;\\n session.submittedLists.pop();\\n session.sumDeposit -= submission.deposit;\\n reservedETH -= submission.deposit;\\n payable(msg.sender).transfer(submission.deposit);\\n }\\n\\n /// @notice Approves a transaction list or creates a dispute if more than one list was submitted.\\n /// @dev If nothing was submitted changes session.\\n function executeSubmissions() external duringApprovalPeriod {\\n Session storage session = sessions[sessions.length - 1];\\n if (session.status != Status.NoDispute) revert AlreadyDisputed();\\n if (session.submittedLists.length == 0) {\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n } else if (session.submittedLists.length == 1) {\\n Submission storage submission = submissions[session.submittedLists[0]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n uint256 sumDeposit = session.sumDeposit;\\n session.sumDeposit = 0;\\n submission.submitter.safeSend(sumDeposit, wNative);\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n sessions.push();\\n\\n reservedETH -= sumDeposit;\\n } else {\\n session.status = Status.DisputeCreated;\\n uint256 arbitrationCost = arbitrator.arbitrationCost(arbitratorExtraData);\\n session.disputeID = arbitrator.createDispute{value: arbitrationCost}(\\n session.submittedLists.length,\\n arbitratorExtraData\\n );\\n arbitratorDisputeIDToSessionIndex[session.disputeID] = sessions.length - 1;\\n // Check in case arbitration cost increased after the submission. It's unlikely that its increase won't be covered by the base deposit, but technically possible.\\n session.sumDeposit = session.sumDeposit > arbitrationCost ? session.sumDeposit - arbitrationCost : 0;\\n reservedETH = reservedETH > arbitrationCost ? reservedETH - arbitrationCost : 0;\\n emit DisputeRequest(arbitrator, session.disputeID, templateId);\\n }\\n }\\n\\n /// @notice Gives a ruling for a dispute.\\n /// @dev Must be called by the arbitrator.\\n /// @param _disputeID ID of the dispute in the Arbitrator contract.\\n /// @param _ruling Ruling given by the arbitrator. Note that 0 is reserved for \\\"Refuse to arbitrate\\\".\\n /// Note If the final ruling is \\\"0\\\" nothing is approved and deposits will stay locked in the contract.\\n function rule(uint256 _disputeID, uint256 _ruling) external override {\\n Session storage session = sessions[sessions.length - 1];\\n if (msg.sender != address(arbitrator)) revert OnlyArbitratorAllowed();\\n if (session.status != Status.DisputeCreated) revert NotDisputed();\\n if (_ruling > session.submittedLists.length) revert RulingOutOfBounds();\\n\\n if (_ruling != 0) {\\n Submission storage submission = submissions[session.submittedLists[_ruling - 1]];\\n submission.approved = true;\\n submission.approvalTime = block.timestamp;\\n submission.submitter.safeSend(session.sumDeposit, wNative);\\n }\\n // If the ruling is \\\"0\\\" the reserved funds of this session become expendable.\\n reservedETH -= session.sumDeposit;\\n\\n session.sumDeposit = 0;\\n lastApprovalTime = block.timestamp;\\n session.status = Status.Resolved;\\n session.ruling = _ruling;\\n sessions.push();\\n\\n emit Ruling(IArbitratorV2(msg.sender), _disputeID, _ruling);\\n }\\n\\n /// @notice Executes selected transactions of the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _cursor Index of the transaction from which to start executing.\\n /// @param _count Number of transactions to execute. Executes until the end if set to \\\"0\\\" or number higher than number of transactions in the list.\\n function executeTransactionList(uint256 _listID, uint256 _cursor, uint256 _count) external {\\n Submission storage submission = submissions[_listID];\\n if (!submission.approved) revert SubmissionNotApproved();\\n if (block.timestamp - submission.approvalTime > executionTimeout) revert TimeToExecuteHasPassed();\\n for (uint256 i = _cursor; i < submission.txs.length && (_count == 0 || i < _cursor + _count); i++) {\\n Transaction storage transaction = submission.txs[i];\\n uint256 expendableFunds = getExpendableFunds();\\n if (!transaction.executed && transaction.value <= expendableFunds) {\\n (bool callResult, ) = transaction.target.call{value: transaction.value}(transaction.data);\\n // An extra check to prevent re-entrancy through target call.\\n if (callResult == true) {\\n if (transaction.executed) revert AlreadyExecuted();\\n transaction.executed = true;\\n }\\n }\\n }\\n }\\n\\n /// @notice Receive function to receive funds for the execution of transactions.\\n receive() external payable {}\\n\\n /// @notice Gets the sum of contract funds that are used for the execution of transactions.\\n /// @return Contract balance without reserved ETH.\\n function getExpendableFunds() public view returns (uint256) {\\n return address(this).balance - reservedETH;\\n }\\n\\n /// @notice Gets the info of the specific transaction in the specific list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @param _transactionIndex The index of the transaction.\\n /// @return target The target of the transaction.\\n /// @return value The value of the transaction.\\n /// @return data The data of the transaction.\\n /// @return executed Whether the transaction was executed or not.\\n function getTransactionInfo(\\n uint256 _listID,\\n uint256 _transactionIndex\\n ) external view returns (address target, uint256 value, bytes memory data, bool executed) {\\n Submission storage submission = submissions[_listID];\\n Transaction storage transaction = submission.txs[_transactionIndex];\\n return (transaction.target, transaction.value, transaction.data, transaction.executed);\\n }\\n\\n /// @notice Gets the array of submitted lists in the session.\\n ///\\n /// @dev This function is O(n), where `n` is the number of submissions in the session.\\n /// This could exceed the gas limit, therefore this function should only be used for interface display and not by other contracts.\\n ///\\n /// @param _session The ID of the session.\\n /// @return submittedLists Indexes of lists that were submitted during the session.\\n function getSubmittedLists(uint256 _session) external view returns (uint256[] memory submittedLists) {\\n Session storage session = sessions[_session];\\n submittedLists = session.submittedLists;\\n }\\n\\n /// @notice Gets the submission from listId.\\n /// @param _listId The index of the transaction list in the array of lists.\\n /// @return submission List belonging to that listId.\\n function getSubmission(uint256 _listId) external view returns (Submission memory submission) {\\n submission = submissions[_listId];\\n }\\n\\n /// @notice Gets the number of transactions in the list.\\n /// @param _listID The index of the transaction list in the array of lists.\\n /// @return txCount The number of transactions in the list.\\n function getNumberOfTransactions(uint256 _listID) external view returns (uint256 txCount) {\\n Submission storage submission = submissions[_listID];\\n return submission.txs.length;\\n }\\n\\n /// @notice Gets the number of lists created in contract's lifetime.\\n /// @return The number of created lists.\\n function getNumberOfCreatedLists() external view returns (uint256) {\\n return submissions.length;\\n }\\n\\n /// @notice Gets the number of the ongoing session.\\n /// @return The number of the ongoing session.\\n function getCurrentSessionNumber() external view returns (uint256) {\\n return sessions.length - 1;\\n }\\n\\n /// @notice Gets the session from the session index.\\n /// @return _session The session info.\\n function getSession(uint256 _sessionIndex) external view returns (Session memory _session) {\\n _session = sessions[_sessionIndex];\\n }\\n\\n /// @notice Gets the total deposit required to submit a list. (submissionBaseDeposit + arbitrationCost).\\n /// @return _requiredDeposit required deposit value\\n function getTotalSubmissionDeposit() external view returns (uint256 _requiredDeposit) {\\n _requiredDeposit = submissionBaseDeposit + arbitrator.arbitrationCost(arbitratorExtraData);\\n }\\n\\n // ************************************* //\\n // * Errors * //\\n // ************************************* //\\n\\n error SubmissionTimeHasEnded();\\n error ApprovalTimeNotStarted();\\n error OwnerOnly();\\n error WrongInputTargetAndValue();\\n error WrongInputTargetAndDatasize();\\n error InsufficientDeposit();\\n error ListAlreadySubmitted();\\n error ShouldOnlyWithdrawInFirstHalf();\\n error WrongListHash();\\n error OnlySubmitterCanWithdraw();\\n error WithdrawingTimeHasPassed();\\n error AlreadyDisputed();\\n error OnlyArbitratorAllowed();\\n error NotDisputed();\\n error RulingOutOfBounds();\\n error SubmissionNotApproved();\\n error TimeToExecuteHasPassed();\\n error AlreadyExecuted();\\n}\\n\",\"keccak256\":\"0xc1ec951c9ae18c7e9f78cb45fe458cd3bb09217715e5a778f9aa0823979eb2fe\",\"license\":\"MIT\"},\"src/interfaces/IArbSys.sol\":{\"content\":\"// https://github.com/OffchainLabs/nitro-contracts/blob/bdb8f8c68b2229fe9309fe9c03b37017abd1a2cd/src/precompiles/ArbSys.sol\\n// Copyright 2021-2022, Offchain Labs, Inc.\\n// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE\\n// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity >=0.4.21 <0.9.0;\\n\\n/**\\n * @title System level functionality\\n * @notice For use by contracts to interact with core L2-specific functionality.\\n * Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064.\\n */\\ninterface ArbSys {\\n /**\\n * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0)\\n * @return block number as int\\n */\\n function arbBlockNumber() external view returns (uint256);\\n\\n /**\\n * @notice Get Arbitrum block hash (reverts unless currentBlockNum-256 <= arbBlockNum < currentBlockNum)\\n * @return block hash\\n */\\n function arbBlockHash(uint256 arbBlockNum) external view returns (bytes32);\\n\\n /**\\n * @notice Gets the rollup's unique chain identifier\\n * @return Chain identifier as int\\n */\\n function arbChainID() external view returns (uint256);\\n\\n /**\\n * @notice Get internal version number identifying an ArbOS build, this is `55 + nitroArbOS version number`\\n * e.g. on ArbOS 31 this would return 86. This is the only function that have the 55 offset.\\n * @return version number as int\\n */\\n function arbOSVersion() external view returns (uint256);\\n\\n /**\\n * @notice Returns 0 since Nitro has no concept of storage gas\\n * @return uint 0\\n */\\n function getStorageGasAvailable() external view returns (uint256);\\n\\n /**\\n * @notice (deprecated) check if current call is top level (meaning it was triggered by an EoA or a L1 contract)\\n * @dev this call has been deprecated and may be removed in a future release\\n * @return true if current execution frame is not a call by another L2 contract\\n */\\n function isTopLevelCall() external view returns (bool);\\n\\n /**\\n * @notice map L1 sender contract address to its L2 alias\\n * @param sender sender address\\n * @param unused argument no longer used\\n * @return aliased sender address\\n */\\n function mapL1SenderContractAddressToL2Alias(address sender, address unused) external pure returns (address);\\n\\n /**\\n * @notice check if the caller (of this caller of this) is an aliased L1 contract address\\n * @return true iff the caller's address is an alias for an L1 contract address\\n */\\n function wasMyCallersAddressAliased() external view returns (bool);\\n\\n /**\\n * @notice return the address of the caller (of this caller of this), without applying L1 contract address aliasing\\n * @return address of the caller's caller, without applying L1 contract address aliasing\\n */\\n function myCallersAddressWithoutAliasing() external view returns (address);\\n\\n /**\\n * @notice Send given amount of Eth to dest from sender.\\n * This is a convenience function, which is equivalent to calling sendTxToL1 with empty data.\\n * @param destination recipient address on L1\\n * @return unique identifier for this L2-to-L1 transaction.\\n */\\n function withdrawEth(address destination) external payable returns (uint256);\\n\\n /**\\n * @notice Send a transaction to L1\\n * @dev it is not possible to execute on the L1 any L2-to-L1 transaction which contains data\\n * to a contract address without any code (as enforced by the Bridge contract).\\n * @param destination recipient address on L1\\n * @param data (optional) calldata for L1 contract call\\n * @return a unique identifier for this L2-to-L1 transaction.\\n */\\n function sendTxToL1(address destination, bytes calldata data) external payable returns (uint256);\\n\\n /**\\n * @notice Get send Merkle tree state\\n * @return size number of sends in the history\\n * @return root root hash of the send history\\n * @return partials hashes of partial subtrees in the send history tree\\n */\\n function sendMerkleTreeState() external view returns (uint256 size, bytes32 root, bytes32[] memory partials);\\n\\n /**\\n * @notice creates a send txn from L2 to L1\\n * @param position = (level << 192) + leaf = (0 << 192) + leaf = leaf\\n */\\n event L2ToL1Tx(\\n address caller,\\n address indexed destination,\\n uint256 indexed hash,\\n uint256 indexed position,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /// @dev DEPRECATED in favour of the new L2ToL1Tx event above after the nitro upgrade\\n event L2ToL1Transaction(\\n address caller,\\n address indexed destination,\\n uint256 indexed uniqueId,\\n uint256 indexed batchNumber,\\n uint256 indexInBatch,\\n uint256 arbBlockNum,\\n uint256 ethBlockNum,\\n uint256 timestamp,\\n uint256 callvalue,\\n bytes data\\n );\\n\\n /**\\n * @notice logs a merkle branch for proof synthesis\\n * @param reserved an index meant only to align the 4th index with L2ToL1Transaction's 4th event\\n * @param hash the merkle hash\\n * @param position = (level << 192) + leaf\\n */\\n event SendMerkleUpdate(uint256 indexed reserved, bytes32 indexed hash, uint256 indexed position);\\n\\n error InvalidBlockNumber(uint256 requested, uint256 current);\\n}\\n\",\"keccak256\":\"0x9f2e1c9d8d19db1d3c6baa0549d14a68d09526764f4bd6f3bf030f0af7fd12fe\",\"license\":\"BUSL-1.1\"},\"src/libraries/SafeSend.sol\":{\"content\":\"/**\\n * @authors: [@andreimvp]\\n * @reviewers: [@divyangchauhan, @wadader, @fcanela, @unknownunknown1]\\n * @auditors: []\\n * @bounties: []\\n * SPDX-License-Identifier: MIT\\n */\\n\\npragma solidity ^0.8.24;\\n\\ninterface WethLike {\\n function deposit() external payable;\\n\\n function transfer(address dst, uint256 wad) external;\\n}\\n\\nlibrary SafeSend {\\n function safeSend(address payable _to, uint256 _value, address _wethLike) internal {\\n if (_to.send(_value)) return;\\n\\n WethLike(_wethLike).deposit{value: _value}();\\n WethLike(_wethLike).transfer(_to, _value); /// forge-lint: disable-line(erc20-unchecked-transfer)\\n }\\n}\\n\",\"keccak256\":\"0xd4d5b25d0eb7f7965ea7a9e3d3d6bc13368de9aaf882543a75dc9c57c85e9283\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b5060405162002f5e38038062002f5e833981016040819052620000349162000225565b600080546001600160a01b0319166001600160a01b038c1617905560016200005d8a82620003a9565b50600280546001600160a01b038084166001600160a01b031992831617909255426009556005879055600686905560078590556008849055600c80546001908101909155600b8054909101815560005260038054928b1692909116821790556040516312a6505d60e21b8152634a99417490620000e1908a908a90600401620004a3565b6020604051808303816000875af115801562000101573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001279190620004e3565b60045550620004fd98505050505050505050565b80516001600160a01b03811681146200015357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200018b57818101518382015260200162000171565b50506000910152565b600082601f830112620001a657600080fd5b81516001600160401b0380821115620001c357620001c362000158565b604051601f8301601f19908116603f01168101908282118183101715620001ee57620001ee62000158565b816040528381528660208588010111156200020857600080fd5b6200021b8460208301602089016200016e565b9695505050505050565b6000806000806000806000806000806101408b8d0312156200024657600080fd5b620002518b6200013b565b60208c0151909a506001600160401b03808211156200026f57600080fd5b6200027d8e838f0162000194565b9a506200028d60408e016200013b565b995060608d0151915080821115620002a457600080fd5b620002b28e838f0162000194565b985060808d0151915080821115620002c957600080fd5b50620002d88d828e0162000194565b96505060a08b0151945060c08b0151935060e08b015192506101008b01519150620003076101208c016200013b565b90509295989b9194979a5092959850565b600181811c908216806200032d57607f821691505b6020821081036200034e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a4576000816000526020600020601f850160051c810160208610156200037f5750805b601f850160051c820191505b81811015620003a0578281556001016200038b565b5050505b505050565b81516001600160401b03811115620003c557620003c562000158565b620003dd81620003d6845462000318565b8462000354565b602080601f831160018114620004155760008415620003fc5750858301515b600019600386901b1c1916600185901b178555620003a0565b600085815260208120601f198616915b82811015620004465788860151825594840194600190910190840162000425565b5085821015620004655787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081518084526200048f8160208601602086016200016e565b601f01601f19169290920160200192915050565b6060815260006060820152608060208201526000620004c6608083018562000475565b8281036040840152620004da818562000475565b95945050505050565b600060208284031215620004f657600080fd5b5051919050565b612a51806200050d6000396000f3fe6080604052600436106101bd5760003560e01c806383c4b7a3116100ed578063b6cd08c611610090578063b6cd08c614610551578063b6dc775414610571578063ba7079ca14610586578063bb0b86ff146105a6578063c4bd8519146105bc578063c5d55288146105d2578063cc2bcdb4146105f2578063dc17bbdb14610612578063f730c07f1461063257600080fd5b806383c4b7a31461040f5780639244c70414610440578063953d6651146104555780639c15d1a214610475578063a0af81f01461048b578063a3c595c9146104ab578063ad73349e146104db578063b51257001461053c57600080fd5b8063397c330f11610160578063397c330f146102f45780633e8686cc14610321578063402ff0db1461034e578063460478381461037b5780636c0b7e711461038e5780636cc6cde1146103a35780636cf39c2b146103c357806377b9fda8146103e35780637aa77f29146103f957600080fd5b80630c7ac7b6146101c95780631b1f5e7b146101f457806321cea5381461021757806322b52d6614610244578063246c76df1461025a57806324baacc71461027c5780632d68efc91461029c578063311a6c56146102d457600080fd5b366101c457005b600080fd5b3480156101d557600080fd5b506101de610648565b6040516101eb919061203a565b60405180910390f35b34801561020057600080fd5b506102096106d6565b6040519081526020016101eb565b34801561022357600080fd5b50610237610232366004612054565b61075b565b6040516101eb919061206d565b34801561025057600080fd5b5061020960075481565b34801561026657600080fd5b5061027a610275366004612054565b6107dd565b005b34801561028857600080fd5b5061027a610297366004612054565b610802565b3480156102a857600080fd5b506002546102bc906001600160a01b031681565b6040516001600160a01b0390911681526020016101eb565b3480156102e057600080fd5b5061027a6102ef3660046120b1565b610827565b34801561030057600080fd5b5061020961030f366004612054565b600e6020526000908152604090205481565b34801561032d57600080fd5b5061034161033c366004612054565b6109f9565b6040516101eb91906120d3565b34801561035a57600080fd5b5061036e610369366004612054565b610bf4565b6040516101eb919061220e565b61027a610389366004612468565b610ce2565b34801561039a57600080fd5b506102096112ea565b3480156103af57600080fd5b506000546102bc906001600160a01b031681565b3480156103cf57600080fd5b5061027a6103de366004612539565b6112fc565b3480156103ef57600080fd5b50610209600a5481565b34801561040557600080fd5b5061020960045481565b34801561041b57600080fd5b5061042f61042a366004612054565b6114c0565b6040516101eb959493929190612565565b34801561044c57600080fd5b5061027a611507565b34801561046157600080fd5b5061027a610470366004612054565b61189f565b34801561048157600080fd5b5061020960085481565b34801561049757600080fd5b506003546102bc906001600160a01b031681565b3480156104b757600080fd5b506104cb6104c63660046120b1565b611937565b6040516101eb9493929190612597565b3480156104e757600080fd5b506104fb6104f6366004612054565b611a51565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101eb565b34801561054857600080fd5b50610209611aad565b34801561055d57600080fd5b5061027a61056c3660046120b1565b611abd565b34801561057d57600080fd5b50600b54610209565b34801561059257600080fd5b5061027a6105a13660046125d1565b611d11565b3480156105b257600080fd5b5061020960055481565b3480156105c857600080fd5b5061020960065481565b3480156105de57600080fd5b5061027a6105ed366004612620565b611dd0565b3480156105fe57600080fd5b5061027a61060d366004612054565b611e6c565b34801561061e57600080fd5b5061020961062d366004612054565b611e91565b34801561063e57600080fd5b5061020960095481565b6001805461065590612679565b80601f016020809104026020016040519081016040528092919081815260200182805461068190612679565b80156106ce5780601f106106a3576101008083540402835291602001916106ce565b820191906000526020600020905b8154815290600101906020018083116106b157829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea99061070890600190600401612730565b602060405180830381865afa158015610725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107499190612743565b6005546107569190612772565b905090565b60606000600c83815481106107725761077261278b565b90600052602060002090600602019050806002018054806020026020016040519081016040528092919081815260200182805480156107d057602002820191906000526020600020905b8154815260200190600101908083116107bc575b5050505050915050919050565b3033146107fd57604051630b2db9b760e31b815260040160405180910390fd5b600855565b30331461082257604051630b2db9b760e31b815260040160405180910390fd5b600555565b600c80546000919061083b906001906127a1565b8154811061084b5761084b61278b565b600091825260208220915460069190910290910191506001600160a01b031633146108895760405163381a2cb560e11b815260040160405180910390fd5b6001600482015460ff1660028111156108a4576108a46121d6565b146108c2576040516310cec38560e21b815260040160405180910390fd5b60028101548211156108e757604051631f6edbfd60e01b815260040160405180910390fd5b8115610977576000600b600283016109006001866127a1565b815481106109105761091061278b565b90600052602060002001548154811061092b5761092b61278b565b600091825260209091206005600890920201908101805460ff1916600117905542600682015560038301546002548254929350610975926001600160a01b03908116929116611ec2565b505b8060030154600a600082825461098d91906127a1565b90915550506000600382018190554260095560048201805460ff19166002179055828255600c805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a4f60405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600b8281548110610a6257610a6261278b565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610bae576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610b0b90612679565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3790612679565b8015610b845780601f10610b5957610100808354040283529160200191610b84565b820191906000526020600020905b815481529060010190602001808311610b6757829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610ab8565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610bfc611fad565b600c8281548110610c0f57610c0f61278b565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610c8b57602002820191906000526020600020905b815481526020019060010190808311610c77575b505050918352505060038201546020820152600482015460409091019060ff166002811115610cbc57610cbc6121d6565b6002811115610ccd57610ccd6121d6565b81526020016005820154815250509050919050565b600c805460009190610cf6906001906127a1565b81548110610d0657610d0661278b565b906000526020600020906006020160050154905080600654610d289190612772565b600954610d3590426127a1565b1115610d545760405163d5ac976d60e01b815260040160405180910390fd5b8451865114610d7657604051638f32290560e01b815260040160405180910390fd5b8251865114610d9857604051633222108360e01b815260040160405180910390fd5b600c805460009190610dac906001906127a1565b81548110610dbc57610dbc61278b565b60009182526020808320600b8054600181018255945260089093027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610e4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e739190612743565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610ea990600190600401612730565b602060405180830381865afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea9190612743565b600554610ef79190612772565b60018201819055341015610f1e5760405163070f6eed60e11b815260040160405180910390fd5b60008080805b8b5181101561112a576000898281518110610f4157610f4161278b565b60200260200101516001600160401b03811115610f6057610f606122a1565b6040519080825280601f01601f191660200182016040528015610f8a576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110610fbf57610fbf61278b565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d9084908110610ff857610ff861278b565b6020026020010151816001018190555060005b8b848151811061101d5761101d61278b565b6020026020010151811015611083578c6110378287612772565b815181106110475761104761278b565b602001015160f81c60f81b8382815181106110645761106461278b565b60200101906001600160f81b031916908160001a90535060010161100b565b50600281016110928382612805565b508a83815181106110a5576110a561278b565b6020026020010151846110b89190612772565b815460018301546040519296506110e2926001600160a01b03909216916002850190602001612937565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610f24565b50600c54600d90600090611140906001906127a1565b81526020808201929092526040908101600090812086825290925290205460ff161561117f5760405163607cb3e760e01b815260040160405180910390fd5b6001600d60006001600c8054905061119791906127a1565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916111eb908490612772565b9091555050600b546002860190611204906001906127a1565b815460018181018455600093845260209093200155600286015490036112375760095461123190426127a1565b60058601555b600c54611246906001906127a1565b600b543390611257906001906127a1565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a604051611286919061203a565b60405180910390a460008460010154346112a091906127a1565b905080156112c1576002546112c190339083906001600160a01b0316611ec2565b8460010154600a60008282546112d79190612772565b9091555050505050505050505050505050565b600c54600090610756906001906127a1565b6000600b84815481106113115761131161278b565b60009182526020909120600890910201600581015490915060ff166113485760405162325f4560e91b815260040160405180910390fd5b600754600682015461135a90426127a1565b111561137957604051638b349aa560e01b815260040160405180910390fd5b825b60028201548110801561139e575082158061139e575061139b8385612772565b81105b156114b95760008260020182815481106113ba576113ba61278b565b9060005260206000209060040201905060006113d4611aad565b600383015490915060ff161580156113f0575080826001015411155b156114a457815460018301546040516000926001600160a01b0316919061141b90600287019061296a565b60006040518083038185875af1925050503d8060008114611458576040519150601f19603f3d011682016040523d82523d6000602084013e61145d565b606091505b50909150508015156001036114a257600383015460ff161561149257604051630dc1019760e01b815260040160405180910390fd5b60038301805460ff191660011790555b505b505080806114b190612976565b91505061137b565b5050505050565b600c81815481106114d057600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600c80546000919061151b906001906127a1565b8154811061152b5761152b61278b565b90600052602060002090600602016005015490508060065461154d9190612772565b60095461155a90426127a1565b1161157857604051631875ed4760e21b815260040160405180910390fd5b600c80546000919061158c906001906127a1565b8154811061159c5761159c61278b565b6000918252602082206006909102019150600482015460ff1660028111156115c6576115c66121d6565b146115e4576040516304ee891b60e11b815260040160405180910390fd5b60028101546000036116115742600955600401805460ff1916600217905550600c80546001018155600052565b60028101546001036116e0576000600b826002016000815481106116375761163761278b565b9060005260206000200154815481106116525761165261278b565b6000918252602082206005600890920201908101805460ff1916600117905542600682015560038401805492905560025481549193506116a0916001600160a01b0390811691849116611ec2565b4260095560048301805460ff19166002179055600c805460010181556000908152600a80548392906116d39084906127a1565b9091555061189b92505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926117229201612730565b602060405180830381865afa15801561173f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117639190612743565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e191849161179f919060019060040161298f565b60206040518083038185885af11580156117bd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117e29190612743565b600180840191909155600c546117f891906127a1565b60018301546000908152600e60205260409020556003820154811061181e57600061182e565b80826003015461182e91906127a1565b6003830155600a548110611843576000611851565b80600a5461185191906127a1565b600a5560018201546000546004546040519081526001600160a01b03909116907fee1017dcbefba87397fcdaab31f187328533572b6a5568177fa2eb64026003b6906020016109ec565b5050565b3033146118bf57604051630b2db9b760e31b815260040160405180910390fd5b600c8054600091906118d3906001906127a1565b815481106118e3576118e361278b565b9060005260206000209060060201600501549050806006546119059190612772565b60095461191290426127a1565b11156119315760405163d5ac976d60e01b815260040160405180910390fd5b50600655565b6000806060600080600b87815481106119525761195261278b565b9060005260206000209060080201905060008160020187815481106119795761197961278b565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff9091169082906119be90612679565b80601f01602080910402602001604051908101604052809291908181526020018280546119ea90612679565b8015611a375780601f10611a0c57610100808354040283529160200191611a37565b820191906000526020600020905b815481529060010190602001808311611a1a57829003601f168201915b505050505091509550955095509550505092959194509250565b600b8181548110611a6157600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600a544761075691906127a1565b600c805460009190611ad1906001906127a1565b81548110611ae157611ae161278b565b906000526020600020906006020190506000600b826002018581548110611b0a57611b0a61278b565b906000526020600020015481548110611b2557611b2561278b565b906000526020600020906008020190506002600654611b4491906129b0565b600954611b5190426127a1565b1115611b705760405163383f4af360e21b815260040160405180910390fd5b82816003015414611b94576040516306e671b760e31b815260040160405180910390fd5b80546001600160a01b03163314611bbe5760405163415360c560e11b815260040160405180910390fd5b6008546004820154611bd090426127a1565b1115611bef5760405163603c988d60e11b815260040160405180910390fd5b600282018054611c01906001906127a1565b81548110611c1157611c1161278b565b9060005260206000200154826002018581548110611c3157611c3161278b565b6000918252602082200191909155600c54600d908290611c53906001906127a1565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611c9257611c926129d2565b600190038181906000526020600020016000905590558060010154826003016000828254611cc091906127a1565b90915550506001810154600a8054600090611cdc9084906127a1565b90915550506001810154604051339180156108fc02916000818181858888f193505050501580156114b9573d6000803e3d6000fd5b303314611d3157604051630b2db9b760e31b815260040160405180910390fd5b600c805460009190611d45906001906127a1565b81548110611d5557611d5561278b565b906000526020600020906006020160050154905080600654611d779190612772565b600954611d8490426127a1565b1115611da35760405163d5ac976d60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0385161790556001611dca8382612805565b50505050565b303314611df057604051630b2db9b760e31b815260040160405180910390fd5b6003546040516312a6505d60e21b81526001600160a01b0390911690634a99417490611e2290859085906004016129e8565b6020604051808303816000875af1158015611e41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e659190612743565b6004555050565b303314611e8c57604051630b2db9b760e31b815260040160405180910390fd5b600755565b600080600b8381548110611ea757611ea761278b565b60009182526020909120600260089092020101549392505050565b6040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015611ef157505050565b806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f2c57600080fd5b505af1158015611f40573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018790528516935063a9059cbb92506044019050600060405180830381600087803b158015611f9057600080fd5b505af1158015611fa4573d6000803e3d6000fd5b50505050505050565b6040518060c001604052806000815260200160008152602001606081526020016000815260200160006002811115611fe757611fe76121d6565b8152602001600081525090565b6000815180845260005b8181101561201a57602081850181015186830182015201611ffe565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061204d6020830184611ff4565b9392505050565b60006020828403121561206657600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156120a557835183529284019291840191600101612089565b50909695505050505050565b600080604083850312156120c457600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156121875761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d0152612167828d0182611ff4565b9287015115159b87019b909b52509850958901959189019160010161212e565b5050505060608901516080890152608089015160a089015260a089015195506121b460c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b6003811061220a57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b8083101561226b578351825292840192600192909201919084019061224b565b50606087015160808701526080870151935061228a60a08701856121ec565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156122df576122df6122a1565b604052919050565b60006001600160401b03821115612300576123006122a1565b5060051b60200190565b6001600160a01b038116811461231f57600080fd5b50565b600082601f83011261233357600080fd5b81356020612348612343836122e7565b6122b7565b8083825260208201915060208460051b87010193508684111561236a57600080fd5b602086015b8481101561238f5780356123828161230a565b835291830191830161236f565b509695505050505050565b600082601f8301126123ab57600080fd5b813560206123bb612343836122e7565b8083825260208201915060208460051b8701019350868411156123dd57600080fd5b602086015b8481101561238f57803583529183019183016123e2565b600082601f83011261240a57600080fd5b81356001600160401b03811115612423576124236122a1565b612436601f8201601f19166020016122b7565b81815284602083860101111561244b57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561248057600080fd5b85356001600160401b038082111561249757600080fd5b6124a389838a01612322565b965060208801359150808211156124b957600080fd5b6124c589838a0161239a565b955060408801359150808211156124db57600080fd5b6124e789838a016123f9565b945060608801359150808211156124fd57600080fd5b61250989838a0161239a565b9350608088013591508082111561251f57600080fd5b5061252c888289016123f9565b9150509295509295909350565b60008060006060848603121561254e57600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a0810161258760608301856121ec565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006125be6080830185611ff4565b9050821515606083015295945050505050565b600080604083850312156125e457600080fd5b82356125ef8161230a565b915060208301356001600160401b0381111561260a57600080fd5b612616858286016123f9565b9150509250929050565b6000806040838503121561263357600080fd5b82356001600160401b038082111561264a57600080fd5b612656868387016123f9565b9350602085013591508082111561266c57600080fd5b50612616858286016123f9565b600181811c9082168061268d57607f821691505b6020821081036126ad57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546126c081612679565b8085526020600183811680156126dd57600181146126f757612725565b60ff1985168884015283151560051b880183019550612725565b866000528260002060005b8581101561271d5781548a8201860152908301908401612702565b890184019650505b505050505092915050565b60208152600061204d60208301846126b3565b60006020828403121561275557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156127855761278561275c565b92915050565b634e487b7160e01b600052603260045260246000fd5b818103818111156127855761278561275c565b601f821115612800576000816000526020600020601f850160051c810160208610156127dd5750805b601f850160051c820191505b818110156127fc578281556001016127e9565b5050505b505050565b81516001600160401b0381111561281e5761281e6122a1565b6128328161282c8454612679565b846127b4565b602080601f831160018114612867576000841561284f5750858301515b600019600386901b1c1916600185901b1785556127fc565b600085815260208120601f198616915b8281101561289657888601518255948401946001909101908401612877565b50858210156128b45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081546128d181612679565b600182811680156128e957600181146128fe5761292d565b60ff198416875282151583028701945061292d565b8560005260208060002060005b858110156129245781548a82015290840190820161290b565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b168152826014820152600061296160348301846128c4565b95945050505050565b600061204d82846128c4565b6000600182016129885761298861275c565b5060010190565b8281526040602082015260006129a860408301846126b3565b949350505050565b6000826129cd57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b6060815260006060820152608060208201526000612a096080830185611ff4565b82810360408401526129618185611ff456fea2646970667358221220f2b8282f42be09212ddb68862ebc46615235bf74de96255090619d9bb6ee9fbd64736f6c63430008180033", + "deployedBytecode": "0x6080604052600436106101bd5760003560e01c806383c4b7a3116100ed578063b6cd08c611610090578063b6cd08c614610551578063b6dc775414610571578063ba7079ca14610586578063bb0b86ff146105a6578063c4bd8519146105bc578063c5d55288146105d2578063cc2bcdb4146105f2578063dc17bbdb14610612578063f730c07f1461063257600080fd5b806383c4b7a31461040f5780639244c70414610440578063953d6651146104555780639c15d1a214610475578063a0af81f01461048b578063a3c595c9146104ab578063ad73349e146104db578063b51257001461053c57600080fd5b8063397c330f11610160578063397c330f146102f45780633e8686cc14610321578063402ff0db1461034e578063460478381461037b5780636c0b7e711461038e5780636cc6cde1146103a35780636cf39c2b146103c357806377b9fda8146103e35780637aa77f29146103f957600080fd5b80630c7ac7b6146101c95780631b1f5e7b146101f457806321cea5381461021757806322b52d6614610244578063246c76df1461025a57806324baacc71461027c5780632d68efc91461029c578063311a6c56146102d457600080fd5b366101c457005b600080fd5b3480156101d557600080fd5b506101de610648565b6040516101eb919061203a565b60405180910390f35b34801561020057600080fd5b506102096106d6565b6040519081526020016101eb565b34801561022357600080fd5b50610237610232366004612054565b61075b565b6040516101eb919061206d565b34801561025057600080fd5b5061020960075481565b34801561026657600080fd5b5061027a610275366004612054565b6107dd565b005b34801561028857600080fd5b5061027a610297366004612054565b610802565b3480156102a857600080fd5b506002546102bc906001600160a01b031681565b6040516001600160a01b0390911681526020016101eb565b3480156102e057600080fd5b5061027a6102ef3660046120b1565b610827565b34801561030057600080fd5b5061020961030f366004612054565b600e6020526000908152604090205481565b34801561032d57600080fd5b5061034161033c366004612054565b6109f9565b6040516101eb91906120d3565b34801561035a57600080fd5b5061036e610369366004612054565b610bf4565b6040516101eb919061220e565b61027a610389366004612468565b610ce2565b34801561039a57600080fd5b506102096112ea565b3480156103af57600080fd5b506000546102bc906001600160a01b031681565b3480156103cf57600080fd5b5061027a6103de366004612539565b6112fc565b3480156103ef57600080fd5b50610209600a5481565b34801561040557600080fd5b5061020960045481565b34801561041b57600080fd5b5061042f61042a366004612054565b6114c0565b6040516101eb959493929190612565565b34801561044c57600080fd5b5061027a611507565b34801561046157600080fd5b5061027a610470366004612054565b61189f565b34801561048157600080fd5b5061020960085481565b34801561049757600080fd5b506003546102bc906001600160a01b031681565b3480156104b757600080fd5b506104cb6104c63660046120b1565b611937565b6040516101eb9493929190612597565b3480156104e757600080fd5b506104fb6104f6366004612054565b611a51565b604080516001600160a01b03909816885260208801969096529486019390935260608501919091521515608084015260a083015260c082015260e0016101eb565b34801561054857600080fd5b50610209611aad565b34801561055d57600080fd5b5061027a61056c3660046120b1565b611abd565b34801561057d57600080fd5b50600b54610209565b34801561059257600080fd5b5061027a6105a13660046125d1565b611d11565b3480156105b257600080fd5b5061020960055481565b3480156105c857600080fd5b5061020960065481565b3480156105de57600080fd5b5061027a6105ed366004612620565b611dd0565b3480156105fe57600080fd5b5061027a61060d366004612054565b611e6c565b34801561061e57600080fd5b5061020961062d366004612054565b611e91565b34801561063e57600080fd5b5061020960095481565b6001805461065590612679565b80601f016020809104026020016040519081016040528092919081815260200182805461068190612679565b80156106ce5780601f106106a3576101008083540402835291602001916106ce565b820191906000526020600020905b8154815290600101906020018083116106b157829003601f168201915b505050505081565b6000805460405163f7434ea960e01b81526001600160a01b039091169063f7434ea99061070890600190600401612730565b602060405180830381865afa158015610725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107499190612743565b6005546107569190612772565b905090565b60606000600c83815481106107725761077261278b565b90600052602060002090600602019050806002018054806020026020016040519081016040528092919081815260200182805480156107d057602002820191906000526020600020905b8154815260200190600101908083116107bc575b5050505050915050919050565b3033146107fd57604051630b2db9b760e31b815260040160405180910390fd5b600855565b30331461082257604051630b2db9b760e31b815260040160405180910390fd5b600555565b600c80546000919061083b906001906127a1565b8154811061084b5761084b61278b565b600091825260208220915460069190910290910191506001600160a01b031633146108895760405163381a2cb560e11b815260040160405180910390fd5b6001600482015460ff1660028111156108a4576108a46121d6565b146108c2576040516310cec38560e21b815260040160405180910390fd5b60028101548211156108e757604051631f6edbfd60e01b815260040160405180910390fd5b8115610977576000600b600283016109006001866127a1565b815481106109105761091061278b565b90600052602060002001548154811061092b5761092b61278b565b600091825260209091206005600890920201908101805460ff1916600117905542600682015560038301546002548254929350610975926001600160a01b03908116929116611ec2565b505b8060030154600a600082825461098d91906127a1565b90915550506000600382018190554260095560048201805460ff19166002179055828255600c805460010181559052604051828152839033907f394027a5fa6e098a1191094d1719d6929b9abc535fcc0c8f448d6a4e75622276906020015b60405180910390a3505050565b610a4f60405180610100016040528060006001600160a01b031681526020016000815260200160608152602001600080191681526020016000815260200160001515815260200160008152602001600081525090565b600b8281548110610a6257610a6261278b565b600091825260208083206040805161010081018252600890940290910180546001600160a01b03168452600181015484840152600281018054835181860281018601855281815295969295938701949192909184015b82821015610bae576000848152602090819020604080516080810182526004860290920180546001600160a01b0316835260018101549383019390935260028301805492939291840191610b0b90612679565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3790612679565b8015610b845780601f10610b5957610100808354040283529160200191610b84565b820191906000526020600020905b815481529060010190602001808311610b6757829003601f168201915b50505091835250506003919091015460ff1615156020918201529082526001929092019101610ab8565b505050908252506003820154602082015260048201546040820152600582015460ff16151560608201526006820154608082015260079091015460a09091015292915050565b610bfc611fad565b600c8281548110610c0f57610c0f61278b565b90600052602060002090600602016040518060c0016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610c8b57602002820191906000526020600020905b815481526020019060010190808311610c77575b505050918352505060038201546020820152600482015460409091019060ff166002811115610cbc57610cbc6121d6565b6002811115610ccd57610ccd6121d6565b81526020016005820154815250509050919050565b600c805460009190610cf6906001906127a1565b81548110610d0657610d0661278b565b906000526020600020906006020160050154905080600654610d289190612772565b600954610d3590426127a1565b1115610d545760405163d5ac976d60e01b815260040160405180910390fd5b8451865114610d7657604051638f32290560e01b815260040160405180910390fd5b8251865114610d9857604051633222108360e01b815260040160405180910390fd5b600c805460009190610dac906001906127a1565b81548110610dbc57610dbc61278b565b60009182526020808320600b8054600181018255945260089093027f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331781556040805163a3b1b31d60e01b81529051600690940290940194509260649263a3b1b31d926004808401939192918290030181865afa158015610e4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e739190612743565b600782015560005460405163f7434ea960e01b81526001600160a01b039091169063f7434ea990610ea990600190600401612730565b602060405180830381865afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea9190612743565b600554610ef79190612772565b60018201819055341015610f1e5760405163070f6eed60e11b815260040160405180910390fd5b60008080805b8b5181101561112a576000898281518110610f4157610f4161278b565b60200260200101516001600160401b03811115610f6057610f606122a1565b6040519080825280601f01601f191660200182016040528015610f8a576020820181803683370190505b50600287018054600181018255600091825260209091208f51929350600490910201908e9084908110610fbf57610fbf61278b565b602090810291909101015181546001600160a01b0319166001600160a01b039091161781558c518d9084908110610ff857610ff861278b565b6020026020010151816001018190555060005b8b848151811061101d5761101d61278b565b6020026020010151811015611083578c6110378287612772565b815181106110475761104761278b565b602001015160f81c60f81b8382815181106110645761106461278b565b60200101906001600160f81b031916908160001a90535060010161100b565b50600281016110928382612805565b508a83815181106110a5576110a561278b565b6020026020010151846110b89190612772565b815460018301546040519296506110e2926001600160a01b03909216916002850190602001612937565b60408051601f19818403018152828252805160209182012081840181905283830199909952815180840383018152606090930190915281519101209594505050600101610f24565b50600c54600d90600090611140906001906127a1565b81526020808201929092526040908101600090812086825290925290205460ff161561117f5760405163607cb3e760e01b815260040160405180910390fd5b6001600d60006001600c8054905061119791906127a1565b8152602080820192909252604090810160009081208782529092528120805460ff191692151592909217909155600385810185905542600487015560018601549087018054919290916111eb908490612772565b9091555050600b546002860190611204906001906127a1565b815460018181018455600093845260209093200155600286015490036112375760095461123190426127a1565b60058601555b600c54611246906001906127a1565b600b543390611257906001906127a1565b7f1a700b4f7df255aaf8c91c8b05abf0eab596e467dc17ef76fe4afc12541012488a604051611286919061203a565b60405180910390a460008460010154346112a091906127a1565b905080156112c1576002546112c190339083906001600160a01b0316611ec2565b8460010154600a60008282546112d79190612772565b9091555050505050505050505050505050565b600c54600090610756906001906127a1565b6000600b84815481106113115761131161278b565b60009182526020909120600890910201600581015490915060ff166113485760405162325f4560e91b815260040160405180910390fd5b600754600682015461135a90426127a1565b111561137957604051638b349aa560e01b815260040160405180910390fd5b825b60028201548110801561139e575082158061139e575061139b8385612772565b81105b156114b95760008260020182815481106113ba576113ba61278b565b9060005260206000209060040201905060006113d4611aad565b600383015490915060ff161580156113f0575080826001015411155b156114a457815460018301546040516000926001600160a01b0316919061141b90600287019061296a565b60006040518083038185875af1925050503d8060008114611458576040519150601f19603f3d011682016040523d82523d6000602084013e61145d565b606091505b50909150508015156001036114a257600383015460ff161561149257604051630dc1019760e01b815260040160405180910390fd5b60038301805460ff191660011790555b505b505080806114b190612976565b91505061137b565b5050505050565b600c81815481106114d057600080fd5b6000918252602090912060069091020180546001820154600383015460048401546005909401549294509092909160ff9091169085565b600c80546000919061151b906001906127a1565b8154811061152b5761152b61278b565b90600052602060002090600602016005015490508060065461154d9190612772565b60095461155a90426127a1565b1161157857604051631875ed4760e21b815260040160405180910390fd5b600c80546000919061158c906001906127a1565b8154811061159c5761159c61278b565b6000918252602082206006909102019150600482015460ff1660028111156115c6576115c66121d6565b146115e4576040516304ee891b60e11b815260040160405180910390fd5b60028101546000036116115742600955600401805460ff1916600217905550600c80546001018155600052565b60028101546001036116e0576000600b826002016000815481106116375761163761278b565b9060005260206000200154815481106116525761165261278b565b6000918252602082206005600890920201908101805460ff1916600117905542600682015560038401805492905560025481549193506116a0916001600160a01b0390811691849116611ec2565b4260095560048301805460ff19166002179055600c805460010181556000908152600a80548392906116d39084906127a1565b9091555061189b92505050565b6004818101805460ff191660019081179091556000805460405163f7434ea960e01b815291936001600160a01b039091169263f7434ea9926117229201612730565b602060405180830381865afa15801561173f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117639190612743565b600054600284015460405163c13517e160e01b81529293506001600160a01b039091169163c13517e191849161179f919060019060040161298f565b60206040518083038185885af11580156117bd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117e29190612743565b600180840191909155600c546117f891906127a1565b60018301546000908152600e60205260409020556003820154811061181e57600061182e565b80826003015461182e91906127a1565b6003830155600a548110611843576000611851565b80600a5461185191906127a1565b600a5560018201546000546004546040519081526001600160a01b03909116907fee1017dcbefba87397fcdaab31f187328533572b6a5568177fa2eb64026003b6906020016109ec565b5050565b3033146118bf57604051630b2db9b760e31b815260040160405180910390fd5b600c8054600091906118d3906001906127a1565b815481106118e3576118e361278b565b9060005260206000209060060201600501549050806006546119059190612772565b60095461191290426127a1565b11156119315760405163d5ac976d60e01b815260040160405180910390fd5b50600655565b6000806060600080600b87815481106119525761195261278b565b9060005260206000209060080201905060008160020187815481106119795761197961278b565b600091825260209091206004909102018054600182015460038301546002840180549495506001600160a01b039093169391929160ff9091169082906119be90612679565b80601f01602080910402602001604051908101604052809291908181526020018280546119ea90612679565b8015611a375780601f10611a0c57610100808354040283529160200191611a37565b820191906000526020600020905b815481529060010190602001808311611a1a57829003601f168201915b505050505091509550955095509550505092959194509250565b600b8181548110611a6157600080fd5b600091825260209091206008909102018054600182015460038301546004840154600585015460068601546007909601546001600160a01b03909516965092949193909260ff16919087565b6000600a544761075691906127a1565b600c805460009190611ad1906001906127a1565b81548110611ae157611ae161278b565b906000526020600020906006020190506000600b826002018581548110611b0a57611b0a61278b565b906000526020600020015481548110611b2557611b2561278b565b906000526020600020906008020190506002600654611b4491906129b0565b600954611b5190426127a1565b1115611b705760405163383f4af360e21b815260040160405180910390fd5b82816003015414611b94576040516306e671b760e31b815260040160405180910390fd5b80546001600160a01b03163314611bbe5760405163415360c560e11b815260040160405180910390fd5b6008546004820154611bd090426127a1565b1115611bef5760405163603c988d60e11b815260040160405180910390fd5b600282018054611c01906001906127a1565b81548110611c1157611c1161278b565b9060005260206000200154826002018581548110611c3157611c3161278b565b6000918252602082200191909155600c54600d908290611c53906001906127a1565b8152602080820192909252604090810160009081208782529092529020805460ff191691151591909117905560028201805480611c9257611c926129d2565b600190038181906000526020600020016000905590558060010154826003016000828254611cc091906127a1565b90915550506001810154600a8054600090611cdc9084906127a1565b90915550506001810154604051339180156108fc02916000818181858888f193505050501580156114b9573d6000803e3d6000fd5b303314611d3157604051630b2db9b760e31b815260040160405180910390fd5b600c805460009190611d45906001906127a1565b81548110611d5557611d5561278b565b906000526020600020906006020160050154905080600654611d779190612772565b600954611d8490426127a1565b1115611da35760405163d5ac976d60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0385161790556001611dca8382612805565b50505050565b303314611df057604051630b2db9b760e31b815260040160405180910390fd5b6003546040516312a6505d60e21b81526001600160a01b0390911690634a99417490611e2290859085906004016129e8565b6020604051808303816000875af1158015611e41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e659190612743565b6004555050565b303314611e8c57604051630b2db9b760e31b815260040160405180910390fd5b600755565b600080600b8381548110611ea757611ea761278b565b60009182526020909120600260089092020101549392505050565b6040516001600160a01b0384169083156108fc029084906000818181858888f1935050505015611ef157505050565b806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f2c57600080fd5b505af1158015611f40573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038781166004830152602482018790528516935063a9059cbb92506044019050600060405180830381600087803b158015611f9057600080fd5b505af1158015611fa4573d6000803e3d6000fd5b50505050505050565b6040518060c001604052806000815260200160008152602001606081526020016000815260200160006002811115611fe757611fe76121d6565b8152602001600081525090565b6000815180845260005b8181101561201a57602081850181015186830182015201611ffe565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061204d6020830184611ff4565b9392505050565b60006020828403121561206657600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156120a557835183529284019291840191600101612089565b50909695505050505050565b600080604083850312156120c457600080fd5b50508035926020909101359150565b60006020808352610120830160018060a01b0380865116838601528286015160408160408801526040880151915061010060608160608a01528584518088526101409750878b019150878160051b8c01019750888601955060005b818110156121875761013f198c8a0301835286516080898251168b528b8201518c8c01528782015181898d0152612167828d0182611ff4565b9287015115159b87019b909b52509850958901959189019160010161212e565b5050505060608901516080890152608089015160a089015260a089015195506121b460c089018715159052565b60c089015160e089015260e08901518189015250505050809250505092915050565b634e487b7160e01b600052602160045260246000fd5b6003811061220a57634e487b7160e01b600052602160045260246000fd5b9052565b6000602080835260e08301845182850152818501516040850152604085015160c06060860152818151808452610100870191508483019350600092505b8083101561226b578351825292840192600192909201919084019061224b565b50606087015160808701526080870151935061228a60a08701856121ec565b60a087015160c08701528094505050505092915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156122df576122df6122a1565b604052919050565b60006001600160401b03821115612300576123006122a1565b5060051b60200190565b6001600160a01b038116811461231f57600080fd5b50565b600082601f83011261233357600080fd5b81356020612348612343836122e7565b6122b7565b8083825260208201915060208460051b87010193508684111561236a57600080fd5b602086015b8481101561238f5780356123828161230a565b835291830191830161236f565b509695505050505050565b600082601f8301126123ab57600080fd5b813560206123bb612343836122e7565b8083825260208201915060208460051b8701019350868411156123dd57600080fd5b602086015b8481101561238f57803583529183019183016123e2565b600082601f83011261240a57600080fd5b81356001600160401b03811115612423576124236122a1565b612436601f8201601f19166020016122b7565b81815284602083860101111561244b57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561248057600080fd5b85356001600160401b038082111561249757600080fd5b6124a389838a01612322565b965060208801359150808211156124b957600080fd5b6124c589838a0161239a565b955060408801359150808211156124db57600080fd5b6124e789838a016123f9565b945060608801359150808211156124fd57600080fd5b61250989838a0161239a565b9350608088013591508082111561251f57600080fd5b5061252c888289016123f9565b9150509295509295909350565b60008060006060848603121561254e57600080fd5b505081359360208301359350604090920135919050565b858152602081018590526040810184905260a0810161258760608301856121ec565b8260808301529695505050505050565b60018060a01b03851681528360208201526080604082015260006125be6080830185611ff4565b9050821515606083015295945050505050565b600080604083850312156125e457600080fd5b82356125ef8161230a565b915060208301356001600160401b0381111561260a57600080fd5b612616858286016123f9565b9150509250929050565b6000806040838503121561263357600080fd5b82356001600160401b038082111561264a57600080fd5b612656868387016123f9565b9350602085013591508082111561266c57600080fd5b50612616858286016123f9565b600181811c9082168061268d57607f821691505b6020821081036126ad57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546126c081612679565b8085526020600183811680156126dd57600181146126f757612725565b60ff1985168884015283151560051b880183019550612725565b866000528260002060005b8581101561271d5781548a8201860152908301908401612702565b890184019650505b505050505092915050565b60208152600061204d60208301846126b3565b60006020828403121561275557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156127855761278561275c565b92915050565b634e487b7160e01b600052603260045260246000fd5b818103818111156127855761278561275c565b601f821115612800576000816000526020600020601f850160051c810160208610156127dd5750805b601f850160051c820191505b818110156127fc578281556001016127e9565b5050505b505050565b81516001600160401b0381111561281e5761281e6122a1565b6128328161282c8454612679565b846127b4565b602080601f831160018114612867576000841561284f5750858301515b600019600386901b1c1916600185901b1785556127fc565b600085815260208120601f198616915b8281101561289657888601518255948401946001909101908401612877565b50858210156128b45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600081546128d181612679565b600182811680156128e957600181146128fe5761292d565b60ff198416875282151583028701945061292d565b8560005260208060002060005b858110156129245781548a82015290840190820161290b565b50505082870194505b5050505092915050565b6bffffffffffffffffffffffff198460601b168152826014820152600061296160348301846128c4565b95945050505050565b600061204d82846128c4565b6000600182016129885761298861275c565b5060010190565b8281526040602082015260006129a860408301846126b3565b949350505050565b6000826129cd57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b6060815260006060820152608060208201526000612a096080830185611ff4565b82810360408401526129618185611ff456fea2646970667358221220f2b8282f42be09212ddb68862ebc46615235bf74de96255090619d9bb6ee9fbd64736f6c63430008180033", "devdoc": { "details": "Appeal and evidence submission is handled by the court.", "events": { @@ -1220,7 +1239,7 @@ "storageLayout": { "storage": [ { - "astId": 386, + "astId": 390, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "arbitrator", "offset": 0, @@ -1228,7 +1247,7 @@ "type": "t_contract(IArbitratorV2)133" }, { - "astId": 388, + "astId": 392, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "arbitratorExtraData", "offset": 0, @@ -1236,7 +1255,7 @@ "type": "t_bytes_storage" }, { - "astId": 390, + "astId": 394, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "wNative", "offset": 0, @@ -1244,7 +1263,7 @@ "type": "t_address" }, { - "astId": 393, + "astId": 397, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "templateRegistry", "offset": 0, @@ -1252,7 +1271,7 @@ "type": "t_contract(IDisputeTemplateRegistry)160" }, { - "astId": 395, + "astId": 399, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "templateId", "offset": 0, @@ -1260,7 +1279,7 @@ "type": "t_uint256" }, { - "astId": 397, + "astId": 401, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "submissionBaseDeposit", "offset": 0, @@ -1268,7 +1287,7 @@ "type": "t_uint256" }, { - "astId": 399, + "astId": 403, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "submissionTimeout", "offset": 0, @@ -1276,7 +1295,7 @@ "type": "t_uint256" }, { - "astId": 401, + "astId": 405, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "executionTimeout", "offset": 0, @@ -1284,7 +1303,7 @@ "type": "t_uint256" }, { - "astId": 403, + "astId": 407, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "withdrawTimeout", "offset": 0, @@ -1292,7 +1311,7 @@ "type": "t_uint256" }, { - "astId": 405, + "astId": 409, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "lastApprovalTime", "offset": 0, @@ -1300,7 +1319,7 @@ "type": "t_uint256" }, { - "astId": 407, + "astId": 411, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "reservedETH", "offset": 0, @@ -1308,28 +1327,36 @@ "type": "t_uint256" }, { - "astId": 411, + "astId": 415, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "submissions", "offset": 0, "slot": "11", - "type": "t_array(t_struct(Submission)374_storage)dyn_storage" + "type": "t_array(t_struct(Submission)378_storage)dyn_storage" }, { - "astId": 415, + "astId": 419, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "sessions", "offset": 0, "slot": "12", - "type": "t_array(t_struct(Session)346_storage)dyn_storage" + "type": "t_array(t_struct(Session)350_storage)dyn_storage" }, { - "astId": 421, + "astId": 425, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "alreadySubmitted", "offset": 0, "slot": "13", "type": "t_mapping(t_uint256,t_mapping(t_bytes32,t_bool))" + }, + { + "astId": 429, + "contract": "src/KlerosGovernor.sol:KlerosGovernor", + "label": "arbitratorDisputeIDToSessionIndex", + "offset": 0, + "slot": "14", + "type": "t_mapping(t_uint256,t_uint256)" } ], "types": { @@ -1343,20 +1370,20 @@ "label": "address payable", "numberOfBytes": "20" }, - "t_array(t_struct(Session)346_storage)dyn_storage": { - "base": "t_struct(Session)346_storage", + "t_array(t_struct(Session)350_storage)dyn_storage": { + "base": "t_struct(Session)350_storage", "encoding": "dynamic_array", "label": "struct KlerosGovernor.Session[]", "numberOfBytes": "32" }, - "t_array(t_struct(Submission)374_storage)dyn_storage": { - "base": "t_struct(Submission)374_storage", + "t_array(t_struct(Submission)378_storage)dyn_storage": { + "base": "t_struct(Submission)378_storage", "encoding": "dynamic_array", "label": "struct KlerosGovernor.Submission[]", "numberOfBytes": "32" }, - "t_array(t_struct(Transaction)355_storage)dyn_storage": { - "base": "t_struct(Transaction)355_storage", + "t_array(t_struct(Transaction)359_storage)dyn_storage": { + "base": "t_struct(Transaction)359_storage", "encoding": "dynamic_array", "label": "struct KlerosGovernor.Transaction[]", "numberOfBytes": "32" @@ -1392,7 +1419,7 @@ "label": "contract IDisputeTemplateRegistry", "numberOfBytes": "20" }, - "t_enum(Status)331": { + "t_enum(Status)335": { "encoding": "inplace", "label": "enum KlerosGovernor.Status", "numberOfBytes": "1" @@ -1411,12 +1438,19 @@ "numberOfBytes": "32", "value": "t_mapping(t_bytes32,t_bool)" }, - "t_struct(Session)346_storage": { + "t_mapping(t_uint256,t_uint256)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_struct(Session)350_storage": { "encoding": "inplace", "label": "struct KlerosGovernor.Session", "members": [ { - "astId": 333, + "astId": 337, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "ruling", "offset": 0, @@ -1424,7 +1458,7 @@ "type": "t_uint256" }, { - "astId": 335, + "astId": 339, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "disputeID", "offset": 0, @@ -1432,7 +1466,7 @@ "type": "t_uint256" }, { - "astId": 338, + "astId": 342, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "submittedLists", "offset": 0, @@ -1440,7 +1474,7 @@ "type": "t_array(t_uint256)dyn_storage" }, { - "astId": 340, + "astId": 344, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "sumDeposit", "offset": 0, @@ -1448,15 +1482,15 @@ "type": "t_uint256" }, { - "astId": 343, + "astId": 347, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "status", "offset": 0, "slot": "4", - "type": "t_enum(Status)331" + "type": "t_enum(Status)335" }, { - "astId": 345, + "astId": 349, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "durationOffset", "offset": 0, @@ -1466,12 +1500,12 @@ ], "numberOfBytes": "192" }, - "t_struct(Submission)374_storage": { + "t_struct(Submission)378_storage": { "encoding": "inplace", "label": "struct KlerosGovernor.Submission", "members": [ { - "astId": 357, + "astId": 361, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "submitter", "offset": 0, @@ -1479,7 +1513,7 @@ "type": "t_address_payable" }, { - "astId": 359, + "astId": 363, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "deposit", "offset": 0, @@ -1487,15 +1521,15 @@ "type": "t_uint256" }, { - "astId": 363, + "astId": 367, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "txs", "offset": 0, "slot": "2", - "type": "t_array(t_struct(Transaction)355_storage)dyn_storage" + "type": "t_array(t_struct(Transaction)359_storage)dyn_storage" }, { - "astId": 365, + "astId": 369, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "listHash", "offset": 0, @@ -1503,7 +1537,7 @@ "type": "t_bytes32" }, { - "astId": 367, + "astId": 371, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "submissionTime", "offset": 0, @@ -1511,7 +1545,7 @@ "type": "t_uint256" }, { - "astId": 369, + "astId": 373, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "approved", "offset": 0, @@ -1519,7 +1553,7 @@ "type": "t_bool" }, { - "astId": 371, + "astId": 375, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "approvalTime", "offset": 0, @@ -1527,7 +1561,7 @@ "type": "t_uint256" }, { - "astId": 373, + "astId": 377, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "submissionBlock", "offset": 0, @@ -1537,12 +1571,12 @@ ], "numberOfBytes": "256" }, - "t_struct(Transaction)355_storage": { + "t_struct(Transaction)359_storage": { "encoding": "inplace", "label": "struct KlerosGovernor.Transaction", "members": [ { - "astId": 348, + "astId": 352, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "target", "offset": 0, @@ -1550,7 +1584,7 @@ "type": "t_address" }, { - "astId": 350, + "astId": 354, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "value", "offset": 0, @@ -1558,7 +1592,7 @@ "type": "t_uint256" }, { - "astId": 352, + "astId": 356, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "data", "offset": 0, @@ -1566,7 +1600,7 @@ "type": "t_bytes_storage" }, { - "astId": 354, + "astId": 358, "contract": "src/KlerosGovernor.sol:KlerosGovernor", "label": "executed", "offset": 0, diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 149deb7..26744d7 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -132,7 +132,7 @@ const config: HardhatUserConfig = { tags: ["production", "foreign", "layer1"], verify: { etherscan: { - apiKey: process.env.GNOSISSCAN_API_KEY, + apiKey: process.env.ETHERSCAN_API_KEY, }, }, }, diff --git a/contracts/src/KlerosGovernor.sol b/contracts/src/KlerosGovernor.sol index a07c445..41085c9 100644 --- a/contracts/src/KlerosGovernor.sol +++ b/contracts/src/KlerosGovernor.sol @@ -70,7 +70,7 @@ contract KlerosGovernor is IArbitrableV2 { Submission[] public submissions; // Stores all created transaction lists. submissions[_listID]. Session[] public sessions; // Stores all submitting sessions. sessions[_session]. mapping(uint256 sessionIndex => mapping(bytes32 listHash => bool)) alreadySubmitted; // Indicates whether or not the transaction list was already submitted in order to catch duplicates in the form alreadySubmitted[listHash]. - + mapping(uint256 disputeID => uint256 sessionIndex) public arbitratorDisputeIDToSessionIndex; // Maps core arbitrator's dispute ID to session index. // ************************************* // // * Function Modifiers * // // ************************************* // @@ -254,7 +254,7 @@ contract KlerosGovernor is IArbitrableV2 { currentTxHash = keccak256(abi.encodePacked(transaction.target, transaction.value, transaction.data)); listHash = keccak256(abi.encodePacked(currentTxHash, listHash)); } - if (!alreadySubmitted[sessions.length - 1][listHash]) revert ListAlreadySubmitted(); + if (alreadySubmitted[sessions.length - 1][listHash]) revert ListAlreadySubmitted(); alreadySubmitted[sessions.length - 1][listHash] = true; submission.listHash = listHash; submission.submissionTime = block.timestamp; @@ -318,6 +318,7 @@ contract KlerosGovernor is IArbitrableV2 { session.submittedLists.length, arbitratorExtraData ); + arbitratorDisputeIDToSessionIndex[session.disputeID] = sessions.length - 1; // Check in case arbitration cost increased after the submission. It's unlikely that its increase won't be covered by the base deposit, but technically possible. session.sumDeposit = session.sumDeposit > arbitrationCost ? session.sumDeposit - arbitrationCost : 0; reservedETH = reservedETH > arbitrationCost ? reservedETH - arbitrationCost : 0; From 6cefd0cece7b6a5a4d9f622fb70e66e40ac2e2e3 Mon Sep 17 00:00:00 2001 From: Harman-singh-waraich Date: Tue, 18 Nov 2025 18:46:31 +0530 Subject: [PATCH 5/6] feat(web): update-governor-and-allow-opening-list-from-url --- .../ActiveLists/ListCard.tsx | 11 ++--- .../[governorAddress]/ActiveLists/index.tsx | 40 +++++++++++++++++-- web/src/consts/governors.ts | 6 +-- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/web/src/app/(main)/governor/[governorAddress]/ActiveLists/ListCard.tsx b/web/src/app/(main)/governor/[governorAddress]/ActiveLists/ListCard.tsx index 69851f6..9f47325 100644 --- a/web/src/app/(main)/governor/[governorAddress]/ActiveLists/ListCard.tsx +++ b/web/src/app/(main)/governor/[governorAddress]/ActiveLists/ListCard.tsx @@ -3,7 +3,7 @@ import { useMemo, useRef } from "react"; import clsx from "clsx"; -import { useHoverDirty, useToggle } from "react-use"; +import { useHoverDirty } from "react-use"; import { Address } from "viem"; import { Submission } from "@/hooks/useFetchSubmittedLists"; @@ -16,16 +16,14 @@ import Search from "@/assets/svgs/icons/search.svg"; import { formatDate } from "@/utils"; -import ExamineModal from "./ExamineModal"; - interface IListCard { list: Submission; governorAddress: Address; + setIsOpen: (list: Submission) => void; } -const ListCard: React.FC = ({ list, governorAddress }) => { +const ListCard: React.FC = ({ list, setIsOpen }) => { const cardRef = useRef(null); const isHovered = useHoverDirty(cardRef); - const [isOpen, toggleIsOpen] = useToggle(false); const status = useMemo(() => { if (list.txs.length > 0 && list.txs.every((tx) => tx.executed)) return ListStatus.Executed; @@ -67,13 +65,12 @@ const ListCard: React.FC = ({ list, governorAddress }) => { "flex items-center justify-center gap-2 flex-col", "animate-fade-in !duration-100" )} - onClick={toggleIsOpen} + onClick={() => setIsOpen(list)} >

Examine

) : null} - ); }; diff --git a/web/src/app/(main)/governor/[governorAddress]/ActiveLists/index.tsx b/web/src/app/(main)/governor/[governorAddress]/ActiveLists/index.tsx index 3368ab7..4046462 100644 --- a/web/src/app/(main)/governor/[governorAddress]/ActiveLists/index.tsx +++ b/web/src/app/(main)/governor/[governorAddress]/ActiveLists/index.tsx @@ -1,7 +1,10 @@ "use client"; +import { useCallback, useEffect, useState } from "react"; + +import { useRouter, useSearchParams } from "next/navigation"; import { Address } from "viem"; -import { useFetchSubmittedLists } from "@/hooks/useFetchSubmittedLists"; +import { Submission, useFetchSubmittedLists } from "@/hooks/useFetchSubmittedLists"; import { Skeleton } from "@/components/Skeleton"; @@ -9,12 +12,35 @@ import Paper from "@/assets/svgs/icons/paper.svg"; import { isUndefined } from "@/utils"; +import ExamineModal from "./ExamineModal"; import ListCard from "./ListCard"; const ActiveLists: React.FC<{ governorAddress: Address }> = ({ governorAddress }) => { + const [openList, setOpenList] = useState(); + const router = useRouter(); + const params = useSearchParams(); + const listId = params.get("listId"); + const { data: lists, isLoading } = useFetchSubmittedLists(governorAddress); const { data: lastSessionLists } = useFetchSubmittedLists(governorAddress, true); + useEffect(() => { + // Open the list automatically if specified in params + if (!isUndefined(listId) && !isUndefined(lists)) { + const match = lists.find((l) => l.listId === BigInt(listId)); + if (match) setOpenList({ ...match }); + } + }, [listId, lists]); + + const handleOpen = useCallback((list: Submission) => { + setOpenList({ ...list }); + }, []); + + const closePopup = () => { + setOpenList(undefined); + router.replace(window.location.pathname, { scroll: false }); + }; + const AlternateElement = isLoading ? ( ) : ( @@ -30,7 +56,7 @@ const ActiveLists: React.FC<{ governorAddress: Address }> = ({ governorAddress }
{lastSessionLists.map((list) => ( - + ))}

@@ -46,8 +72,16 @@ const ActiveLists: React.FC<{ governorAddress: Address }> = ({ governorAddress }
{isUndefined(lists) || lists.length === 0 ? AlternateElement - : lists.map((list) => )} + : lists.map((list) => )}
+ {openList ? ( + + ) : null} ); }; diff --git a/web/src/consts/governors.ts b/web/src/consts/governors.ts index 3f16beb..893d449 100644 --- a/web/src/consts/governors.ts +++ b/web/src/consts/governors.ts @@ -19,7 +19,7 @@ export type Governor = { export const governors: Governor[] = [ { name: "Kleros V2", - address: "0x5a6dAe69c24FFDc67d47C08F7b19b71793779F1a", + address: "0x52e6766e6C4fB05Caec92e5318668b3E366D649a", Logo: KlerosLogo, chain: arbitrumSepolia, ChainIcon: ETH, @@ -27,7 +27,7 @@ export const governors: Governor[] = [ }, { name: "Kleros V2", - address: "0xbe8d95497E53aB41d5A45CC8def90d0e59b49f98", + address: "0x52e6766e6C4fB05Caec92e5318668b3E366D649a", Logo: KlerosLogo, chain: gnosis, ChainIcon: Gnosis, @@ -35,7 +35,7 @@ export const governors: Governor[] = [ }, { name: "Proof of Humanity V1", - address: "0xbe8d95497E53aB41d5A45CC8def90d0e59b49f97", + address: "0x52e6766e6C4fB05Caec92e5318668b3E366D649a", Logo: PohLogo, chain: mainnet, ChainIcon: ETH, From e280f78054ba74cdb7939c44b42bfc6292813c92 Mon Sep 17 00:00:00 2001 From: Harman-singh-waraich Date: Wed, 19 Nov 2025 13:30:04 +0530 Subject: [PATCH 6/6] chore: update-verify-tooling --- contracts/.env.example | 6 +-- contracts/README.md | 9 ++-- contracts/README.md.template | 10 ++--- contracts/deploy/00-governor-v2.ts | 32 +------------- contracts/hardhat.config.ts | 3 +- contracts/package.json | 2 +- contracts/tasks/verify-all.ts | 42 +++++++++++++++++++ .../[governorAddress]/ActiveLists/index.tsx | 7 +++- 8 files changed, 63 insertions(+), 48 deletions(-) create mode 100644 contracts/tasks/verify-all.ts diff --git a/contracts/.env.example b/contracts/.env.example index eb6e752..a697725 100644 --- a/contracts/.env.example +++ b/contracts/.env.example @@ -1,5 +1,5 @@ -export PRIVATE_KEY = "" -export MAINNET_PRIVATE_KEY = "" -export INFURA_API_KEY = "" +export PRIVATE_KEY="" +export MAINNET_PRIVATE_KEY="" +export INFURA_API_KEY="" export ETHERSCAN_API_KEY_FIX="" export ETHERSCAN_API_KEY="" \ No newline at end of file diff --git a/contracts/README.md b/contracts/README.md index 4879c7c..454c4dd 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -75,8 +75,7 @@ The following env vars are required: The ones below are optional: - `ETHERSCAN_API_KEY`: to verify the source of the newly deployed contracts on **Etherscan**. -- `ARBISCAN_API_KEY`: to verify the source of the newly deployed contracts on **Arbitrum**. -- `GNOSISSCAN_API_KEY`: to verify the source of the newly deployed contracts on **Gnosis chain**. +- `ETHERSCAN_API_KEY_FIX`: to verify the source of the newly deployed contracts on **Etherscan**. #### 1. Deploy to a Local Network @@ -91,7 +90,7 @@ yarn hardhat node --tags nothing **Shell 2: the deploy script** ```bash -yarn deploy --network localhost --tags GovernorV2 +yarn deploy --network localhost --tags KlerosGovernor ``` #### 2. Deploy to a Public Network Fork @@ -115,7 +114,7 @@ yarn deploy-testnet-fork #### 3. Deploy to Public Testnets ```bash -yarn deploy --network arbitrumSepolia --tags GovernorV2 +yarn deploy --network arbitrumSepolia --tags KlerosGovernor ``` The deployed addresses should be displayed to the screen after the deployment is complete. If you missed them, you can always go to the `deployments/` directory and look for the respective file. @@ -129,7 +128,7 @@ Same steps as above but append `Devnet` to the `--network` parameter. **Shell 1: the node** ```bash -yarn hardhat node --tags GovernorV2 +yarn hardhat node --tags KlerosGovernor ``` **Shell 2: the test scripts** diff --git a/contracts/README.md.template b/contracts/README.md.template index 5fafb24..a1764f0 100644 --- a/contracts/README.md.template +++ b/contracts/README.md.template @@ -61,8 +61,8 @@ The following env vars are required: The ones below are optional: - `ETHERSCAN_API_KEY`: to verify the source of the newly deployed contracts on **Etherscan**. -- `ARBISCAN_API_KEY`: to verify the source of the newly deployed contracts on **Arbitrum**. -- `GNOSISSCAN_API_KEY`: to verify the source of the newly deployed contracts on **Gnosis chain**. +- `ETHERSCAN_API_KEY_FIX`: to verify the source of the newly deployed contracts on **Etherscan**. + #### 1. Deploy to a Local Network @@ -77,7 +77,7 @@ yarn hardhat node --tags nothing **Shell 2: the deploy script** ```bash -yarn deploy --network localhost --tags GovernorV2 +yarn deploy --network localhost --tags KlerosGovernor ``` #### 2. Deploy to a Public Network Fork @@ -101,7 +101,7 @@ yarn deploy-testnet-fork #### 3. Deploy to Public Testnets ```bash -yarn deploy --network arbitrumSepolia --tags GovernorV2 +yarn deploy --network arbitrumSepolia --tags KlerosGovernor ``` The deployed addresses should be displayed to the screen after the deployment is complete. If you missed them, you can always go to the `deployments/` directory and look for the respective file. @@ -115,7 +115,7 @@ Same steps as above but append `Devnet` to the `--network` parameter. **Shell 1: the node** ```bash -yarn hardhat node --tags GovernorV2 +yarn hardhat node --tags KlerosGovernor ``` **Shell 2: the test scripts** diff --git a/contracts/deploy/00-governor-v2.ts b/contracts/deploy/00-governor-v2.ts index 9a178e5..21f5155 100644 --- a/contracts/deploy/00-governor-v2.ts +++ b/contracts/deploy/00-governor-v2.ts @@ -23,7 +23,7 @@ const deploy: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { const { disputeTemplateRegistry, klerosCore } = await getArbitratorContracts(hre); const disputeTemplate = templateFn(klerosCore.target.toString(), chainId); - const gfDeployment = await deploy("GovernorFactory", { + await deploy("GovernorFactory", { from: deployer, log: true, }); @@ -57,39 +57,11 @@ const deploy: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { ); const kgArgs = gfArgs; - const kgDeployment = await deploy("KlerosGovernor", { + await deploy("KlerosGovernor", { from: deployer, args: kgArgs, log: true, }); - - const shouldVerify = !network.name.includes("hardhat") && !network.name.includes("localhost"); - - if (shouldVerify) { - console.log("Verifying on Etherscan…"); - - try { - // GovernorFactory - await hre.run("verify:verify", { - address: gfDeployment.address, - constructorArguments: [], - }); - console.log(`✓ Verified GovernorFactory at ${gfDeployment.address}`); - } catch (err) { - console.warn("GovernorFactory already verified or failed:", err); - } - - try { - // KlerosGovernor - await hre.run("verify:verify", { - address: kgDeployment.address, - constructorArguments: kgArgs, - }); - console.log(`✓ Verified KlerosGovernor at ${kgDeployment.address}`); - } catch (err) { - console.warn("KlerosGovernor already verified or failed:", err); - } - } }; deploy.tags = ["KlerosGovernor"]; diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 26744d7..353a361 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -13,6 +13,7 @@ import "hardhat-watcher"; import "hardhat-docgen"; // import "hardhat-contract-sizer"; // prevents hardhat-deploy from finding chalk... // import "hardhat-tracer"; // prevents hardhat-deploy from finding chalk... +import "./tasks/verify-all"; dotenv.config(); @@ -66,7 +67,6 @@ const config: HardhatUserConfig = { tags: ["staging", "home", "layer2"], verify: { etherscan: { - apiUrl: "https://api-sepolia.arbiscan.io", apiKey: process.env.ETHERSCAN_API_KEY, }, }, @@ -80,7 +80,6 @@ const config: HardhatUserConfig = { tags: ["staging", "home", "layer2"], verify: { etherscan: { - apiUrl: "https://api-sepolia.arbiscan.io", apiKey: process.env.ETHERSCAN_API_KEY, }, }, diff --git a/contracts/package.json b/contracts/package.json index eb972ae..702539a 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -38,7 +38,7 @@ "export:devnet": "yarn hardhat export --export deployments/arbitrumSepoliaDevnet.ts --network arbitrumSepoliaDevnet", "export:testnet": "yarn hardhat export --export deployments/arbitrumSepolia.ts --network arbitrumSepolia", "export:mainnet": "yarn hardhat export --export deployments/arbitrum.ts --network arbitrum", - "etherscan-verify": "hardhat etherscan-verify", + "etherscan-verify": "hardhat verify-all", "etherscan-verify-proxies": "scripts/verifyProxies.sh", "sourcify": "hardhat sourcify --write-failing-metadata", "size": "hardhat size-contracts --no-compile", diff --git a/contracts/tasks/verify-all.ts b/contracts/tasks/verify-all.ts new file mode 100644 index 0000000..b4965ab --- /dev/null +++ b/contracts/tasks/verify-all.ts @@ -0,0 +1,42 @@ +import { task } from "hardhat/config"; +import "hardhat-deploy"; + +task("verify-all", "Verify all deployed contracts using Hardhat-Deploy deployments") + .addOptionalParam("contract", "Verify only a specific contract name") + .setAction(async ({ contract }, hre) => { + const { deployments, run, network } = hre; + + console.log(`\n🔍 Network: ${network.name}`); + + const allDeployments = await deployments.all(); + const entries = Object.entries(allDeployments); + + for (const [name, deployment] of entries) { + if (contract && name !== contract) continue; + + // skip proxy files (we only skip by naming convention) + if (name.endsWith("_Proxy")) { + console.log(`Skipping proxy: ${name}`); + continue; + } + + const address = deployment.address; + const args = deployment.args || []; + + try { + await run("verify:verify", { + address, + constructorArguments: args, + }); + } catch (err: any) { + const msg = err.message || err.toString(); + + if (msg.includes("Already Verified")) { + console.log(` ✔ Already verified\n`); + continue; + } + + console.log(` ❌ Verification failed: ${msg}\n`); + } + } + }); diff --git a/web/src/app/(main)/governor/[governorAddress]/ActiveLists/index.tsx b/web/src/app/(main)/governor/[governorAddress]/ActiveLists/index.tsx index 4046462..c15ffb9 100644 --- a/web/src/app/(main)/governor/[governorAddress]/ActiveLists/index.tsx +++ b/web/src/app/(main)/governor/[governorAddress]/ActiveLists/index.tsx @@ -27,8 +27,11 @@ const ActiveLists: React.FC<{ governorAddress: Address }> = ({ governorAddress } useEffect(() => { // Open the list automatically if specified in params if (!isUndefined(listId) && !isUndefined(lists)) { - const match = lists.find((l) => l.listId === BigInt(listId)); - if (match) setOpenList({ ...match }); + try { + const parsedListId = BigInt(listId); + const match = lists.find((l) => l.listId === parsedListId); + if (match) setOpenList({ ...match }); + } catch {} } }, [listId, lists]);