Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 581 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 16017363 | 610 days ago | IN | 0 ETH | 0.00079909 | ||||
Compound | 16016713 | 610 days ago | IN | 0 ETH | 0.00071508 | ||||
Withdraw | 16006539 | 612 days ago | IN | 0 ETH | 0.00106047 | ||||
Withdraw | 16005710 | 612 days ago | IN | 0 ETH | 0.00084947 | ||||
Withdraw | 16005468 | 612 days ago | IN | 0 ETH | 0.00090568 | ||||
Compound | 16004485 | 612 days ago | IN | 0 ETH | 0.0008274 | ||||
Withdraw | 16004391 | 612 days ago | IN | 0 ETH | 0.00096033 | ||||
Compound | 16004253 | 612 days ago | IN | 0 ETH | 0.00071141 | ||||
Withdraw | 16003206 | 612 days ago | IN | 0 ETH | 0.00072244 | ||||
Compound | 16003206 | 612 days ago | IN | 0 ETH | 0.00067437 | ||||
Compound | 16002986 | 612 days ago | IN | 0 ETH | 0.0007367 | ||||
Withdraw | 16002983 | 612 days ago | IN | 0 ETH | 0.00087441 | ||||
Compound | 16002203 | 612 days ago | IN | 0 ETH | 0.00074855 | ||||
Withdraw | 16002079 | 613 days ago | IN | 0 ETH | 0.00090121 | ||||
Withdraw | 16001223 | 613 days ago | IN | 0 ETH | 0.00094163 | ||||
Withdraw | 16000499 | 613 days ago | IN | 0 ETH | 0.00205238 | ||||
Set Reward Rate | 16000471 | 613 days ago | IN | 0 ETH | 0.00039881 | ||||
Withdraw | 16000434 | 613 days ago | IN | 0 ETH | 0.00591872 | ||||
Compound | 16000421 | 613 days ago | IN | 0 ETH | 0.00081629 | ||||
Set Reward Rate | 16000414 | 613 days ago | IN | 0 ETH | 0.00037218 | ||||
Compound | 16000402 | 613 days ago | IN | 0 ETH | 0.00092131 | ||||
Transfer | 15999756 | 613 days ago | IN | 0 ETH | 0.000291 | ||||
Compound | 15999430 | 613 days ago | IN | 0 ETH | 0.00086637 | ||||
Compound | 15997754 | 613 days ago | IN | 0 ETH | 0.00104095 | ||||
Compound | 15996337 | 613 days ago | IN | 0 ETH | 0.00096653 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BullRunStaking
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-03 */ // SPDX-License-Identifier: Unlicensed pragma solidity ^0.8.9; 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); } // MIT // OpenZeppelin Contracts (last updated v4.7.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://consensys.net/diligence/blog/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); } } } /** * @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"); } } } // MIT // OpenZeppelin Contracts (last updated v4.7.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; } } pragma solidity ^0.8.9; // 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; } } // 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); } // MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; // MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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); } } error InsufficientBalance(uint256 available, uint256 required); error InvalidPool(); error NothingToDo(); contract BullRunStaking is Ownable { using SafeERC20 for IERC20; struct UserInfo { uint256 amount; uint256 rewardDebt; uint256 startTime; uint256 totalRewards; } struct PoolInfo { IERC20 token; uint256 lastRewardTimestamp; uint256 accBRLPerShare; uint256 balance; uint256 rewardSupply; uint256 brlPerSecond; } IERC20 public brl; uint256 public brlPoolIndex; address public bulldozer; PoolInfo[] public poolInfo; mapping(uint256 => mapping(address => UserInfo)) public userInfo; uint256 public startTime; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Compound(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); constructor(IERC20 _brl, uint256 _startTime, address _bulldozer) { brl = _brl; startTime = _startTime; bulldozer = _bulldozer; } function poolLength() external view returns (uint256) { return poolInfo.length; } function add(IERC20 _token, uint256 _rewardSupply, uint256 _brlPerSecond) public onlyOwner { uint256 lastRewardTimestamp = block.timestamp > startTime ? block.timestamp : startTime; uint256 balBefore = brl.balanceOf(address(this)); brl.transferFrom(msg.sender, address(this), _rewardSupply); uint256 amountReceived = brl.balanceOf(address(this)) - balBefore; poolInfo.push( PoolInfo({ token: _token, lastRewardTimestamp: lastRewardTimestamp, accBRLPerShare: 0, balance: 0, rewardSupply: amountReceived, brlPerSecond: _brlPerSecond }) ); } function setRewardRate(uint256 _pid, uint256 _brlPerSecond) public onlyOwner { poolInfo[_pid].brlPerSecond = _brlPerSecond; } function supplyRewards(uint256 _pid, uint256 _amount) external { uint256 balBefore = brl.balanceOf(address(this)); brl.transferFrom(msg.sender, address(this), _amount); uint256 amountReceived = brl.balanceOf(address(this)) - balBefore; poolInfo[_pid].rewardSupply += amountReceived; } function pendingBRL(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accBRLPerShare = pool.accBRLPerShare; uint256 balance = pool.balance; uint256 lastRewardTimestamp = pool.lastRewardTimestamp; if (block.timestamp > lastRewardTimestamp && balance != 0) { uint256 brlReward = (block.timestamp - lastRewardTimestamp) * pool.brlPerSecond; accBRLPerShare += (brlReward * 1e12 / balance); } return (user.amount * accBRLPerShare / 1e12) - user.rewardDebt; } function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; uint256 timestamp = block.timestamp; if (timestamp <= pool.lastRewardTimestamp) { return; } uint256 balance = pool.balance; if (balance == 0) { pool.lastRewardTimestamp = timestamp; return; } uint256 brlReward = (timestamp - pool.lastRewardTimestamp) * pool.brlPerSecond; pool.accBRLPerShare += (brlReward * 1e12 / balance); pool.lastRewardTimestamp = timestamp; } function deposit(uint256 _pid, uint256 _amount) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { uint256 pending = (user.amount * pool.accBRLPerShare / 1e12) - user.rewardDebt; uint256 amountTransferred = safeBRLTransfer(msg.sender, pending, pool.rewardSupply); pool.rewardSupply -= amountTransferred; user.totalRewards += amountTransferred; } uint256 beforeBal = pool.token.balanceOf(address(this)); pool.token.safeTransferFrom(address(msg.sender), address(this), _amount); uint256 amountReceived = pool.token.balanceOf(address(this)) - beforeBal; //take fees uint256 fee = amountReceived / 50; pool.token.safeTransfer(bulldozer, fee); amountReceived -= fee; //for apy calculations if (user.amount == 0) { user.startTime = block.timestamp; user.totalRewards = 0; } //update balances pool.balance += amountReceived; user.amount += amountReceived; user.rewardDebt = user.amount * pool.accBRLPerShare / 1e12; emit Deposit(msg.sender, _pid, _amount); } function compound(uint256 _pid) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); uint256 pending = (user.amount * pool.accBRLPerShare / 1e12) - user.rewardDebt; if (pending == 0) { revert NothingToDo(); } uint256 rewardSupply = pool.rewardSupply; uint256 paidRewards = pending > rewardSupply ? rewardSupply : pending; pool.rewardSupply -= paidRewards; user.totalRewards += paidRewards; user.rewardDebt = user.amount * pool.accBRLPerShare / 1e12; uint256 totalCompounded = _compound(paidRewards); emit Compound(msg.sender, _pid, totalCompounded); } function _compound(uint256 _amount) internal returns (uint256) { PoolInfo storage pool = poolInfo[brlPoolIndex]; UserInfo storage user = userInfo[brlPoolIndex][msg.sender]; updatePool(brlPoolIndex); uint256 paidRewards; if (user.amount > 0) { uint256 pending = (user.amount * pool.accBRLPerShare / 1e12) - user.rewardDebt; paidRewards = pending > pool.rewardSupply ? pool.rewardSupply : pending; pool.rewardSupply -= paidRewards; user.totalRewards += paidRewards; } uint256 sum = _amount + paidRewards; pool.balance += sum; user.amount += sum; user.rewardDebt = user.amount * pool.accBRLPerShare / 1e12; return sum; } function withdraw(uint256 _pid, uint256 _amount) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; if (_amount > user.amount) { revert InsufficientBalance(user.amount, _amount); } updatePool(_pid); uint256 pending = (user.amount * pool.accBRLPerShare / 1e12) - user.rewardDebt; uint256 amountTransferred = safeBRLTransfer(msg.sender, pending, pool.rewardSupply); pool.rewardSupply -= amountTransferred; user.totalRewards += amountTransferred; pool.balance -= _amount; user.amount -= _amount; user.rewardDebt = user.amount * pool.accBRLPerShare / 1e12; //take fees uint256 fee = _amount / 20; _amount -= fee; pool.token.safeTransfer(bulldozer, fee); pool.token.safeTransfer(address(msg.sender), _amount); emit Withdraw(msg.sender, _pid, _amount); } function emergencyWithdraw(uint256 _pid) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; pool.balance -= amount; user.amount = 0; user.rewardDebt = 0; pool.token.safeTransfer(address(msg.sender), amount); emit EmergencyWithdraw(msg.sender, _pid, amount); } function safeBRLTransfer(address _to, uint256 _amount, uint256 _rewardSupply) internal returns (uint256) { uint256 amountToSend = _amount > _rewardSupply ? _rewardSupply : _amount; brl.transfer(_to, amountToSend); return amountToSend; } function setBRLPoolIndex(uint256 _pid) external onlyOwner { PoolInfo storage pool = poolInfo[_pid]; if (pool.token != brl) { revert InvalidPool(); } brlPoolIndex = _pid; } function setBulldozer(address wallet) external onlyOwner { bulldozer = wallet; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_brl","type":"address"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"address","name":"_bulldozer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidPool","type":"error"},{"inputs":[],"name":"NothingToDo","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Compound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","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":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_rewardSupply","type":"uint256"},{"internalType":"uint256","name":"_brlPerSecond","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"brl","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"brlPoolIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bulldozer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingBRL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accBRLPerShare","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"rewardSupply","type":"uint256"},{"internalType":"uint256","name":"brlPerSecond","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"setBRLPoolIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setBulldozer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_brlPerSecond","type":"uint256"}],"name":"setRewardRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"supplyRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001ba638038062001ba68339810160408190526200003491620000e0565b6200003f3362000077565b600180546001600160a01b039485166001600160a01b0319918216179091556006929092556003805491909316911617905562000128565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000dd57600080fd5b50565b600080600060608486031215620000f657600080fd5b83516200010381620000c7565b6020850151604086015191945092506200011d81620000c7565b809150509250925092565b611a6e80620001386000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806378e97925116100b8578063aa5f7e261161007c578063aa5f7e26146102f7578063caeb113f1461030a578063e2bbb15814610313578063eff8aa0614610326578063f2fde38b14610339578063fb6587231461034c57600080fd5b806378e9792514610257578063792a882a1461026057806379ebd1aa146102735780638da5cb5b1461028657806393f1a40b1461029757600080fd5b806351eb05a61161010a57806351eb05a6146101e35780635312ea8e146101f65780635a859651146102095780635b1a121d14610234578063630b5ba114610247578063715018a61461024f57600080fd5b8063081e3eda146101475780631526fe271461015e5780633462e0a8146101a8578063441a3e70146101bd5780635101e128146101d0575b600080fd5b6004545b6040519081526020015b60405180910390f35b61017161016c3660046117f2565b61035f565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610155565b6101bb6101b636600461180b565b6103af565b005b6101bb6101cb36600461180b565b6103e4565b6101bb6101de366004611842565b6105c5565b6101bb6101f13660046117f2565b6108c4565b6101bb6102043660046117f2565b610972565b60015461021c906001600160a01b031681565b6040516001600160a01b039091168152602001610155565b6101bb6102423660046117f2565b610a2c565b6101bb610a91565b6101bb610abc565b61014b60065481565b6101bb61026e36600461180b565b610ad0565b60035461021c906001600160a01b031681565b6000546001600160a01b031661021c565b6102d76102a5366004611877565b600560209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610155565b6101bb6103053660046117f2565b610ca3565b61014b60025481565b6101bb61032136600461180b565b610df9565b61014b610334366004611877565b6110c0565b6101bb6103473660046118a7565b6111ac565b6101bb61035a3660046118a7565b611225565b6004818154811061036f57600080fd5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b0390941695509193909286565b6103b761124f565b80600483815481106103cb576103cb6118cb565b9060005260206000209060060201600501819055505050565b6000600483815481106103f9576103f96118cb565b60009182526020808320868452600582526040808520338652909252922080546006909202909201925083111561045557805460405163cf47918160e01b81526004810191909152602481018490526044015b60405180910390fd5b61045e846108c4565b6000816001015464e8d4a510008460020154846000015461047f91906118f7565b6104899190611916565b6104939190611938565b905060006104a6338386600401546112a9565b9050808460040160008282546104bc9190611938565b92505081905550808360030160008282546104d7919061194f565b92505081905550848460030160008282546104f29190611938565b909155505082548590849060009061050b908490611938565b90915550506002840154835464e8d4a5100091610527916118f7565b6105319190611916565b60018401556000610543601487611916565b905061054f8187611938565b600354865491975061056e916001600160a01b0390811691168361134c565b8454610584906001600160a01b0316338861134c565b604051868152879033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568906020015b60405180910390a350505050505050565b6105cd61124f565b600060065442116105e0576006546105e2565b425b6001546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561062b57600080fd5b505afa15801561063f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106639190611967565b6001546040516323b872dd60e01b8152336004820152306024820152604481018790529192506001600160a01b0316906323b872dd90606401602060405180830381600087803b1580156106b657600080fd5b505af11580156106ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ee9190611980565b506001546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a082319060240160206040518083038186803b15801561073757600080fd5b505afa15801561074b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076f9190611967565b6107799190611938565b6040805160c0810182526001600160a01b039889168152602081019586526000918101828152606082018381526080830194855260a0830198895260048054600181018255945291517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b600690940293840180546001600160a01b03191691909b161790995594517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c82015596517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d88015592517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e8701555050517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f840155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a09092019190915550565b6000600482815481106108d9576108d96118cb565b906000526020600020906006020190506000429050816001015481116108fe57505050565b600382015480610912575060019091015550565b600083600501548460010154846109299190611938565b61093391906118f7565b9050816109458264e8d4a510006118f7565b61094f9190611916565b846002016000828254610962919061194f565b9091555050505060019091015550565b600060048281548110610987576109876118cb565b60009182526020808320858452600582526040808520338652909252908320805460069390930290910160038101805491955091938392916109ca908490611938565b90915550506000808355600183015582546109ef906001600160a01b0316338361134c565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a350505050565b610a3461124f565b600060048281548110610a4957610a496118cb565b6000918252602090912060015460069092020180549092506001600160a01b03908116911614610a8b5760405162820f3560e61b815260040160405180910390fd5b50600255565b60045460005b81811015610ab857610aa8816108c4565b610ab1816119a2565b9050610a97565b5050565b610ac461124f565b610ace60006113b4565b565b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610b1457600080fd5b505afa158015610b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4c9190611967565b6001546040516323b872dd60e01b8152336004820152306024820152604481018590529192506001600160a01b0316906323b872dd90606401602060405180830381600087803b158015610b9f57600080fd5b505af1158015610bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd79190611980565b506001546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a082319060240160206040518083038186803b158015610c2057600080fd5b505afa158015610c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c589190611967565b610c629190611938565b90508060048581548110610c7857610c786118cb565b90600052602060002090600602016004016000828254610c98919061194f565b909155505050505050565b600060048281548110610cb857610cb86118cb565b60009182526020808320858452600582526040808520338652909252922060069091029091019150610ce9836108c4565b6000816001015464e8d4a5100084600201548460000154610d0a91906118f7565b610d149190611916565b610d1e9190611938565b905080610d3e57604051630b8a550d60e31b815260040160405180910390fd5b60048301546000818311610d525782610d54565b815b905080856004016000828254610d6a9190611938565b9250508190555080846003016000828254610d85919061194f565b90915550506002850154845464e8d4a5100091610da1916118f7565b610dab9190611916565b60018501556000610dbb82611404565b905086336001600160a01b03167f0e311a2c6dbfb0153ec3a8a5bdca09070b3e5f60768fdc10a20453f38d186873836040516105b491815260200190565b600060048381548110610e0e57610e0e6118cb565b60009182526020808320868452600582526040808520338652909252922060069091029091019150610e3f846108c4565b805415610ec7576000816001015464e8d4a5100084600201548460000154610e6791906118f7565b610e719190611916565b610e7b9190611938565b90506000610e8e338386600401546112a9565b905080846004016000828254610ea49190611938565b9250508190555080836003016000828254610ebf919061194f565b909155505050505b81546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610f0a57600080fd5b505afa158015610f1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f429190611967565b8354909150610f5c906001600160a01b0316333087611555565b82546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a082319060240160206040518083038186803b158015610fa357600080fd5b505afa158015610fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdb9190611967565b610fe59190611938565b90506000610ff4603283611916565b6003548654919250611013916001600160a01b0390811691168361134c565b61101d8183611938565b845490925061103457426002850155600060038501555b81856003016000828254611048919061194f565b909155505083548290859060009061106190849061194f565b90915550506002850154845464e8d4a510009161107d916118f7565b6110879190611916565b6001850155604051868152879033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15906020016105b4565b600080600484815481106110d6576110d66118cb565b600091825260208083208784526005825260408085206001600160a01b038916865290925292206002600690920290920190810154600382015460018301549294509091428110801561112857508115155b1561117357600585015460009061113f8342611938565b61114991906118f7565b90508261115b8264e8d4a510006118f7565b6111659190611916565b61116f908561194f565b9350505b6001840154845464e8d4a510009061118c9086906118f7565b6111969190611916565b6111a09190611938565b98975050505050505050565b6111b461124f565b6001600160a01b0381166112195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161044c565b611222816113b4565b50565b61122d61124f565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610ace5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161044c565b6000808284116112b957836112bb565b825b60015460405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905292935091169063a9059cbb90604401602060405180830381600087803b15801561130b57600080fd5b505af115801561131f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113439190611980565b50949350505050565b6040516001600160a01b0383166024820152604481018290526113af90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611593565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060046002548154811061141c5761141c6118cb565b60009182526020808320600254808552600583526040808620338752909352919093206006909202909201925090611453906108c4565b8054600090156114e3576000826001015464e8d4a510008560020154856000015461147e91906118f7565b6114889190611916565b6114929190611938565b9050836004015481116114a557806114ab565b83600401545b9150818460040160008282546114c19190611938565b92505081905550818360030160008282546114dc919061194f565b9091555050505b60006114ef828761194f565b905080846003016000828254611505919061194f565b909155505082548190849060009061151e90849061194f565b90915550506002840154835464e8d4a510009161153a916118f7565b6115449190611916565b600190930192909255509392505050565b6040516001600160a01b038085166024830152831660448201526064810182905261158d9085906323b872dd60e01b90608401611378565b50505050565b60006115e8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116659092919063ffffffff16565b8051909150156113af57808060200190518101906116069190611980565b6113af5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161044c565b6060611674848460008561167c565b949350505050565b6060824710156116dd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161044c565b600080866001600160a01b031685876040516116f991906119e9565b60006040518083038185875af1925050503d8060008114611736576040519150601f19603f3d011682016040523d82523d6000602084013e61173b565b606091505b509150915061174c87838387611757565b979650505050505050565b606083156117c35782516117bc576001600160a01b0385163b6117bc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161044c565b5081611674565b61167483838151156117d85781518083602001fd5b8060405162461bcd60e51b815260040161044c9190611a05565b60006020828403121561180457600080fd5b5035919050565b6000806040838503121561181e57600080fd5b50508035926020909101359150565b6001600160a01b038116811461122257600080fd5b60008060006060848603121561185757600080fd5b83356118628161182d565b95602085013595506040909401359392505050565b6000806040838503121561188a57600080fd5b82359150602083013561189c8161182d565b809150509250929050565b6000602082840312156118b957600080fd5b81356118c48161182d565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611911576119116118e1565b500290565b60008261193357634e487b7160e01b600052601260045260246000fd5b500490565b60008282101561194a5761194a6118e1565b500390565b60008219821115611962576119626118e1565b500190565b60006020828403121561197957600080fd5b5051919050565b60006020828403121561199257600080fd5b815180151581146118c457600080fd5b60006000198214156119b6576119b66118e1565b5060010190565b60005b838110156119d85781810151838201526020016119c0565b8381111561158d5750506000910152565b600082516119fb8184602087016119bd565b9190910192915050565b6020815260008251806020840152611a248160408501602087016119bd565b601f01601f1916919091016040019291505056fea26469706673582212209ff094b0cac0e9f27cad1033a06c6366ff0dd4ce9dd0b900fc5f886f77590bab64736f6c6343000809003300000000000000000000000052e9bb9e01a9d6d1cd0ab6301636e499c2aed0f0000000000000000000000000000000000000000000000000000000006363fa98000000000000000000000000931d8786b6866649430f908da302854eac4f1710
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c806378e97925116100b8578063aa5f7e261161007c578063aa5f7e26146102f7578063caeb113f1461030a578063e2bbb15814610313578063eff8aa0614610326578063f2fde38b14610339578063fb6587231461034c57600080fd5b806378e9792514610257578063792a882a1461026057806379ebd1aa146102735780638da5cb5b1461028657806393f1a40b1461029757600080fd5b806351eb05a61161010a57806351eb05a6146101e35780635312ea8e146101f65780635a859651146102095780635b1a121d14610234578063630b5ba114610247578063715018a61461024f57600080fd5b8063081e3eda146101475780631526fe271461015e5780633462e0a8146101a8578063441a3e70146101bd5780635101e128146101d0575b600080fd5b6004545b6040519081526020015b60405180910390f35b61017161016c3660046117f2565b61035f565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610155565b6101bb6101b636600461180b565b6103af565b005b6101bb6101cb36600461180b565b6103e4565b6101bb6101de366004611842565b6105c5565b6101bb6101f13660046117f2565b6108c4565b6101bb6102043660046117f2565b610972565b60015461021c906001600160a01b031681565b6040516001600160a01b039091168152602001610155565b6101bb6102423660046117f2565b610a2c565b6101bb610a91565b6101bb610abc565b61014b60065481565b6101bb61026e36600461180b565b610ad0565b60035461021c906001600160a01b031681565b6000546001600160a01b031661021c565b6102d76102a5366004611877565b600560209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610155565b6101bb6103053660046117f2565b610ca3565b61014b60025481565b6101bb61032136600461180b565b610df9565b61014b610334366004611877565b6110c0565b6101bb6103473660046118a7565b6111ac565b6101bb61035a3660046118a7565b611225565b6004818154811061036f57600080fd5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b0390941695509193909286565b6103b761124f565b80600483815481106103cb576103cb6118cb565b9060005260206000209060060201600501819055505050565b6000600483815481106103f9576103f96118cb565b60009182526020808320868452600582526040808520338652909252922080546006909202909201925083111561045557805460405163cf47918160e01b81526004810191909152602481018490526044015b60405180910390fd5b61045e846108c4565b6000816001015464e8d4a510008460020154846000015461047f91906118f7565b6104899190611916565b6104939190611938565b905060006104a6338386600401546112a9565b9050808460040160008282546104bc9190611938565b92505081905550808360030160008282546104d7919061194f565b92505081905550848460030160008282546104f29190611938565b909155505082548590849060009061050b908490611938565b90915550506002840154835464e8d4a5100091610527916118f7565b6105319190611916565b60018401556000610543601487611916565b905061054f8187611938565b600354865491975061056e916001600160a01b0390811691168361134c565b8454610584906001600160a01b0316338861134c565b604051868152879033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568906020015b60405180910390a350505050505050565b6105cd61124f565b600060065442116105e0576006546105e2565b425b6001546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561062b57600080fd5b505afa15801561063f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106639190611967565b6001546040516323b872dd60e01b8152336004820152306024820152604481018790529192506001600160a01b0316906323b872dd90606401602060405180830381600087803b1580156106b657600080fd5b505af11580156106ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ee9190611980565b506001546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a082319060240160206040518083038186803b15801561073757600080fd5b505afa15801561074b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076f9190611967565b6107799190611938565b6040805160c0810182526001600160a01b039889168152602081019586526000918101828152606082018381526080830194855260a0830198895260048054600181018255945291517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b600690940293840180546001600160a01b03191691909b161790995594517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c82015596517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d88015592517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e8701555050517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f840155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a09092019190915550565b6000600482815481106108d9576108d96118cb565b906000526020600020906006020190506000429050816001015481116108fe57505050565b600382015480610912575060019091015550565b600083600501548460010154846109299190611938565b61093391906118f7565b9050816109458264e8d4a510006118f7565b61094f9190611916565b846002016000828254610962919061194f565b9091555050505060019091015550565b600060048281548110610987576109876118cb565b60009182526020808320858452600582526040808520338652909252908320805460069390930290910160038101805491955091938392916109ca908490611938565b90915550506000808355600183015582546109ef906001600160a01b0316338361134c565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a350505050565b610a3461124f565b600060048281548110610a4957610a496118cb565b6000918252602090912060015460069092020180549092506001600160a01b03908116911614610a8b5760405162820f3560e61b815260040160405180910390fd5b50600255565b60045460005b81811015610ab857610aa8816108c4565b610ab1816119a2565b9050610a97565b5050565b610ac461124f565b610ace60006113b4565b565b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610b1457600080fd5b505afa158015610b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4c9190611967565b6001546040516323b872dd60e01b8152336004820152306024820152604481018590529192506001600160a01b0316906323b872dd90606401602060405180830381600087803b158015610b9f57600080fd5b505af1158015610bb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd79190611980565b506001546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a082319060240160206040518083038186803b158015610c2057600080fd5b505afa158015610c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c589190611967565b610c629190611938565b90508060048581548110610c7857610c786118cb565b90600052602060002090600602016004016000828254610c98919061194f565b909155505050505050565b600060048281548110610cb857610cb86118cb565b60009182526020808320858452600582526040808520338652909252922060069091029091019150610ce9836108c4565b6000816001015464e8d4a5100084600201548460000154610d0a91906118f7565b610d149190611916565b610d1e9190611938565b905080610d3e57604051630b8a550d60e31b815260040160405180910390fd5b60048301546000818311610d525782610d54565b815b905080856004016000828254610d6a9190611938565b9250508190555080846003016000828254610d85919061194f565b90915550506002850154845464e8d4a5100091610da1916118f7565b610dab9190611916565b60018501556000610dbb82611404565b905086336001600160a01b03167f0e311a2c6dbfb0153ec3a8a5bdca09070b3e5f60768fdc10a20453f38d186873836040516105b491815260200190565b600060048381548110610e0e57610e0e6118cb565b60009182526020808320868452600582526040808520338652909252922060069091029091019150610e3f846108c4565b805415610ec7576000816001015464e8d4a5100084600201548460000154610e6791906118f7565b610e719190611916565b610e7b9190611938565b90506000610e8e338386600401546112a9565b905080846004016000828254610ea49190611938565b9250508190555080836003016000828254610ebf919061194f565b909155505050505b81546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610f0a57600080fd5b505afa158015610f1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f429190611967565b8354909150610f5c906001600160a01b0316333087611555565b82546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a082319060240160206040518083038186803b158015610fa357600080fd5b505afa158015610fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdb9190611967565b610fe59190611938565b90506000610ff4603283611916565b6003548654919250611013916001600160a01b0390811691168361134c565b61101d8183611938565b845490925061103457426002850155600060038501555b81856003016000828254611048919061194f565b909155505083548290859060009061106190849061194f565b90915550506002850154845464e8d4a510009161107d916118f7565b6110879190611916565b6001850155604051868152879033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15906020016105b4565b600080600484815481106110d6576110d66118cb565b600091825260208083208784526005825260408085206001600160a01b038916865290925292206002600690920290920190810154600382015460018301549294509091428110801561112857508115155b1561117357600585015460009061113f8342611938565b61114991906118f7565b90508261115b8264e8d4a510006118f7565b6111659190611916565b61116f908561194f565b9350505b6001840154845464e8d4a510009061118c9086906118f7565b6111969190611916565b6111a09190611938565b98975050505050505050565b6111b461124f565b6001600160a01b0381166112195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161044c565b611222816113b4565b50565b61122d61124f565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610ace5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161044c565b6000808284116112b957836112bb565b825b60015460405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905292935091169063a9059cbb90604401602060405180830381600087803b15801561130b57600080fd5b505af115801561131f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113439190611980565b50949350505050565b6040516001600160a01b0383166024820152604481018290526113af90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611593565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060046002548154811061141c5761141c6118cb565b60009182526020808320600254808552600583526040808620338752909352919093206006909202909201925090611453906108c4565b8054600090156114e3576000826001015464e8d4a510008560020154856000015461147e91906118f7565b6114889190611916565b6114929190611938565b9050836004015481116114a557806114ab565b83600401545b9150818460040160008282546114c19190611938565b92505081905550818360030160008282546114dc919061194f565b9091555050505b60006114ef828761194f565b905080846003016000828254611505919061194f565b909155505082548190849060009061151e90849061194f565b90915550506002840154835464e8d4a510009161153a916118f7565b6115449190611916565b600190930192909255509392505050565b6040516001600160a01b038085166024830152831660448201526064810182905261158d9085906323b872dd60e01b90608401611378565b50505050565b60006115e8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116659092919063ffffffff16565b8051909150156113af57808060200190518101906116069190611980565b6113af5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161044c565b6060611674848460008561167c565b949350505050565b6060824710156116dd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161044c565b600080866001600160a01b031685876040516116f991906119e9565b60006040518083038185875af1925050503d8060008114611736576040519150601f19603f3d011682016040523d82523d6000602084013e61173b565b606091505b509150915061174c87838387611757565b979650505050505050565b606083156117c35782516117bc576001600160a01b0385163b6117bc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161044c565b5081611674565b61167483838151156117d85781518083602001fd5b8060405162461bcd60e51b815260040161044c9190611a05565b60006020828403121561180457600080fd5b5035919050565b6000806040838503121561181e57600080fd5b50508035926020909101359150565b6001600160a01b038116811461122257600080fd5b60008060006060848603121561185757600080fd5b83356118628161182d565b95602085013595506040909401359392505050565b6000806040838503121561188a57600080fd5b82359150602083013561189c8161182d565b809150509250929050565b6000602082840312156118b957600080fd5b81356118c48161182d565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611911576119116118e1565b500290565b60008261193357634e487b7160e01b600052601260045260246000fd5b500490565b60008282101561194a5761194a6118e1565b500390565b60008219821115611962576119626118e1565b500190565b60006020828403121561197957600080fd5b5051919050565b60006020828403121561199257600080fd5b815180151581146118c457600080fd5b60006000198214156119b6576119b66118e1565b5060010190565b60005b838110156119d85781810151838201526020016119c0565b8381111561158d5750506000910152565b600082516119fb8184602087016119bd565b9190910192915050565b6020815260008251806020840152611a248160408501602087016119bd565b601f01601f1916919091016040019291505056fea26469706673582212209ff094b0cac0e9f27cad1033a06c6366ff0dd4ce9dd0b900fc5f886f77590bab64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000052e9bb9e01a9d6d1cd0ab6301636e499c2aed0f0000000000000000000000000000000000000000000000000000000006363fa98000000000000000000000000931d8786b6866649430f908da302854eac4f1710
-----Decoded View---------------
Arg [0] : _brl (address): 0x52e9bb9e01a9d6d1CD0AB6301636E499c2AeD0f0
Arg [1] : _startTime (uint256): 1667496600
Arg [2] : _bulldozer (address): 0x931d8786B6866649430F908da302854EAc4F1710
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000052e9bb9e01a9d6d1cd0ab6301636e499c2aed0f0
Arg [1] : 000000000000000000000000000000000000000000000000000000006363fa98
Arg [2] : 000000000000000000000000931d8786b6866649430f908da302854eac4f1710
Deployed Bytecode Sourcemap
35312:8850:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36508:95;36580:8;:15;36508:95;;;160:25:1;;;148:2;133:18;36508:95:0;;;;;;;;35839:26;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;701:32:1;;;683:51;;765:2;750:18;;743:34;;;;793:18;;;786:34;;;;851:2;836:18;;829:34;894:3;879:19;;872:35;721:3;923:19;;916:35;670:3;655:19;35839:26:0;381:576:1;37344:139:0;;;;;;:::i;:::-;;:::i;:::-;;42138:980;;;;;;:::i;:::-;;:::i;36611:725::-;;;;;;:::i;:::-;;:::i;38689:581::-;;;;;;:::i;:::-;;:::i;43126:418::-;;;;;;:::i;:::-;;:::i;35748:17::-;;;;;-1:-1:-1;;;;;35748:17:0;;;;;;-1:-1:-1;;;;;1949:32:1;;;1931:51;;1919:2;1904:18;35748:17:0;1770:218:1;43828:225:0;;;;;;:::i;:::-;;:::i;38501:180::-;;;:::i;34384:103::-;;;:::i;35945:24::-;;;;;;37491:325;;;;;;:::i;:::-;;:::i;35806:24::-;;;;;-1:-1:-1;;;;;35806:24:0;;;33736:87;33782:7;33809:6;-1:-1:-1;;;;;33809:6:0;33736:87;;35872:64;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2760:25:1;;;2816:2;2801:18;;2794:34;;;;2844:18;;;2837:34;2902:2;2887:18;;2880:34;2747:3;2732:19;35872:64:0;2529:391:1;40593:754:0;;;;;;:::i;:::-;;:::i;35772:27::-;;;;;;39278:1307;;;;;;:::i;:::-;;:::i;37824:669::-;;;;;;:::i;:::-;;:::i;34642:201::-;;;;;;:::i;:::-;;:::i;44061:94::-;;;;;;:::i;:::-;;:::i;35839:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35839:26:0;;;;-1:-1:-1;35839:26:0;;;;;:::o;37344:139::-;33622:13;:11;:13::i;:::-;37462::::1;37432:8;37441:4;37432:14;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;:43;;;;37344:139:::0;;:::o;42138:980::-;42207:21;42231:8;42240:4;42231:14;;;;;;;;:::i;:::-;;;;;;;;;42280;;;:8;:14;;;;;;42295:10;42280:26;;;;;;;42331:11;;42231:14;;;;;;;;-1:-1:-1;42321:21:0;;42317:102;;;42386:11;;42366:41;;-1:-1:-1;;;42366:41:0;;;;;3491:25:1;;;;3532:18;;;3525:34;;;3464:18;;42366:41:0;;;;;;;;42317:102;42429:16;42440:4;42429:10;:16::i;:::-;42456:15;42519:4;:15;;;42511:4;42489;:19;;;42475:4;:11;;;:33;;;;:::i;:::-;:40;;;;:::i;:::-;42474:60;;;;:::i;:::-;42456:78;;42545:25;42573:55;42589:10;42601:7;42610:4;:17;;;42573:15;:55::i;:::-;42545:83;;42660:17;42639:4;:17;;;:38;;;;;;;:::i;:::-;;;;;;;;42709:17;42688:4;:17;;;:38;;;;;;;:::i;:::-;;;;;;;;42753:7;42737:4;:12;;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;42771:22:0;;42786:7;;42771:4;;:11;;:22;;42786:7;;42771:22;:::i;:::-;;;;-1:-1:-1;;42836:19:0;;;;42822:11;;42858:4;;42822:33;;;:::i;:::-;:40;;;;:::i;:::-;42804:15;;;:58;42894:11;42908:12;42918:2;42908:7;:12;:::i;:::-;42894:26;-1:-1:-1;42931:14:0;42894:26;42931:14;;:::i;:::-;42980:9;;42956:10;;42931:14;;-1:-1:-1;42956:39:0;;-1:-1:-1;;;;;42956:10:0;;;;42980:9;42991:3;42956:23;:39::i;:::-;43006:10;;:53;;-1:-1:-1;;;;;43006:10:0;43038;43051:7;43006:23;:53::i;:::-;43075:35;;160:25:1;;;43096:4:0;;43084:10;;43075:35;;148:2:1;133:18;43075:35:0;;;;;;;;42196:922;;;;;42138:980;;:::o;36611:725::-;33622:13;:11;:13::i;:::-;36713:27:::1;36761:9;;36743:15;:27;:57;;36791:9;;36743:57;;;36773:15;36743:57;36831:3;::::0;:28:::1;::::0;-1:-1:-1;;;36831:28:0;;36853:4:::1;36831:28;::::0;::::1;1931:51:1::0;36713:87:0;;-1:-1:-1;36811:17:0::1;::::0;-1:-1:-1;;;;;36831:3:0;;::::1;::::0;:13:::1;::::0;1904:18:1;;36831:28:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36870:3;::::0;:58:::1;::::0;-1:-1:-1;;;36870:58:0;;36887:10:::1;36870:58;::::0;::::1;4789:34:1::0;36907:4:0::1;4839:18:1::0;;;4832:43;4891:18;;;4884:34;;;36811:48:0;;-1:-1:-1;;;;;;36870:3:0::1;::::0;:16:::1;::::0;4724:18:1;;36870:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;36964:3:0::1;::::0;:28:::1;::::0;-1:-1:-1;;;36964:28:0;;36986:4:::1;36964:28;::::0;::::1;1931:51:1::0;36939:22:0::1;::::0;36995:9;;-1:-1:-1;;;;;36964:3:0;;::::1;::::0;:13:::1;::::0;1904:18:1;;36964:28:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;;:::i;:::-;37043:274;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;37043:274:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;37043:274:0;;;;;;;;;;;;;;;;;;;;;;;;37015:8:::1;:313:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;37015:313:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37015:313:0;;;;;;;;;;;;;;-1:-1:-1;36611:725:0:o;38689:581::-;38741:21;38765:8;38774:4;38765:14;;;;;;;;:::i;:::-;;;;;;;;;;;38741:38;;38790:17;38810:15;38790:35;;38853:4;:24;;;38840:9;:37;38836:76;;38894:7;;38689:581;:::o;38836:76::-;38940:12;;;;38967;38963:102;;-1:-1:-1;38996:24:0;;;;:36;-1:-1:-1;38689:581:0:o;38963:102::-;39075:17;39136:4;:17;;;39108:4;:24;;;39096:9;:36;;;;:::i;:::-;39095:58;;;;:::i;:::-;39075:78;-1:-1:-1;39207:7:0;39188:16;39075:78;39200:4;39188:16;:::i;:::-;:26;;;;:::i;:::-;39164:4;:19;;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;39226:24:0;;;;:36;-1:-1:-1;38689:581:0:o;43126:418::-;43187:21;43211:8;43220:4;43211:14;;;;;;;;:::i;:::-;;;;;;;;;43260;;;:8;:14;;;;;;43275:10;43260:26;;;;;;;;43314:11;;43211:14;;;;;;;;43336:12;;;:22;;43211:14;;-1:-1:-1;43260:26:0;;43314:11;;43336:12;:22;;43314:11;;43336:22;:::i;:::-;;;;-1:-1:-1;;43383:1:0;43369:15;;;43395;;;:19;43425:10;;:52;;-1:-1:-1;;;;;43425:10:0;43457;43470:6;43425:23;:52::i;:::-;43493:43;;160:25:1;;;43523:4:0;;43511:10;;43493:43;;148:2:1;133:18;43493:43:0;;;;;;;43176:368;;;43126:418;:::o;43828:225::-;33622:13;:11;:13::i;:::-;43897:21:::1;43921:8;43930:4;43921:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;43964:3:::1;::::0;43921:14:::1;::::0;;::::1;;43950:10:::0;;43921:14;;-1:-1:-1;;;;;;43950:10:0;;::::1;43964:3:::0;::::1;43950:17;43946:70;;43991:13;;-1:-1:-1::0;;;43991:13:0::1;;;;;;;;;;;43946:70;-1:-1:-1::0;44026:12:0::1;:19:::0;43828:225::o;38501:180::-;38563:8;:15;38546:14;38589:85;38617:6;38611:3;:12;38589:85;;;38647:15;38658:3;38647:10;:15::i;:::-;38625:5;;;:::i;:::-;;;38589:85;;;;38535:146;38501:180::o;34384:103::-;33622:13;:11;:13::i;:::-;34449:30:::1;34476:1;34449:18;:30::i;:::-;34384:103::o:0;37491:325::-;37585:3;;:28;;-1:-1:-1;;;37585:28:0;;37607:4;37585:28;;;1931:51:1;37565:17:0;;-1:-1:-1;;;;;37585:3:0;;:13;;1904:18:1;;37585:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37624:3;;:52;;-1:-1:-1;;;37624:52:0;;37641:10;37624:52;;;4789:34:1;37661:4:0;4839:18:1;;;4832:43;4891:18;;;4884:34;;;37565:48:0;;-1:-1:-1;;;;;;37624:3:0;;:16;;4724:18:1;;37624:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;37712:3:0;;:28;;-1:-1:-1;;;37712:28:0;;37734:4;37712:28;;;1931:51:1;37687:22:0;;37743:9;;-1:-1:-1;;;;;37712:3:0;;;;:13;;1904:18:1;;37712:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;;:::i;:::-;37687:65;;37794:14;37763:8;37772:4;37763:14;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;37491:325:0:o;40593:754::-;40645:21;40669:8;40678:4;40669:14;;;;;;;;:::i;:::-;;;;;;;;;40718;;;:8;:14;;;;;;40733:10;40718:26;;;;;;;40669:14;;;;;;;;-1:-1:-1;40755:16:0;40727:4;40755:10;:16::i;:::-;40782:15;40845:4;:15;;;40837:4;40815;:19;;;40801:4;:11;;;:33;;;;:::i;:::-;:40;;;;:::i;:::-;40800:60;;;;:::i;:::-;40782:78;-1:-1:-1;40875:12:0;40871:65;;40911:13;;-1:-1:-1;;;40911:13:0;;;;;;;;;;;40871:65;40969:17;;;;40946:20;41019:22;;;:47;;41059:7;41019:47;;;41044:12;41019:47;40997:69;;41098:11;41077:4;:17;;;:32;;;;;;;:::i;:::-;;;;;;;;41141:11;41120:4;:17;;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;41195:19:0;;;;41181:11;;41217:4;;41181:33;;;:::i;:::-;:40;;;;:::i;:::-;41163:15;;;:58;41232:23;41258:22;41268:11;41258:9;:22::i;:::-;41232:48;;41317:4;41305:10;-1:-1:-1;;;;;41296:43:0;;41323:15;41296:43;;;;160:25:1;;148:2;133:18;;14:177;39278:1307:0;39346:21;39370:8;39379:4;39370:14;;;;;;;;:::i;:::-;;;;;;;;;39419;;;:8;:14;;;;;;39434:10;39419:26;;;;;;;39370:14;;;;;;;;-1:-1:-1;39456:16:0;39428:4;39456:10;:16::i;:::-;39487:11;;:15;39483:330;;39519:15;39582:4;:15;;;39574:4;39552;:19;;;39538:4;:11;;;:33;;;;:::i;:::-;:40;;;;:::i;:::-;39537:60;;;;:::i;:::-;39519:78;;39612:25;39640:55;39656:10;39668:7;39677:4;:17;;;39640:15;:55::i;:::-;39612:83;;39731:17;39710:4;:17;;;:38;;;;;;;:::i;:::-;;;;;;;;39784:17;39763:4;:17;;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;39483:330:0;39843:10;;:35;;-1:-1:-1;;;39843:35:0;;39872:4;39843:35;;;1931:51:1;39823:17:0;;-1:-1:-1;;;;;39843:10:0;;:20;;1904:18:1;;39843:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39889:10;;39823:55;;-1:-1:-1;39889:72:0;;-1:-1:-1;;;;;39889:10:0;39925;39946:4;39953:7;39889:27;:72::i;:::-;39997:10;;:35;;-1:-1:-1;;;39997:35:0;;40026:4;39997:35;;;1931:51:1;39972:22:0;;40035:9;;-1:-1:-1;;;;;39997:10:0;;;;:20;;1904:18:1;;39997:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;39972:72;-1:-1:-1;40076:11:0;40090:19;40107:2;39972:72;40090:19;:::i;:::-;40144:9;;40120:10;;40076:33;;-1:-1:-1;40120:39:0;;-1:-1:-1;;;;;40120:10:0;;;;40144:9;40076:33;40120:23;:39::i;:::-;40170:21;40188:3;40170:21;;:::i;:::-;40238:11;;40170:21;;-1:-1:-1;40234:117:0;;40288:15;40271:14;;;:32;40338:1;40318:17;;;:21;40234:117;40404:14;40388:4;:12;;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;40429:29:0;;40444:14;;40429:4;;:11;;:29;;40444:14;;40429:29;:::i;:::-;;;;-1:-1:-1;;40501:19:0;;;;40487:11;;40523:4;;40487:33;;;:::i;:::-;:40;;;;:::i;:::-;40469:15;;;:58;40543:34;;160:25:1;;;40563:4:0;;40551:10;;40543:34;;148:2:1;133:18;40543:34:0;14:177:1;37824:669:0;37896:7;37921:21;37945:8;37954:4;37945:14;;;;;;;;:::i;:::-;;;;;;;;;37994;;;:8;:14;;;;;;-1:-1:-1;;;;;37994:21:0;;;;;;;;;38051:19;37945:14;;;;;;;38051:19;;;;38099:12;;;;38152:24;;;;37945:14;;-1:-1:-1;38051:19:0;;38191:15;:37;-1:-1:-1;38191:53:0;;;;-1:-1:-1;38232:12:0;;;38191:53;38187:226;;;38323:17;;;;38261;;38282:37;38300:19;38282:15;:37;:::i;:::-;38281:59;;;;:::i;:::-;38261:79;-1:-1:-1;38393:7:0;38374:16;38261:79;38386:4;38374:16;:::i;:::-;:26;;;;:::i;:::-;38355:46;;;;:::i;:::-;;;38246:167;38187:226;38470:15;;;;38431:11;;38462:4;;38431:28;;38445:14;;38431:28;:::i;:::-;:35;;;;:::i;:::-;38430:55;;;;:::i;:::-;38423:62;37824:669;-1:-1:-1;;;;;;;;37824:669:0:o;34642:201::-;33622:13;:11;:13::i;:::-;-1:-1:-1;;;;;34731:22:0;::::1;34723:73;;;::::0;-1:-1:-1;;;34723:73:0;;5553:2:1;34723:73:0::1;::::0;::::1;5535:21:1::0;5592:2;5572:18;;;5565:30;5631:34;5611:18;;;5604:62;-1:-1:-1;;;5682:18:1;;;5675:36;5728:19;;34723:73:0::1;5351:402:1::0;34723:73:0::1;34807:28;34826:8;34807:18;:28::i;:::-;34642:201:::0;:::o;44061:94::-;33622:13;:11;:13::i;:::-;44129:9:::1;:18:::0;;-1:-1:-1;;;;;;44129:18:0::1;-1:-1:-1::0;;;;;44129:18:0;;;::::1;::::0;;;::::1;::::0;;44061:94::o;33901:132::-;33782:7;33809:6;-1:-1:-1;;;;;33809:6:0;29485:10;33965:23;33957:68;;;;-1:-1:-1;;;33957:68:0;;5960:2:1;33957:68:0;;;5942:21:1;;;5979:18;;;5972:30;6038:34;6018:18;;;6011:62;6090:18;;33957:68:0;5758:356:1;43552:268:0;43648:7;43668:20;43701:13;43691:7;:23;:49;;43733:7;43691:49;;;43717:13;43691:49;43751:3;;:31;;-1:-1:-1;;;43751:31:0;;-1:-1:-1;;;;;6311:32:1;;;43751:31:0;;;6293:51:1;6360:18;;;6353:34;;;43668:72:0;;-1:-1:-1;43751:3:0;;;:12;;6266:18:1;;43751:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;43800:12:0;43552:268;-1:-1:-1;;;;43552:268:0:o;11652:211::-;11796:58;;-1:-1:-1;;;;;6311:32:1;;11796:58:0;;;6293:51:1;6360:18;;;6353:34;;;11769:86:0;;11789:5;;-1:-1:-1;;;11819:23:0;6266:18:1;;11796:58:0;;;;-1:-1:-1;;11796:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;11796:58:0;-1:-1:-1;;;;;;11796:58:0;;;;;;;;;;11769:19;:86::i;:::-;11652:211;;;:::o;35003:191::-;35077:16;35096:6;;-1:-1:-1;;;;;35113:17:0;;;-1:-1:-1;;;;;;35113:17:0;;;;;;35146:40;;35096:6;;;;;;;35146:40;;35077:16;35146:40;35066:128;35003:191;:::o;41355:775::-;41409:7;41429:21;41453:8;41462:12;;41453:22;;;;;;;;:::i;:::-;;;;;;;;;41519:12;;41510:22;;;:8;:22;;;;;;41533:10;41510:34;;;;;;;;;41453:22;;;;;;;;-1:-1:-1;41510:34:0;41555:24;;:10;:24::i;:::-;41624:11;;41590:19;;41624:15;41620:306;;41656:15;41719:4;:15;;;41711:4;41689;:19;;;41675:4;:11;;;:33;;;;:::i;:::-;:40;;;;:::i;:::-;41674:60;;;;:::i;:::-;41656:78;;41773:4;:17;;;41763:7;:27;:57;;41813:7;41763:57;;;41793:4;:17;;;41763:57;41749:71;;41856:11;41835:4;:17;;;:32;;;;;;;:::i;:::-;;;;;;;;41903:11;41882:4;:17;;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;;41620:306:0;41936:11;41950:21;41960:11;41950:7;:21;:::i;:::-;41936:35;;41998:3;41982:4;:12;;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;42012:18:0;;42027:3;;42012:4;;:11;;:18;;42027:3;;42012:18;:::i;:::-;;;;-1:-1:-1;;42073:19:0;;;;42059:11;;42095:4;;42059:33;;;:::i;:::-;:40;;;;:::i;:::-;42041:15;;;;:58;;;;-1:-1:-1;42119:3:0;41355:775;-1:-1:-1;;;41355:775:0:o;11871:248::-;12042:68;;-1:-1:-1;;;;;4807:15:1;;;12042:68:0;;;4789:34:1;4859:15;;4839:18;;;4832:43;4891:18;;;4884:34;;;12015:96:0;;12035:5;;-1:-1:-1;;;12065:27:0;4724:18:1;;12042:68:0;4549:375:1;12015:96:0;11871:248;;;;:::o;14719:716::-;15143:23;15169:69;15197:4;15169:69;;;;;;;;;;;;;;;;;15177:5;-1:-1:-1;;;;;15169:27:0;;;:69;;;;;:::i;:::-;15253:17;;15143:95;;-1:-1:-1;15253:21:0;15249:179;;15350:10;15339:30;;;;;;;;;;;;:::i;:::-;15331:85;;;;-1:-1:-1;;;15331:85:0;;6600:2:1;15331:85:0;;;6582:21:1;6639:2;6619:18;;;6612:30;6678:34;6658:18;;;6651:62;-1:-1:-1;;;6729:18:1;;;6722:40;6779:19;;15331:85:0;6398:406:1;5688:229:0;5825:12;5857:52;5879:6;5887:4;5893:1;5896:12;5857:21;:52::i;:::-;5850:59;5688:229;-1:-1:-1;;;;5688:229:0:o;6808:455::-;6978:12;7036:5;7011:21;:30;;7003:81;;;;-1:-1:-1;;;7003:81:0;;7011:2:1;7003:81:0;;;6993:21:1;7050:2;7030:18;;;7023:30;7089:34;7069:18;;;7062:62;-1:-1:-1;;;7140:18:1;;;7133:36;7186:19;;7003:81:0;6809:402:1;7003:81:0;7096:12;7110:23;7137:6;-1:-1:-1;;;;;7137:11:0;7156:5;7163:4;7137:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7095:73;;;;7186:69;7213:6;7221:7;7230:10;7242:12;7186:26;:69::i;:::-;7179:76;6808:455;-1:-1:-1;;;;;;;6808:455:0:o;9381:644::-;9566:12;9595:7;9591:427;;;9623:17;;9619:290;;-1:-1:-1;;;;;3227:19:0;;;9833:60;;;;-1:-1:-1;;;9833:60:0;;7960:2:1;9833:60:0;;;7942:21:1;7999:2;7979:18;;;7972:30;8038:31;8018:18;;;8011:59;8087:18;;9833:60:0;7758:353:1;9833:60:0;-1:-1:-1;9930:10:0;9923:17;;9591:427;9973:33;9981:10;9993:12;10728:17;;:21;10724:388;;10960:10;10954:17;11017:15;11004:10;11000:2;10996:19;10989:44;10724:388;11087:12;11080:20;;-1:-1:-1;;;11080:20:0;;;;;;;;:::i;196:180:1:-;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;347:23:1;;196:180;-1:-1:-1;196:180:1:o;962:248::-;1030:6;1038;1091:2;1079:9;1070:7;1066:23;1062:32;1059:52;;;1107:1;1104;1097:12;1059:52;-1:-1:-1;;1130:23:1;;;1200:2;1185:18;;;1172:32;;-1:-1:-1;962:248:1:o;1215:139::-;-1:-1:-1;;;;;1298:31:1;;1288:42;;1278:70;;1344:1;1341;1334:12;1359:406;1451:6;1459;1467;1520:2;1508:9;1499:7;1495:23;1491:32;1488:52;;;1536:1;1533;1526:12;1488:52;1575:9;1562:23;1594:39;1627:5;1594:39;:::i;:::-;1652:5;1704:2;1689:18;;1676:32;;-1:-1:-1;1755:2:1;1740:18;;;1727:32;;1359:406;-1:-1:-1;;;1359:406:1:o;2201:323::-;2269:6;2277;2330:2;2318:9;2309:7;2305:23;2301:32;2298:52;;;2346:1;2343;2336:12;2298:52;2382:9;2369:23;2359:33;;2442:2;2431:9;2427:18;2414:32;2455:39;2488:5;2455:39;:::i;:::-;2513:5;2503:15;;;2201:323;;;;;:::o;2925:255::-;2984:6;3037:2;3025:9;3016:7;3012:23;3008:32;3005:52;;;3053:1;3050;3043:12;3005:52;3092:9;3079:23;3111:39;3144:5;3111:39;:::i;:::-;3169:5;2925:255;-1:-1:-1;;;2925:255:1:o;3185:127::-;3246:10;3241:3;3237:20;3234:1;3227:31;3277:4;3274:1;3267:15;3301:4;3298:1;3291:15;3570:127;3631:10;3626:3;3622:20;3619:1;3612:31;3662:4;3659:1;3652:15;3686:4;3683:1;3676:15;3702:168;3742:7;3808:1;3804;3800:6;3796:14;3793:1;3790:21;3785:1;3778:9;3771:17;3767:45;3764:71;;;3815:18;;:::i;:::-;-1:-1:-1;3855:9:1;;3702:168::o;3875:217::-;3915:1;3941;3931:132;;3985:10;3980:3;3976:20;3973:1;3966:31;4020:4;4017:1;4010:15;4048:4;4045:1;4038:15;3931:132;-1:-1:-1;4077:9:1;;3875:217::o;4097:125::-;4137:4;4165:1;4162;4159:8;4156:34;;;4170:18;;:::i;:::-;-1:-1:-1;4207:9:1;;4097:125::o;4227:128::-;4267:3;4298:1;4294:6;4291:1;4288:13;4285:39;;;4304:18;;:::i;:::-;-1:-1:-1;4340:9:1;;4227:128::o;4360:184::-;4430:6;4483:2;4471:9;4462:7;4458:23;4454:32;4451:52;;;4499:1;4496;4489:12;4451:52;-1:-1:-1;4522:16:1;;4360:184;-1:-1:-1;4360:184:1:o;4929:277::-;4996:6;5049:2;5037:9;5028:7;5024:23;5020:32;5017:52;;;5065:1;5062;5055:12;5017:52;5097:9;5091:16;5150:5;5143:13;5136:21;5129:5;5126:32;5116:60;;5172:1;5169;5162:12;5211:135;5250:3;-1:-1:-1;;5271:17:1;;5268:43;;;5291:18;;:::i;:::-;-1:-1:-1;5338:1:1;5327:13;;5211:135::o;7216:258::-;7288:1;7298:113;7312:6;7309:1;7306:13;7298:113;;;7388:11;;;7382:18;7369:11;;;7362:39;7334:2;7327:10;7298:113;;;7429:6;7426:1;7423:13;7420:48;;;-1:-1:-1;;7464:1:1;7446:16;;7439:27;7216:258::o;7479:274::-;7608:3;7646:6;7640:13;7662:53;7708:6;7703:3;7696:4;7688:6;7684:17;7662:53;:::i;:::-;7731:16;;;;;7479:274;-1:-1:-1;;7479:274:1:o;8116:383::-;8265:2;8254:9;8247:21;8228:4;8297:6;8291:13;8340:6;8335:2;8324:9;8320:18;8313:34;8356:66;8415:6;8410:2;8399:9;8395:18;8390:2;8382:6;8378:15;8356:66;:::i;:::-;8483:2;8462:15;-1:-1:-1;;8458:29:1;8443:45;;;;8490:2;8439:54;;8116:383;-1:-1:-1;;8116:383:1:o
Swarm Source
ipfs://9ff094b0cac0e9f27cad1033a06c6366ff0dd4ce9dd0b900fc5f886f77590bab
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 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.