Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 231 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 16951892 | 663 days ago | IN | 0 ETH | 0.00391282 | ||||
Deposit | 16951744 | 663 days ago | IN | 0 ETH | 0.00412279 | ||||
Deposit | 16951656 | 663 days ago | IN | 0 ETH | 0.00384477 | ||||
Deposit | 16951586 | 663 days ago | IN | 0 ETH | 0.00400567 | ||||
Deposit | 16951400 | 663 days ago | IN | 0 ETH | 0.00472234 | ||||
Deposit | 16951398 | 663 days ago | IN | 0 ETH | 0.00481842 | ||||
Deposit | 16951397 | 663 days ago | IN | 0 ETH | 0.00488642 | ||||
Deposit | 16951324 | 663 days ago | IN | 0 ETH | 0.00383613 | ||||
Deposit | 16951250 | 663 days ago | IN | 0 ETH | 0.00357766 | ||||
Deposit | 16950960 | 663 days ago | IN | 0 ETH | 0.00401391 | ||||
Deposit | 16950921 | 663 days ago | IN | 0 ETH | 0.00388725 | ||||
Deposit | 16950626 | 663 days ago | IN | 0 ETH | 0.0048242 | ||||
Deposit | 16950569 | 663 days ago | IN | 0 ETH | 0.00339724 | ||||
Deposit | 16950488 | 663 days ago | IN | 0 ETH | 0.00471221 | ||||
Deposit | 16950352 | 663 days ago | IN | 0 ETH | 0.00345556 | ||||
Deposit | 16950349 | 663 days ago | IN | 0 ETH | 0.00354497 | ||||
Deposit | 16950349 | 663 days ago | IN | 0 ETH | 0.00287227 | ||||
Deposit | 16950325 | 663 days ago | IN | 0 ETH | 0.00430102 | ||||
Deposit | 16950297 | 663 days ago | IN | 0 ETH | 0.00334932 | ||||
Deposit | 16950253 | 663 days ago | IN | 0 ETH | 0.00431124 | ||||
Deposit | 16950178 | 663 days ago | IN | 0 ETH | 0.00431227 | ||||
Deposit | 16950095 | 663 days ago | IN | 0 ETH | 0.00446536 | ||||
Deposit | 16950083 | 663 days ago | IN | 0 ETH | 0.00471228 | ||||
Deposit | 16949937 | 663 days ago | IN | 0 ETH | 0.00557854 | ||||
Deposit | 16949621 | 663 days ago | IN | 0 ETH | 0.00397308 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
PaymentsRegistry
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; contract PaymentsRegistry is Ownable { using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; struct Payment { uint256 timestamp; address token; uint256 amount; } struct PaymentToken { address token; uint256 minDepositAmount; uint256 maxDepositAmount; } address public multisig; mapping(address => uint256) public totalPaymentAmount; mapping(address => uint256) public paymentTokenMinDepositAmount; mapping(address => uint256) public paymentTokenMaxDepositAmount; EnumerableSet.AddressSet private _paymentTokens; EnumerableSet.AddressSet private _paymentTokensWhitelist; mapping(address => mapping(address => uint256)) private _depositorTotalPaymentAmount; mapping(address => Payment[]) private _depositorPayments; function depositorTotalPaymentAmount(address depositor, address token) external view returns (uint256) { return _depositorTotalPaymentAmount[depositor][token]; } function depositorPaymentsCount(address depositor) external view returns (uint256) { return _depositorPayments[depositor].length; } function depositorPayments(address depositor, uint256 index) external view returns (Payment memory) { return _depositorPayments[depositor][index]; } function depositorPaymentsList( address depositor, uint256 offset, uint256 limit ) external view returns (Payment[] memory output) { Payment[] memory payments = _depositorPayments[depositor]; uint256 paymentsLength = payments.length; if (offset >= paymentsLength) return output; uint256 to = offset + limit; if (paymentsLength < to) to = paymentsLength; output = new Payment[](to - offset); for (uint256 i = 0; i < output.length; i++) output[i] = payments[offset + i]; } function paymentTokensCount() external view returns (uint256) { return _paymentTokens.length(); } function paymentTokens(uint256 index) external view returns (address) { return _paymentTokens.at(index); } function paymentTokensContains(address token) external view returns (bool) { return _paymentTokens.contains(token); } function paymentTokensList(uint256 offset, uint256 limit) external view returns (address[] memory output) { uint256 tokensLength = _paymentTokens.length(); if (offset >= tokensLength) return output; uint256 to = offset + limit; if (tokensLength < to) to = tokensLength; output = new address[](to - offset); for (uint256 i = 0; i < output.length; i++) output[i] = _paymentTokens.at(offset + i); } function paymentTokensWhitelistCount() external view returns (uint256) { return _paymentTokensWhitelist.length(); } function paymentTokensWhitelist(uint256 index) external view returns (address) { return _paymentTokensWhitelist.at(index); } function paymentTokensWhitelistContains(address token) external view returns (bool) { return _paymentTokensWhitelist.contains(token); } function paymentTokensWhitelistList(uint256 offset, uint256 limit) external view returns (address[] memory output) { uint256 tokensWhitelistLength = _paymentTokensWhitelist.length(); if (offset >= tokensWhitelistLength) return output; uint256 to = offset + limit; if (tokensWhitelistLength < to) to = tokensWhitelistLength; output = new address[](to - offset); for (uint256 i = 0; i < output.length; i++) output[i] = _paymentTokensWhitelist.at(offset + i); } event Deposited(address indexed depositor, address indexed multisig, address indexed token, uint256 amount); event MultisigUpdated(address multisig); event PaymentTokensWhitelistAdded(PaymentToken[] tokens); event PaymentTokensWhitelsitRemoved(address[] tokens); constructor (address multisig_, PaymentToken[] memory paymentTokens_) { _updateMultisig(multisig_); _addPaymentTokensWhitelist(paymentTokens_); } function deposit(address token, uint256 amount) external returns (bool) { require(_paymentTokensWhitelist.contains(token), "PaymentsRegistry: Token not whitelisted"); require(amount >= paymentTokenMinDepositAmount[token], "PaymentsRegistry: Amount lt min"); require(amount <= paymentTokenMaxDepositAmount[token], "PaymentsRegistry: Amount gt max"); IERC20(token).safeTransferFrom(msg.sender, multisig, amount); _depositorPayments[msg.sender].push(Payment(block.timestamp, token, amount)); _depositorTotalPaymentAmount[msg.sender][token] = _depositorTotalPaymentAmount[msg.sender][token] + amount; totalPaymentAmount[token] = totalPaymentAmount[token] + amount; emit Deposited(msg.sender, multisig, token, amount); return true; } function addPaymentTokensWhitelist(PaymentToken[] memory tokens_) external onlyOwner returns (bool) { _addPaymentTokensWhitelist(tokens_); return true; } function removePaymentTokensWhitelist(address[] memory tokens_) external onlyOwner returns (bool) { for (uint256 i = 0; i < tokens_.length; i++) { address token = tokens_[i]; _paymentTokensWhitelist.remove(token); delete paymentTokenMinDepositAmount[token]; delete paymentTokenMaxDepositAmount[token]; } emit PaymentTokensWhitelsitRemoved(tokens_); return true; } function updateMultisig(address multisig_) external onlyOwner returns (bool) { _updateMultisig(multisig_); return true; } function _updateMultisig(address multisig_) private { require(multisig_ != address(0), "PaymentsRegistry: Multisig is zero address"); multisig = multisig_; emit MultisigUpdated(multisig_); } function _addPaymentTokensWhitelist(PaymentToken[] memory tokens_) private { for (uint256 i = 0; i < tokens_.length; i++) { PaymentToken memory tokenInfo = tokens_[i]; require(tokenInfo.token != address(0), "PaymentsRegistry: Payment token is zero address"); require(tokenInfo.maxDepositAmount >= tokenInfo.minDepositAmount, "PaymentsRegistry: Max lt min"); _paymentTokensWhitelist.add(tokenInfo.token); _paymentTokens.add(tokenInfo.token); paymentTokenMinDepositAmount[tokenInfo.token] = tokenInfo.minDepositAmount; paymentTokenMaxDepositAmount[tokenInfo.token] = tokenInfo.maxDepositAmount; } emit PaymentTokensWhitelistAdded(tokens_); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "london", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"multisig_","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"minDepositAmount","type":"uint256"},{"internalType":"uint256","name":"maxDepositAmount","type":"uint256"}],"internalType":"struct PaymentsRegistry.PaymentToken[]","name":"paymentTokens_","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"multisig","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"multisig","type":"address"}],"name":"MultisigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"minDepositAmount","type":"uint256"},{"internalType":"uint256","name":"maxDepositAmount","type":"uint256"}],"indexed":false,"internalType":"struct PaymentsRegistry.PaymentToken[]","name":"tokens","type":"tuple[]"}],"name":"PaymentTokensWhitelistAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"PaymentTokensWhitelsitRemoved","type":"event"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"minDepositAmount","type":"uint256"},{"internalType":"uint256","name":"maxDepositAmount","type":"uint256"}],"internalType":"struct PaymentsRegistry.PaymentToken[]","name":"tokens_","type":"tuple[]"}],"name":"addPaymentTokensWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositor","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"depositorPayments","outputs":[{"components":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct PaymentsRegistry.Payment","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"depositor","type":"address"}],"name":"depositorPaymentsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"depositor","type":"address"},{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"depositorPaymentsList","outputs":[{"components":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct PaymentsRegistry.Payment[]","name":"output","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"depositor","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"depositorTotalPaymentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"paymentTokenMaxDepositAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"paymentTokenMinDepositAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"paymentTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"paymentTokensContains","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentTokensCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"paymentTokensList","outputs":[{"internalType":"address[]","name":"output","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"paymentTokensWhitelist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"paymentTokensWhitelistContains","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentTokensWhitelistCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"paymentTokensWhitelistList","outputs":[{"internalType":"address[]","name":"output","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens_","type":"address[]"}],"name":"removePaymentTokensWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalPaymentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"multisig_","type":"address"}],"name":"updateMultisig","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001ef338038062001ef3833981016040819052620000349162000430565b6200003f336200005d565b6200004a82620000ad565b620000558162000171565b5050620005d3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381166200011c5760405162461bcd60e51b815260206004820152602a60248201527f5061796d656e747352656769737472793a204d756c7469736967206973207a65604482015269726f206164647265737360b01b60648201526084015b60405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f6d74d31357c421bb05a45b4becf09f03737979c1150bb0054704d1b4f31bb82a906020015b60405180910390a150565b60005b8151811015620002fb57600082828151811062000195576200019562000531565b602090810291909101015180519091506001600160a01b0316620002145760405162461bcd60e51b815260206004820152602f60248201527f5061796d656e747352656769737472793a205061796d656e7420746f6b656e2060448201526e6973207a65726f206164647265737360881b606482015260840162000113565b8060200151816040015110156200026e5760405162461bcd60e51b815260206004820152601c60248201527f5061796d656e747352656769737472793a204d6178206c74206d696e00000000604482015260640162000113565b6200028d816000015160076200032d60201b62000c1a1790919060201c565b50620002ad816000015160056200032d60201b62000c1a1790919060201c565b5060208082015182516001600160a01b039081166000908152600384526040808220939093558285015194519091168152600490925290205580620002f28162000547565b91505062000174565b507f668ce6e4e789eeb25b47fd3c0fe52d47e6b47f4876244e11027280afd4acf845816040516200016691906200056f565b600062000344836001600160a01b0384166200034d565b90505b92915050565b6000818152600183016020526040812054620003965750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000347565b50600062000347565b80516001600160a01b0381168114620003b757600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715620003f757620003f7620003bc565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620004285762000428620003bc565b604052919050565b60008060408084860312156200044557600080fd5b62000450846200039f565b602085810151919450906001600160401b03808211156200047057600080fd5b818701915087601f8301126200048557600080fd5b8151818111156200049a576200049a620003bc565b620004aa848260051b01620003fd565b8181528481019250606091820284018501918a831115620004ca57600080fd5b938501935b82851015620005205780858c031215620004e95760008081fd5b620004f3620003d2565b620004fe866200039f565b81528587015187820152878601518882015284529384019392850192620004cf565b508096505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6000600182016200056857634e487b7160e01b600052601160045260246000fd5b5060010190565b602080825282518282018190526000919060409081850190868401855b82811015620005c657815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016200058c565b5091979650505050505050565b61191080620005e36000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063715018a6116100c3578063c7faed5f1161007c578063c7faed5f14610309578063cdf8746b14610332578063de66084114610345578063e62e032414610358578063f2fde38b14610378578063fbe025aa1461038b57600080fd5b8063715018a6146102a057806377f88cb2146102aa578063847b3e0d146102bd57806385eff3ff146102c55780638da5cb5b146102d857806395a5cb65146102e957600080fd5b806336e244511161011557806336e24451146101f85780633febd681146102265780634783c35b1461025f57806347e7ef241461027257806349bc448f14610285578063561410e81461029857600080fd5b80630bb1f0ee1461015257806312c060401461018257806316edcfa5146101a55780632929c25c146101c55780632c5ba562146101d8575b600080fd5b6101656101603660046113a4565b6103ab565b6040516001600160a01b0390911681526020015b60405180910390f35b6101956101903660046113d4565b6103be565b6040519015158152602001610179565b6101b86101b33660046113ef565b6103cb565b6040516101799190611419565b6101956101d33660046113d4565b61046d565b6101eb6101e6366004611443565b610489565b6040516101799190611465565b6102186102063660046113d4565b60046020526000908152604090205481565b604051908152602001610179565b6102186102343660046114b2565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b600154610165906001600160a01b031681565b6101956102803660046113ef565b610573565b6101956102933660046113d4565b6107fa565b610218610807565b6102a8610818565b005b6101956102b8366004611579565b61082c565b6102186108ec565b6101956102d336600461160b565b6108f8565b6000546001600160a01b0316610165565b6102186102f73660046113d4565b60036020526000908152604090205481565b6102186103173660046113d4565b6001600160a01b03166000908152600a602052604090205490565b6101eb610340366004611443565b61090b565b6101656103533660046113a4565b6109ec565b61036b6103663660046116d0565b6109f9565b6040516101799190611703565b6102a86103863660046113d4565b610ba1565b6102186103993660046113d4565b60026020526000908152604090205481565b60006103b8600783610c2f565b92915050565b60006103b8600783610c3b565b6103f860405180606001604052806000815260200160006001600160a01b03168152602001600081525090565b6001600160a01b0383166000908152600a6020526040902080548390811061042257610422611762565b60009182526020918290206040805160608101825260039093029091018054835260018101546001600160a01b03169383019390935260029092015491810191909152905092915050565b6000610477610c5d565b61048082610cb7565b5060015b919050565b606060006104976007610d75565b90508084106104a657506103b8565b60006104b2848661178e565b9050808210156104bf5750805b6104c985826117a1565b67ffffffffffffffff8111156104e1576104e16114e5565b60405190808252806020026020018201604052801561050a578160200160208202803683370190505b50925060005b835181101561056a5761052e610526828861178e565b600790610c2f565b84828151811061054057610540611762565b6001600160a01b039092166020928302919091019091015280610562816117b4565b915050610510565b50505092915050565b6000610580600784610c3b565b6105e15760405162461bcd60e51b815260206004820152602760248201527f5061796d656e747352656769737472793a20546f6b656e206e6f742077686974604482015266195b1a5cdd195960ca1b60648201526084015b60405180910390fd5b6001600160a01b0383166000908152600360205260409020548210156106495760405162461bcd60e51b815260206004820152601f60248201527f5061796d656e747352656769737472793a20416d6f756e74206c74206d696e0060448201526064016105d8565b6001600160a01b0383166000908152600460205260409020548211156106b15760405162461bcd60e51b815260206004820152601f60248201527f5061796d656e747352656769737472793a20416d6f756e74206774206d61780060448201526064016105d8565b6001546106cd906001600160a01b038581169133911685610d7f565b336000818152600a6020908152604080832081516060810183524281526001600160a01b038981168286018181528386018b8152855460018082018855968a52888a2095516003909102909501948555905194840180546001600160a01b0319169590931694909417909155915160029091015593835260098252808320938352929052205461075e90839061178e565b3360009081526009602090815260408083206001600160a01b038816845282528083209390935560029052205461079690839061178e565b6001600160a01b03848116600081815260026020908152604091829020949094556001549051868152919392169133917f4174a9435a04d04d274c76779cad136a41fde6937c56241c09ab9d3c7064a1a9910160405180910390a450600192915050565b60006103b8600583610c3b565b60006108136005610d75565b905090565b610820610c5d565b61082a6000610ddf565b565b6000610836610c5d565b60005b82518110156108ac57600083828151811061085657610856611762565b60200260200101519050610874816007610e2f90919063ffffffff16565b506001600160a01b031660009081526003602090815260408083208390556004909152812055806108a4816117b4565b915050610839565b507f9e2042698eb108b3e7f74d6978167f0515472149778d18491884767ecca2201b826040516108dc9190611465565b60405180910390a1506001919050565b60006108136007610d75565b6000610902610c5d565b61048082610e44565b606060006109196005610d75565b905080841061092857506103b8565b6000610934848661178e565b9050808210156109415750805b61094b85826117a1565b67ffffffffffffffff811115610963576109636114e5565b60405190808252806020026020018201604052801561098c578160200160208202803683370190505b50925060005b835181101561056a576109b06109a8828861178e565b600590610c2f565b8482815181106109c2576109c2611762565b6001600160a01b0390921660209283029190910190910152806109e4816117b4565b915050610992565b60006103b8600583610c2f565b6001600160a01b0383166000908152600a60209081526040808320805482518185028101850190935280835260609493849084015b82821015610a835760008481526020908190206040805160608101825260038602909201805483526001808201546001600160a01b031684860152600290910154918301919091529083529092019101610a2e565b505082519293505050808510610a9a575050610b9a565b6000610aa6858761178e565b905080821015610ab35750805b610abd86826117a1565b67ffffffffffffffff811115610ad557610ad56114e5565b604051908082528060200260200182016040528015610b3357816020015b610b2060405180606001604052806000815260200160006001600160a01b03168152602001600081525090565b815260200190600190039081610af35790505b50935060005b8451811015610b955783610b4d828961178e565b81518110610b5d57610b5d611762565b6020026020010151858281518110610b7757610b77611762565b60200260200101819052508080610b8d906117b4565b915050610b39565b505050505b9392505050565b610ba9610c5d565b6001600160a01b038116610c0e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105d8565b610c1781610ddf565b50565b6000610b9a836001600160a01b038416610fd1565b6000610b9a8383611020565b6001600160a01b03811660009081526001830160205260408120541515610b9a565b6000546001600160a01b0316331461082a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105d8565b6001600160a01b038116610d205760405162461bcd60e51b815260206004820152602a60248201527f5061796d656e747352656769737472793a204d756c7469736967206973207a65604482015269726f206164647265737360b01b60648201526084016105d8565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f6d74d31357c421bb05a45b4becf09f03737979c1150bb0054704d1b4f31bb82a906020015b60405180910390a150565b60006103b8825490565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610dd990859061104a565b50505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610b9a836001600160a01b038416611121565b60005b8151811015610fa1576000828281518110610e6457610e64611762565b602090810291909101015180519091506001600160a01b0316610ee15760405162461bcd60e51b815260206004820152602f60248201527f5061796d656e747352656769737472793a205061796d656e7420746f6b656e2060448201526e6973207a65726f206164647265737360881b60648201526084016105d8565b806020015181604001511015610f395760405162461bcd60e51b815260206004820152601c60248201527f5061796d656e747352656769737472793a204d6178206c74206d696e0000000060448201526064016105d8565b8051610f4790600790610c1a565b508051610f5690600590610c1a565b5060208082015182516001600160a01b039081166000908152600384526040808220939093558285015194519091168152600490925290205580610f99816117b4565b915050610e47565b507f668ce6e4e789eeb25b47fd3c0fe52d47e6b47f4876244e11027280afd4acf84581604051610d6a91906117cd565b6000818152600183016020526040812054611018575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556103b8565b5060006103b8565b600082600001828154811061103757611037611762565b9060005260206000200154905092915050565b600061109f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166112149092919063ffffffff16565b80519091501561111c57808060200190518101906110bd919061182f565b61111c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105d8565b505050565b6000818152600183016020526040812054801561120a5760006111456001836117a1565b8554909150600090611159906001906117a1565b90508181146111be57600086600001828154811061117957611179611762565b906000526020600020015490508087600001848154811061119c5761119c611762565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806111cf576111cf611851565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506103b8565b60009150506103b8565b6060611223848460008561122b565b949350505050565b60608247101561128c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016105d8565b600080866001600160a01b031685876040516112a8919061188b565b60006040518083038185875af1925050503d80600081146112e5576040519150601f19603f3d011682016040523d82523d6000602084013e6112ea565b606091505b50915091506112fb87838387611306565b979650505050505050565b6060831561137557825160000361136e576001600160a01b0385163b61136e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105d8565b5081611223565b611223838381511561138a5781518083602001fd5b8060405162461bcd60e51b81526004016105d891906118a7565b6000602082840312156113b657600080fd5b5035919050565b80356001600160a01b038116811461048457600080fd5b6000602082840312156113e657600080fd5b610b9a826113bd565b6000806040838503121561140257600080fd5b61140b836113bd565b946020939093013593505050565b815181526020808301516001600160a01b03169082015260408083015190820152606081016103b8565b6000806040838503121561145657600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156114a65783516001600160a01b031683529284019291840191600101611481565b50909695505050505050565b600080604083850312156114c557600080fd5b6114ce836113bd565b91506114dc602084016113bd565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561151e5761151e6114e5565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561154d5761154d6114e5565b604052919050565b600067ffffffffffffffff82111561156f5761156f6114e5565b5060051b60200190565b6000602080838503121561158c57600080fd5b823567ffffffffffffffff8111156115a357600080fd5b8301601f810185136115b457600080fd5b80356115c76115c282611555565b611524565b81815260059190911b820183019083810190878311156115e657600080fd5b928401925b828410156112fb576115fc846113bd565b825292840192908401906115eb565b6000602080838503121561161e57600080fd5b823567ffffffffffffffff81111561163557600080fd5b8301601f8101851361164657600080fd5b80356116546115c282611555565b8181526060918202830184019184820191908884111561167357600080fd5b938501935b838510156116c45780858a0312156116905760008081fd5b6116986114fb565b6116a1866113bd565b815285870135878201526040808701359082015283529384019391850191611678565b50979650505050505050565b6000806000606084860312156116e557600080fd5b6116ee846113bd565b95602085013595506040909401359392505050565b6020808252825182820181905260009190848201906040850190845b818110156114a65761174f838551805182526020808201516001600160a01b031690830152604090810151910152565b928401926060929092019160010161171f565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156103b8576103b8611778565b818103818111156103b8576103b8611778565b6000600182016117c6576117c6611778565b5060010190565b602080825282518282018190526000919060409081850190868401855b8281101561182257815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016117ea565b5091979650505050505050565b60006020828403121561184157600080fd5b81518015158114610b9a57600080fd5b634e487b7160e01b600052603160045260246000fd5b60005b8381101561188257818101518382015260200161186a565b50506000910152565b6000825161189d818460208701611867565b9190910192915050565b60208152600082518060208401526118c6816040850160208701611867565b601f01601f1916919091016040019291505056fea264697066735822122002cd2f36c6e24b95a821b034a600a36df7ca8b0bed5f134205c0ad617f82d81a64736f6c634300081100330000000000000000000000009a6337a0d555eb9fe08a0c40acb15e0e89484cf400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000ba43b7400000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000ba43b7400
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c8063715018a6116100c3578063c7faed5f1161007c578063c7faed5f14610309578063cdf8746b14610332578063de66084114610345578063e62e032414610358578063f2fde38b14610378578063fbe025aa1461038b57600080fd5b8063715018a6146102a057806377f88cb2146102aa578063847b3e0d146102bd57806385eff3ff146102c55780638da5cb5b146102d857806395a5cb65146102e957600080fd5b806336e244511161011557806336e24451146101f85780633febd681146102265780634783c35b1461025f57806347e7ef241461027257806349bc448f14610285578063561410e81461029857600080fd5b80630bb1f0ee1461015257806312c060401461018257806316edcfa5146101a55780632929c25c146101c55780632c5ba562146101d8575b600080fd5b6101656101603660046113a4565b6103ab565b6040516001600160a01b0390911681526020015b60405180910390f35b6101956101903660046113d4565b6103be565b6040519015158152602001610179565b6101b86101b33660046113ef565b6103cb565b6040516101799190611419565b6101956101d33660046113d4565b61046d565b6101eb6101e6366004611443565b610489565b6040516101799190611465565b6102186102063660046113d4565b60046020526000908152604090205481565b604051908152602001610179565b6102186102343660046114b2565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b600154610165906001600160a01b031681565b6101956102803660046113ef565b610573565b6101956102933660046113d4565b6107fa565b610218610807565b6102a8610818565b005b6101956102b8366004611579565b61082c565b6102186108ec565b6101956102d336600461160b565b6108f8565b6000546001600160a01b0316610165565b6102186102f73660046113d4565b60036020526000908152604090205481565b6102186103173660046113d4565b6001600160a01b03166000908152600a602052604090205490565b6101eb610340366004611443565b61090b565b6101656103533660046113a4565b6109ec565b61036b6103663660046116d0565b6109f9565b6040516101799190611703565b6102a86103863660046113d4565b610ba1565b6102186103993660046113d4565b60026020526000908152604090205481565b60006103b8600783610c2f565b92915050565b60006103b8600783610c3b565b6103f860405180606001604052806000815260200160006001600160a01b03168152602001600081525090565b6001600160a01b0383166000908152600a6020526040902080548390811061042257610422611762565b60009182526020918290206040805160608101825260039093029091018054835260018101546001600160a01b03169383019390935260029092015491810191909152905092915050565b6000610477610c5d565b61048082610cb7565b5060015b919050565b606060006104976007610d75565b90508084106104a657506103b8565b60006104b2848661178e565b9050808210156104bf5750805b6104c985826117a1565b67ffffffffffffffff8111156104e1576104e16114e5565b60405190808252806020026020018201604052801561050a578160200160208202803683370190505b50925060005b835181101561056a5761052e610526828861178e565b600790610c2f565b84828151811061054057610540611762565b6001600160a01b039092166020928302919091019091015280610562816117b4565b915050610510565b50505092915050565b6000610580600784610c3b565b6105e15760405162461bcd60e51b815260206004820152602760248201527f5061796d656e747352656769737472793a20546f6b656e206e6f742077686974604482015266195b1a5cdd195960ca1b60648201526084015b60405180910390fd5b6001600160a01b0383166000908152600360205260409020548210156106495760405162461bcd60e51b815260206004820152601f60248201527f5061796d656e747352656769737472793a20416d6f756e74206c74206d696e0060448201526064016105d8565b6001600160a01b0383166000908152600460205260409020548211156106b15760405162461bcd60e51b815260206004820152601f60248201527f5061796d656e747352656769737472793a20416d6f756e74206774206d61780060448201526064016105d8565b6001546106cd906001600160a01b038581169133911685610d7f565b336000818152600a6020908152604080832081516060810183524281526001600160a01b038981168286018181528386018b8152855460018082018855968a52888a2095516003909102909501948555905194840180546001600160a01b0319169590931694909417909155915160029091015593835260098252808320938352929052205461075e90839061178e565b3360009081526009602090815260408083206001600160a01b038816845282528083209390935560029052205461079690839061178e565b6001600160a01b03848116600081815260026020908152604091829020949094556001549051868152919392169133917f4174a9435a04d04d274c76779cad136a41fde6937c56241c09ab9d3c7064a1a9910160405180910390a450600192915050565b60006103b8600583610c3b565b60006108136005610d75565b905090565b610820610c5d565b61082a6000610ddf565b565b6000610836610c5d565b60005b82518110156108ac57600083828151811061085657610856611762565b60200260200101519050610874816007610e2f90919063ffffffff16565b506001600160a01b031660009081526003602090815260408083208390556004909152812055806108a4816117b4565b915050610839565b507f9e2042698eb108b3e7f74d6978167f0515472149778d18491884767ecca2201b826040516108dc9190611465565b60405180910390a1506001919050565b60006108136007610d75565b6000610902610c5d565b61048082610e44565b606060006109196005610d75565b905080841061092857506103b8565b6000610934848661178e565b9050808210156109415750805b61094b85826117a1565b67ffffffffffffffff811115610963576109636114e5565b60405190808252806020026020018201604052801561098c578160200160208202803683370190505b50925060005b835181101561056a576109b06109a8828861178e565b600590610c2f565b8482815181106109c2576109c2611762565b6001600160a01b0390921660209283029190910190910152806109e4816117b4565b915050610992565b60006103b8600583610c2f565b6001600160a01b0383166000908152600a60209081526040808320805482518185028101850190935280835260609493849084015b82821015610a835760008481526020908190206040805160608101825260038602909201805483526001808201546001600160a01b031684860152600290910154918301919091529083529092019101610a2e565b505082519293505050808510610a9a575050610b9a565b6000610aa6858761178e565b905080821015610ab35750805b610abd86826117a1565b67ffffffffffffffff811115610ad557610ad56114e5565b604051908082528060200260200182016040528015610b3357816020015b610b2060405180606001604052806000815260200160006001600160a01b03168152602001600081525090565b815260200190600190039081610af35790505b50935060005b8451811015610b955783610b4d828961178e565b81518110610b5d57610b5d611762565b6020026020010151858281518110610b7757610b77611762565b60200260200101819052508080610b8d906117b4565b915050610b39565b505050505b9392505050565b610ba9610c5d565b6001600160a01b038116610c0e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105d8565b610c1781610ddf565b50565b6000610b9a836001600160a01b038416610fd1565b6000610b9a8383611020565b6001600160a01b03811660009081526001830160205260408120541515610b9a565b6000546001600160a01b0316331461082a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105d8565b6001600160a01b038116610d205760405162461bcd60e51b815260206004820152602a60248201527f5061796d656e747352656769737472793a204d756c7469736967206973207a65604482015269726f206164647265737360b01b60648201526084016105d8565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f6d74d31357c421bb05a45b4becf09f03737979c1150bb0054704d1b4f31bb82a906020015b60405180910390a150565b60006103b8825490565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610dd990859061104a565b50505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610b9a836001600160a01b038416611121565b60005b8151811015610fa1576000828281518110610e6457610e64611762565b602090810291909101015180519091506001600160a01b0316610ee15760405162461bcd60e51b815260206004820152602f60248201527f5061796d656e747352656769737472793a205061796d656e7420746f6b656e2060448201526e6973207a65726f206164647265737360881b60648201526084016105d8565b806020015181604001511015610f395760405162461bcd60e51b815260206004820152601c60248201527f5061796d656e747352656769737472793a204d6178206c74206d696e0000000060448201526064016105d8565b8051610f4790600790610c1a565b508051610f5690600590610c1a565b5060208082015182516001600160a01b039081166000908152600384526040808220939093558285015194519091168152600490925290205580610f99816117b4565b915050610e47565b507f668ce6e4e789eeb25b47fd3c0fe52d47e6b47f4876244e11027280afd4acf84581604051610d6a91906117cd565b6000818152600183016020526040812054611018575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556103b8565b5060006103b8565b600082600001828154811061103757611037611762565b9060005260206000200154905092915050565b600061109f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166112149092919063ffffffff16565b80519091501561111c57808060200190518101906110bd919061182f565b61111c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105d8565b505050565b6000818152600183016020526040812054801561120a5760006111456001836117a1565b8554909150600090611159906001906117a1565b90508181146111be57600086600001828154811061117957611179611762565b906000526020600020015490508087600001848154811061119c5761119c611762565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806111cf576111cf611851565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506103b8565b60009150506103b8565b6060611223848460008561122b565b949350505050565b60608247101561128c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016105d8565b600080866001600160a01b031685876040516112a8919061188b565b60006040518083038185875af1925050503d80600081146112e5576040519150601f19603f3d011682016040523d82523d6000602084013e6112ea565b606091505b50915091506112fb87838387611306565b979650505050505050565b6060831561137557825160000361136e576001600160a01b0385163b61136e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105d8565b5081611223565b611223838381511561138a5781518083602001fd5b8060405162461bcd60e51b81526004016105d891906118a7565b6000602082840312156113b657600080fd5b5035919050565b80356001600160a01b038116811461048457600080fd5b6000602082840312156113e657600080fd5b610b9a826113bd565b6000806040838503121561140257600080fd5b61140b836113bd565b946020939093013593505050565b815181526020808301516001600160a01b03169082015260408083015190820152606081016103b8565b6000806040838503121561145657600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156114a65783516001600160a01b031683529284019291840191600101611481565b50909695505050505050565b600080604083850312156114c557600080fd5b6114ce836113bd565b91506114dc602084016113bd565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561151e5761151e6114e5565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561154d5761154d6114e5565b604052919050565b600067ffffffffffffffff82111561156f5761156f6114e5565b5060051b60200190565b6000602080838503121561158c57600080fd5b823567ffffffffffffffff8111156115a357600080fd5b8301601f810185136115b457600080fd5b80356115c76115c282611555565b611524565b81815260059190911b820183019083810190878311156115e657600080fd5b928401925b828410156112fb576115fc846113bd565b825292840192908401906115eb565b6000602080838503121561161e57600080fd5b823567ffffffffffffffff81111561163557600080fd5b8301601f8101851361164657600080fd5b80356116546115c282611555565b8181526060918202830184019184820191908884111561167357600080fd5b938501935b838510156116c45780858a0312156116905760008081fd5b6116986114fb565b6116a1866113bd565b815285870135878201526040808701359082015283529384019391850191611678565b50979650505050505050565b6000806000606084860312156116e557600080fd5b6116ee846113bd565b95602085013595506040909401359392505050565b6020808252825182820181905260009190848201906040850190845b818110156114a65761174f838551805182526020808201516001600160a01b031690830152604090810151910152565b928401926060929092019160010161171f565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156103b8576103b8611778565b818103818111156103b8576103b8611778565b6000600182016117c6576117c6611778565b5060010190565b602080825282518282018190526000919060409081850190868401855b8281101561182257815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016117ea565b5091979650505050505050565b60006020828403121561184157600080fd5b81518015158114610b9a57600080fd5b634e487b7160e01b600052603160045260246000fd5b60005b8381101561188257818101518382015260200161186a565b50506000910152565b6000825161189d818460208701611867565b9190910192915050565b60208152600082518060208401526118c6816040850160208701611867565b601f01601f1916919091016040019291505056fea264697066735822122002cd2f36c6e24b95a821b034a600a36df7ca8b0bed5f134205c0ad617f82d81a64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009a6337a0d555eb9fe08a0c40acb15e0e89484cf400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000ba43b7400000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000ba43b7400
-----Decoded View---------------
Arg [0] : multisig_ (address): 0x9A6337a0d555Eb9fE08A0C40ACB15E0e89484cF4
Arg [1] : paymentTokens_ (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000009a6337a0d555eb9fe08a0c40acb15e0e89484cf4
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [4] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [5] : 0000000000000000000000000000000000000000000000000000000ba43b7400
Arg [6] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [7] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [8] : 0000000000000000000000000000000000000000000000000000000ba43b7400
Deployed Bytecode Sourcemap
243:6697:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3112:136;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;363:32:8;;;345:51;;333:2;318:18;3112:136:0;;;;;;;;3254:147;;;;;;:::i;:::-;;:::i;:::-;;;941:14:8;;934:22;916:41;;904:2;889:18;3254:147:0;776:187:8;1422:160:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5816:141::-;;;;;;:::i;:::-;;:::i;3407:510::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;756:63::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2771:25:8;;;2759:2;2744:18;756:63:0;2625:177:8;1094:173:0;;;;;;:::i;:::-;-1:-1:-1;;;;;1214:39:0;;;1188:7;1214:39;;;:28;:39;;;;;;;;:46;;;;;;;;;;;;;1094:173;599:23;;;;;-1:-1:-1;;;;;599:23:0;;;4374:804;;;;;;:::i;:::-;;:::i;2391:129::-;;;;;;:::i;:::-;;:::i;2152:109::-;;;:::i;1831:101:1:-;;;:::i;:::-;;5363:447:0;;;;;;:::i;:::-;;:::i;2979:127::-;;;:::i;5184:173::-;;;;;;:::i;:::-;;:::i;1201:85:1:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:1;1201:85;;687:63:0;;;;;;:::i;:::-;;;;;;;;;;;;;;1273:143;;;;;;:::i;:::-;-1:-1:-1;;;;;1373:29:0;1347:7;1373:29;;;:18;:29;;;;;:36;;1273:143;2526:447;;;;;;:::i;:::-;;:::i;2267:118::-;;;;;;:::i;:::-;;:::i;1588:558::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2081:198:1:-;;;;;;:::i;:::-;;:::i;628:53:0:-;;;;;;:::i;:::-;;;;;;;;;;;;;;3112:136;3182:7;3208:33;:23;3235:5;3208:26;:33::i;:::-;3201:40;3112:136;-1:-1:-1;;3112:136:0:o;3254:147::-;3332:4;3355:39;:23;3388:5;3355:32;:39::i;1422:160::-;1506:14;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1506:14:0;-1:-1:-1;;;;;1539:29:0;;;;;;:18;:29;;;;;:36;;1569:5;;1539:36;;;;;;:::i;:::-;;;;;;;;;;1532:43;;;;;;;;1539:36;;;;;;;1532:43;;;;;;;;-1:-1:-1;;;;;1532:43:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1422:160:0;;;;:::o;5816:141::-;5887:4;1094:13:1;:11;:13::i;:::-;5903:26:0::1;5919:9;5903:15;:26::i;:::-;-1:-1:-1::0;5946:4:0::1;1117:1:1;5816:141:0::0;;;:::o;3407:510::-;3497:23;3532:29;3564:32;:23;:30;:32::i;:::-;3532:64;;3620:21;3610:6;:31;3606:50;;3643:13;;;3606:50;3666:10;3679:14;3688:5;3679:6;:14;:::i;:::-;3666:27;;3731:2;3707:21;:26;3703:58;;;-1:-1:-1;3740:21:0;3703:58;3794:11;3799:6;3794:2;:11;:::i;:::-;3780:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3780:26:0;;3771:35;;3821:9;3816:94;3840:6;:13;3836:1;:17;3816:94;;;3872:38;3899:10;3908:1;3899:6;:10;:::i;:::-;3872:23;;:26;:38::i;:::-;3860:6;3867:1;3860:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3860:50:0;;;:9;;;;;;;;;;;:50;3855:3;;;;:::i;:::-;;;;3816:94;;;;3522:395;;3407:510;;;;:::o;4374:804::-;4440:4;4464:39;:23;4497:5;4464:32;:39::i;:::-;4456:91;;;;-1:-1:-1;;;4456:91:0;;8047:2:8;4456:91:0;;;8029:21:8;8086:2;8066:18;;;8059:30;8125:34;8105:18;;;8098:62;-1:-1:-1;;;8176:18:8;;;8169:37;8223:19;;4456:91:0;;;;;;;;;-1:-1:-1;;;;;4575:35:0;;;;;;:28;:35;;;;;;4565:45;;;4557:89;;;;-1:-1:-1;;;4557:89:0;;8455:2:8;4557:89:0;;;8437:21:8;8494:2;8474:18;;;8467:30;8533:33;8513:18;;;8506:61;8584:18;;4557:89:0;8253:355:8;4557:89:0;-1:-1:-1;;;;;4674:35:0;;;;;;:28;:35;;;;;;4664:45;;;4656:89;;;;-1:-1:-1;;;4656:89:0;;8815:2:8;4656:89:0;;;8797:21:8;8854:2;8834:18;;;8827:30;8893:33;8873:18;;;8866:61;8944:18;;4656:89:0;8613:355:8;4656:89:0;4798:8;;4755:60;;-1:-1:-1;;;;;4755:30:0;;;;4786:10;;4798:8;4808:6;4755:30;:60::i;:::-;4844:10;4825:30;;;;:18;:30;;;;;;;;4861:39;;;;;;;4869:15;4861:39;;-1:-1:-1;;;;;4861:39:0;;;;;;;;;;;;;;;4825:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4825:76:0;;;;;;;;;;;;;;;;;;;4961:40;;;:28;:40;;;;;:47;;;;;;;;:56;;4861:39;;4961:56;:::i;:::-;4940:10;4911:40;;;;:28;:40;;;;;;;;-1:-1:-1;;;;;4911:47:0;;;;;;;;;:106;;;;5055:18;:25;;;;:34;;5083:6;;5055:34;:::i;:::-;-1:-1:-1;;;;;5027:25:0;;;;;;;:18;:25;;;;;;;;;:62;;;;5126:8;;5104:46;;2771:25:8;;;5027::0;;5126:8;;;5114:10;;5104:46;;2744:18:8;5104:46:0;;;;;;;-1:-1:-1;5167:4:0;4374:804;;;;:::o;2391:129::-;2460:4;2483:30;:14;2507:5;2483:23;:30::i;2152:109::-;2205:7;2231:23;:14;:21;:23::i;:::-;2224:30;;2152:109;:::o;1831:101:1:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;5363:447:0:-;5455:4;1094:13:1;:11;:13::i;:::-;5476:9:0::1;5471:259;5495:7;:14;5491:1;:18;5471:259;;;5530:13;5546:7;5554:1;5546:10;;;;;;;;:::i;:::-;;;;;;;5530:26;;5570:37;5601:5;5570:23;:30;;:37;;;;:::i;:::-;-1:-1:-1::0;;;;;;5628:35:0::1;;::::0;;;:28:::1;:35;::::0;;;;;;;5621:42;;;5684:28:::1;:35:::0;;;;;5677:42;5511:3;::::1;::::0;::::1;:::i;:::-;;;;5471:259;;;;5744:38;5774:7;5744:38;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;5799:4:0::1;5363:447:::0;;;:::o;2979:127::-;3041:7;3067:32;:23;:30;:32::i;5184:173::-;5278:4;1094:13:1;:11;:13::i;:::-;5294:35:0::1;5321:7;5294:26;:35::i;2526:447::-:0;2607:23;2642:20;2665:23;:14;:21;:23::i;:::-;2642:46;;2712:12;2702:6;:22;2698:41;;2726:13;;;2698:41;2749:10;2762:14;2771:5;2762:6;:14;:::i;:::-;2749:27;;2805:2;2790:12;:17;2786:40;;;-1:-1:-1;2814:12:0;2786:40;2859:11;2864:6;2859:2;:11;:::i;:::-;2845:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2845:26:0;;2836:35;;2886:9;2881:85;2905:6;:13;2901:1;:17;2881:85;;;2937:29;2955:10;2964:1;2955:6;:10;:::i;:::-;2937:14;;:17;:29::i;:::-;2925:6;2932:1;2925:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2925:41:0;;;:9;;;;;;;;;;;:41;2920:3;;;;:::i;:::-;;;;2881:85;;2267:118;2328:7;2354:24;:14;2372:5;2354:17;:24::i;1588:558::-;-1:-1:-1;;;;;1785:29:0;;1757:25;1785:29;;;:18;:29;;;;;;;;1757:57;;;;;;;;;;;;;;;;;1722:23;;1757:25;;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1757:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1849:15:0;;1757:57;;-1:-1:-1;;;1878:24:0;;;1874:43;;1904:13;;;;1874:43;1927:10;1940:14;1949:5;1940:6;:14;:::i;:::-;1927:27;;1985:2;1968:14;:19;1964:44;;;-1:-1:-1;1994:14:0;1964:44;2041:11;2046:6;2041:2;:11;:::i;:::-;2027:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2027:26:0;;;;;;;;;;;;;;;;;2018:35;;2068:9;2063:76;2087:6;:13;2083:1;:17;2063:76;;;2119:8;2128:10;2137:1;2128:6;:10;:::i;:::-;2119:20;;;;;;;;:::i;:::-;;;;;;;2107:6;2114:1;2107:9;;;;;;;;:::i;:::-;;;;;;:32;;;;2102:3;;;;;:::i;:::-;;;;2063:76;;;;1747:399;;;1588:558;;;;;;:::o;2081:198:1:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:1;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:1;;9175:2:8;2161:73:1::1;::::0;::::1;9157:21:8::0;9214:2;9194:18;;;9187:30;9253:34;9233:18;;;9226:62;-1:-1:-1;;;9304:18:8;;;9297:36;9350:19;;2161:73:1::1;8973:402:8::0;2161:73:1::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;8297:150:7:-;8367:4;8390:50;8395:3;-1:-1:-1;;;;;8415:23:7;;8390:4;:50::i;9555:156::-;9629:7;9679:22;9683:3;9695:5;9679:3;:22::i;8852:165::-;-1:-1:-1;;;;;8985:23:7;;8932:4;4343:19;;;:12;;;:19;;;;;;:24;;8955:55;4247:127;1359:130:1;1247:7;1273:6;-1:-1:-1;;;;;1273:6:1;719:10:6;1422:23:1;1414:68;;;;-1:-1:-1;;;1414:68:1;;9582:2:8;1414:68:1;;;9564:21:8;;;9601:18;;;9594:30;9660:34;9640:18;;;9633:62;9712:18;;1414:68:1;9380:356:8;5963:218:0;-1:-1:-1;;;;;6033:23:0;;6025:78;;;;-1:-1:-1;;;6025:78:0;;9943:2:8;6025:78:0;;;9925:21:8;9982:2;9962:18;;;9955:30;10021:34;10001:18;;;9994:62;-1:-1:-1;;;10072:18:8;;;10065:40;10122:19;;6025:78:0;9741:406:8;6025:78:0;6113:8;:20;;-1:-1:-1;;;;;;6113:20:0;-1:-1:-1;;;;;6113:20:0;;;;;;;;6148:26;;345:51:8;;;6148:26:0;;333:2:8;318:18;6148:26:0;;;;;;;;5963:218;:::o;9098:115:7:-;9161:7;9187:19;9195:3;4537:18;;4455:107;974:241:4;1139:68;;;-1:-1:-1;;;;;10410:15:8;;;1139:68:4;;;10392:34:8;10462:15;;10442:18;;;10435:43;10494:18;;;;10487:34;;;1139:68:4;;;;;;;;;;10327:18:8;;;;1139:68:4;;;;;;;;-1:-1:-1;;;;;1139:68:4;-1:-1:-1;;;1139:68:4;;;1112:96;;1132:5;;1112:19;:96::i;:::-;974:241;;;;:::o;2433:187:1:-;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:1;;;-1:-1:-1;;;;;;2541:17:1;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;8615:156:7:-;8688:4;8711:53;8719:3;-1:-1:-1;;;;;8739:23:7;;8711:7;:53::i;6187:751:0:-;6277:9;6272:609;6296:7;:14;6292:1;:18;6272:609;;;6331:29;6363:7;6371:1;6363:10;;;;;;;;:::i;:::-;;;;;;;;;;;6395:15;;6363:10;;-1:-1:-1;;;;;;6395:29:0;6387:89;;;;-1:-1:-1;;;6387:89:0;;10734:2:8;6387:89:0;;;10716:21:8;10773:2;10753:18;;;10746:30;10812:34;10792:18;;;10785:62;-1:-1:-1;;;10863:18:8;;;10856:45;10918:19;;6387:89:0;10532:411:8;6387:89:0;6528:9;:26;;;6498:9;:26;;;:56;;6490:97;;;;-1:-1:-1;;;6490:97:0;;11150:2:8;6490:97:0;;;11132:21:8;11189:2;11169:18;;;11162:30;11228;11208:18;;;11201:58;11276:18;;6490:97:0;10948:352:8;6490:97:0;6629:15;;6601:44;;:23;;:27;:44::i;:::-;-1:-1:-1;6678:15:0;;6659:35;;:14;;:18;:35::i;:::-;-1:-1:-1;6756:26:0;;;;;6737:15;;-1:-1:-1;;;;;6708:45:0;;;;;;;:28;:45;;;;;;:74;;;;6844:26;;;;6825:15;;6796:45;;;;;:28;:45;;;;;:74;6312:3;;;;:::i;:::-;;;;6272:609;;;;6895:36;6923:7;6895:36;;;;;;:::i;2206:404:7:-;2269:4;4343:19;;;:12;;;:19;;;;;;2285:319;;-1:-1:-1;2327:23:7;;;;;;;;:11;:23;;;;;;;;;;;;;2507:18;;2485:19;;;:12;;;:19;;;;;;:40;;;;2539:11;;2285:319;-1:-1:-1;2588:5:7;2581:12;;4904:118;4971:7;4997:3;:11;;5009:5;4997:18;;;;;;;;:::i;:::-;;;;;;;;;4990:25;;4904:118;;;;:::o;3747:706:4:-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;-1:-1:-1;;;;;4192:27:4;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:4;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;-1:-1:-1;;;4351:85:4;;12669:2:8;4351:85:4;;;12651:21:8;12708:2;12688:18;;;12681:30;12747:34;12727:18;;;12720:62;-1:-1:-1;;;12798:18:8;;;12791:40;12848:19;;4351:85:4;12467:406:8;4351:85:4;3817:636;3747:706;;:::o;2778:1388:7:-;2844:4;2981:19;;;:12;;;:19;;;;;;3015:15;;3011:1149;;3384:21;3408:14;3421:1;3408:10;:14;:::i;:::-;3456:18;;3384:38;;-1:-1:-1;3436:17:7;;3456:22;;3477:1;;3456:22;:::i;:::-;3436:42;;3510:13;3497:9;:26;3493:398;;3543:17;3563:3;:11;;3575:9;3563:22;;;;;;;;:::i;:::-;;;;;;;;;3543:42;;3714:9;3685:3;:11;;3697:13;3685:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;3797:23;;;:12;;;:23;;;;;:36;;;3493:398;3969:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;4061:3;:12;;:19;4074:5;4061:19;;;;;;;;;;;4054:26;;;4102:4;4095:11;;;;;;;3011:1149;4144:5;4137:12;;;;;3873:223:5;4006:12;4037:52;4059:6;4067:4;4073:1;4076:12;4037:21;:52::i;:::-;4030:59;3873:223;-1:-1:-1;;;;3873:223:5:o;4960:446::-;5125:12;5182:5;5157:21;:30;;5149:81;;;;-1:-1:-1;;;5149:81:5;;13212:2:8;5149:81:5;;;13194:21:8;13251:2;13231:18;;;13224:30;13290:34;13270:18;;;13263:62;-1:-1:-1;;;13341:18:8;;;13334:36;13387:19;;5149:81:5;13010:402:8;5149:81:5;5241:12;5255:23;5282:6;-1:-1:-1;;;;;5282:11:5;5301:5;5308:4;5282:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5240:73;;;;5330:69;5357:6;5365:7;5374:10;5386:12;5330:26;:69::i;:::-;5323:76;4960:446;-1:-1:-1;;;;;;;4960:446:5:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;-1:-1:-1;;;;;1465:19:5;;;7908:60;;;;-1:-1:-1;;;7908:60:5;;14166:2:8;7908:60:5;;;14148:21:8;14205:2;14185:18;;;14178:30;14244:31;14224:18;;;14217:59;14293:18;;7908:60:5;13964:353:8;7908:60:5;-1:-1:-1;8003:10:5;7996:17;;7670:418;8044:33;8052:10;8064:12;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:5;;;;;;;;:::i;14:180:8:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:8;;14:180;-1:-1:-1;14:180:8:o;407:173::-;475:20;;-1:-1:-1;;;;;524:31:8;;514:42;;504:70;;570:1;567;560:12;585:186;644:6;697:2;685:9;676:7;672:23;668:32;665:52;;;713:1;710;703:12;665:52;736:29;755:9;736:29;:::i;968:254::-;1036:6;1044;1097:2;1085:9;1076:7;1072:23;1068:32;1065:52;;;1113:1;1110;1103:12;1065:52;1136:29;1155:9;1136:29;:::i;:::-;1126:39;1212:2;1197:18;;;;1184:32;;-1:-1:-1;;;968:254:8:o;1462:242::-;1300:12;;1288:25;;1366:4;1355:16;;;1349:23;-1:-1:-1;;;;;1345:49:8;1329:14;;;1322:73;1444:4;1433:16;;;1427:23;1411:14;;;1404:47;1642:2;1627:18;;1654:44;1227:230;1709:248;1777:6;1785;1838:2;1826:9;1817:7;1813:23;1809:32;1806:52;;;1854:1;1851;1844:12;1806:52;-1:-1:-1;;1877:23:8;;;1947:2;1932:18;;;1919:32;;-1:-1:-1;1709:248:8:o;1962:658::-;2133:2;2185:21;;;2255:13;;2158:18;;;2277:22;;;2104:4;;2133:2;2356:15;;;;2330:2;2315:18;;;2104:4;2399:195;2413:6;2410:1;2407:13;2399:195;;;2478:13;;-1:-1:-1;;;;;2474:39:8;2462:52;;2569:15;;;;2534:12;;;;2510:1;2428:9;2399:195;;;-1:-1:-1;2611:3:8;;1962:658;-1:-1:-1;;;;;;1962:658:8:o;2807:260::-;2875:6;2883;2936:2;2924:9;2915:7;2911:23;2907:32;2904:52;;;2952:1;2949;2942:12;2904:52;2975:29;2994:9;2975:29;:::i;:::-;2965:39;;3023:38;3057:2;3046:9;3042:18;3023:38;:::i;:::-;3013:48;;2807:260;;;;;:::o;3072:127::-;3133:10;3128:3;3124:20;3121:1;3114:31;3164:4;3161:1;3154:15;3188:4;3185:1;3178:15;3204:253;3276:2;3270:9;3318:4;3306:17;;3353:18;3338:34;;3374:22;;;3335:62;3332:88;;;3400:18;;:::i;:::-;3436:2;3429:22;3204:253;:::o;3462:275::-;3533:2;3527:9;3598:2;3579:13;;-1:-1:-1;;3575:27:8;3563:40;;3633:18;3618:34;;3654:22;;;3615:62;3612:88;;;3680:18;;:::i;:::-;3716:2;3709:22;3462:275;;-1:-1:-1;3462:275:8:o;3742:183::-;3802:4;3835:18;3827:6;3824:30;3821:56;;;3857:18;;:::i;:::-;-1:-1:-1;3902:1:8;3898:14;3914:4;3894:25;;3742:183::o;3930:897::-;4014:6;4045:2;4088;4076:9;4067:7;4063:23;4059:32;4056:52;;;4104:1;4101;4094:12;4056:52;4144:9;4131:23;4177:18;4169:6;4166:30;4163:50;;;4209:1;4206;4199:12;4163:50;4232:22;;4285:4;4277:13;;4273:27;-1:-1:-1;4263:55:8;;4314:1;4311;4304:12;4263:55;4350:2;4337:16;4373:60;4389:43;4429:2;4389:43;:::i;:::-;4373:60;:::i;:::-;4467:15;;;4549:1;4545:10;;;;4537:19;;4533:28;;;4498:12;;;;4573:19;;;4570:39;;;4605:1;4602;4595:12;4570:39;4629:11;;;;4649:148;4665:6;4660:3;4657:15;4649:148;;;4731:23;4750:3;4731:23;:::i;:::-;4719:36;;4682:12;;;;4775;;;;4649:148;;4832:1310;4944:6;4975:2;5018;5006:9;4997:7;4993:23;4989:32;4986:52;;;5034:1;5031;5024:12;4986:52;5074:9;5061:23;5107:18;5099:6;5096:30;5093:50;;;5139:1;5136;5129:12;5093:50;5162:22;;5215:4;5207:13;;5203:27;-1:-1:-1;5193:55:8;;5244:1;5241;5234:12;5193:55;5280:2;5267:16;5303:60;5319:43;5359:2;5319:43;:::i;5303:60::-;5397:15;;;5459:4;5498:11;;;5490:20;;5486:29;;;5428:12;;;;5385:3;5527:19;;;5524:39;;;5559:1;5556;5549:12;5524:39;5583:11;;;;5603:509;5619:6;5614:3;5611:15;5603:509;;;5699:2;5693:3;5684:7;5680:17;5676:26;5673:116;;;5743:1;5772:2;5768;5761:14;5673:116;5815:22;;:::i;:::-;5864:23;5883:3;5864:23;:::i;:::-;5850:38;;5937:12;;;5924:26;5908:14;;;5901:50;5974:2;6025:12;;;6012:26;5996:14;;;5989:50;6052:18;;5636:12;;;;6090;;;;5603:509;;;-1:-1:-1;6131:5:8;4832:1310;-1:-1:-1;;;;;;;4832:1310:8:o;6147:322::-;6224:6;6232;6240;6293:2;6281:9;6272:7;6268:23;6264:32;6261:52;;;6309:1;6306;6299:12;6261:52;6332:29;6351:9;6332:29;:::i;:::-;6322:39;6408:2;6393:18;;6380:32;;-1:-1:-1;6459:2:8;6444:18;;;6431:32;;6147:322;-1:-1:-1;;;6147:322:8:o;6474:699::-;6691:2;6743:21;;;6813:13;;6716:18;;;6835:22;;;6662:4;;6691:2;6914:15;;;;6888:2;6873:18;;;6662:4;6957:190;6971:6;6968:1;6965:13;6957:190;;;7020:45;7061:3;7052:6;7046:13;1300:12;;1288:25;;1366:4;1355:16;;;1349:23;-1:-1:-1;;;;;1345:49:8;1329:14;;;1322:73;1444:4;1433:16;;;1427:23;1411:14;;1404:47;1227:230;7020:45;7122:15;;;;7094:4;7085:14;;;;;6993:1;6986:9;6957:190;;7178:127;7239:10;7234:3;7230:20;7227:1;7220:31;7270:4;7267:1;7260:15;7294:4;7291:1;7284:15;7310:127;7371:10;7366:3;7362:20;7359:1;7352:31;7402:4;7399:1;7392:15;7426:4;7423:1;7416:15;7442:125;7507:9;;;7528:10;;;7525:36;;;7541:18;;:::i;7572:128::-;7639:9;;;7660:11;;;7657:37;;;7674:18;;:::i;7705:135::-;7744:3;7765:17;;;7762:43;;7785:18;;:::i;:::-;-1:-1:-1;7832:1:8;7821:13;;7705:135::o;11305:875::-;11532:2;11584:21;;;11654:13;;11557:18;;;11676:22;;;11503:4;;11532:2;11717;;11735:18;;;;11776:15;;;11503:4;11819:335;11833:6;11830:1;11827:13;11819:335;;;11892:13;;11934:9;;-1:-1:-1;;;;;11930:35:8;11918:48;;12006:11;;;12000:18;11986:12;;;11979:40;12059:11;;12053:18;12039:12;;;12032:40;12101:4;12092:14;;;;12129:15;;;;11962:1;11848:9;11819:335;;;-1:-1:-1;12171:3:8;;11305:875;-1:-1:-1;;;;;;;11305:875:8:o;12185:277::-;12252:6;12305:2;12293:9;12284:7;12280:23;12276:32;12273:52;;;12321:1;12318;12311:12;12273:52;12353:9;12347:16;12406:5;12399:13;12392:21;12385:5;12382:32;12372:60;;12428:1;12425;12418:12;12878:127;12939:10;12934:3;12930:20;12927:1;12920:31;12970:4;12967:1;12960:15;12994:4;12991:1;12984:15;13417:250;13502:1;13512:113;13526:6;13523:1;13520:13;13512:113;;;13602:11;;;13596:18;13583:11;;;13576:39;13548:2;13541:10;13512:113;;;-1:-1:-1;;13659:1:8;13641:16;;13634:27;13417:250::o;13672:287::-;13801:3;13839:6;13833:13;13855:66;13914:6;13909:3;13902:4;13894:6;13890:17;13855:66;:::i;:::-;13937:16;;;;;13672:287;-1:-1:-1;;13672:287:8:o;14322:396::-;14471:2;14460:9;14453:21;14434:4;14503:6;14497:13;14546:6;14541:2;14530:9;14526:18;14519:34;14562:79;14634:6;14629:2;14618:9;14614:18;14609:2;14601:6;14597:15;14562:79;:::i;:::-;14702:2;14681:15;-1:-1:-1;;14677:29:8;14662:45;;;;14709:2;14658:54;;14322:396;-1:-1:-1;;14322:396:8:o
Swarm Source
ipfs://02cd2f36c6e24b95a821b034a600a36df7ca8b0bed5f134205c0ad617f82d81a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.