Latest 25 from a total of 47 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Start Unbond | 23201897 | 195 days ago | IN | 0 ETH | 0.00006479 | ||||
| Enable Stealth C... | 23201884 | 195 days ago | IN | 0 ETH | 0.00020041 | ||||
| Bond | 23201877 | 195 days ago | IN | 0.001 ETH | 0.00007499 | ||||
| Unbond All | 13734675 | 1554 days ago | IN | 0 ETH | 0.00508671 | ||||
| Unbond All | 13690368 | 1561 days ago | IN | 0 ETH | 0.00394231 | ||||
| Start Unbond | 13679191 | 1563 days ago | IN | 0 ETH | 0.00792128 | ||||
| Start Unbond | 13672389 | 1564 days ago | IN | 0 ETH | 0.006888 | ||||
| Start Unbond | 13671794 | 1564 days ago | IN | 0 ETH | 0.00595909 | ||||
| Unbond All | 13671106 | 1564 days ago | IN | 0 ETH | 0.00536492 | ||||
| Unbond All | 13670104 | 1564 days ago | IN | 0 ETH | 0.00363557 | ||||
| Start Unbond | 13665080 | 1565 days ago | IN | 0 ETH | 0.00461366 | ||||
| Start Unbond | 13644126 | 1568 days ago | IN | 0 ETH | 0.00466483 | ||||
| Start Unbond | 13635542 | 1570 days ago | IN | 0 ETH | 0.00808406 | ||||
| Unbond | 13627543 | 1571 days ago | IN | 0 ETH | 0.0063779 | ||||
| Start Unbond | 13599886 | 1575 days ago | IN | 0 ETH | 0.00434183 | ||||
| Enable Stealth C... | 13588143 | 1577 days ago | IN | 0 ETH | 0.01545176 | ||||
| Bond | 13588114 | 1577 days ago | IN | 1 ETH | 0.00533971 | ||||
| Enable Stealth C... | 13584459 | 1578 days ago | IN | 0 ETH | 0.01999697 | ||||
| Bond | 13584435 | 1578 days ago | IN | 1 ETH | 0.00746524 | ||||
| Enable Stealth C... | 13579600 | 1579 days ago | IN | 0 ETH | 0.02578796 | ||||
| Bond | 13579533 | 1579 days ago | IN | 1 ETH | 0.00998401 | ||||
| Enable Stealth C... | 13578005 | 1579 days ago | IN | 0 ETH | 0.0186852 | ||||
| Bond | 13577985 | 1579 days ago | IN | 1 ETH | 0.00735449 | ||||
| Enable Stealth C... | 13476109 | 1595 days ago | IN | 0 ETH | 0.00712508 | ||||
| Bond | 13476099 | 1595 days ago | IN | 1 ETH | 0.00361726 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
StealthVault
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
import '@lbertenasco/contract-utils/contracts/utils/CollectableDust.sol';
import '@lbertenasco/contract-utils/contracts/utils/Governable.sol';
import '@lbertenasco/contract-utils/contracts/utils/Manageable.sol';
import '@openzeppelin/contracts/utils/structs/EnumerableSet.sol';
import '@openzeppelin/contracts/security/ReentrancyGuard.sol';
import './interfaces/IStealthVault.sol';
/*
* YearnStealthVault
*/
contract StealthVault is Governable, Manageable, CollectableDust, ReentrancyGuard, IStealthVault {
using EnumerableSet for EnumerableSet.AddressSet;
uint256 public override gasBuffer = 69_420; // why not
uint256 public override totalBonded;
mapping(address => uint256) public override bonded;
mapping(address => uint256) public override canUnbondAt;
mapping(address => EnumerableSet.AddressSet) internal _callerStealthContracts;
mapping(bytes32 => address) public override hashReportedBy;
EnumerableSet.AddressSet internal _callers;
constructor() Governable(msg.sender) Manageable(msg.sender) {}
function isStealthVault() external pure override returns (bool) {
return true;
}
function callers() external view override returns (address[] memory _callersList) {
_callersList = new address[](_callers.length());
for (uint256 i; i < _callers.length(); i++) {
_callersList[i] = _callers.at(i);
}
}
function callerContracts(address _caller) external view override returns (address[] memory _callerContractsList) {
_callerContractsList = new address[](_callerStealthContracts[_caller].length());
for (uint256 i; i < _callerStealthContracts[_caller].length(); i++) {
_callerContractsList[i] = _callerStealthContracts[_caller].at(i);
}
}
function caller(address _caller) external view override returns (bool _enabled) {
return _callers.contains(_caller);
}
function callerStealthContract(address _caller, address _contract) external view override returns (bool _enabled) {
return _callerStealthContracts[_caller].contains(_contract);
}
function bond() external payable override nonReentrant() {
require(msg.value > 0, 'SV: bond more than zero');
bonded[msg.sender] = bonded[msg.sender] + msg.value;
totalBonded = totalBonded + msg.value;
emit Bonded(msg.sender, msg.value, bonded[msg.sender]);
}
function unbondAll() external override {
unbond(bonded[msg.sender]);
}
function startUnbond() public override nonReentrant() {
canUnbondAt[msg.sender] = block.timestamp + 4 days;
}
function cancelUnbond() public override nonReentrant() {
canUnbondAt[msg.sender] = 0;
}
function unbond(uint256 _amount) public override nonReentrant() {
require(_amount > 0, 'SV: more than zero');
require(_amount <= bonded[msg.sender], 'SV: amount too high');
require(canUnbondAt[msg.sender] > 0, 'SV: not unbondind');
require(block.timestamp > canUnbondAt[msg.sender], 'SV: unbond in cooldown');
bonded[msg.sender] = bonded[msg.sender] - _amount;
totalBonded = totalBonded - _amount;
canUnbondAt[msg.sender] = 0;
payable(msg.sender).transfer(_amount);
emit Unbonded(msg.sender, _amount, bonded[msg.sender]);
}
function _penalize(
address _caller,
uint256 _penalty,
address _reportedBy
) internal {
bonded[_caller] = bonded[_caller] - _penalty;
uint256 _amountReward = _penalty / 10;
bonded[_reportedBy] = bonded[_reportedBy] + _amountReward;
bonded[governor] = bonded[governor] + (_penalty - _amountReward);
}
modifier OnlyOneCallStack() {
uint256 _gasLeftPlusBuffer = gasleft() + gasBuffer;
require(_gasLeftPlusBuffer >= (block.gaslimit * 63) / 64, 'SV: eoa gas check failed');
_;
}
// Hash
function validateHash(
address _caller,
bytes32 _hash,
uint256 _penalty
) external virtual override OnlyOneCallStack() nonReentrant() returns (bool _valid) {
// Caller is required to be an EOA to avoid on-chain hash generation to bypass penalty.
// solhint-disable-next-line avoid-tx-origin
require(_caller == tx.origin, 'SV: not eoa');
require(_callerStealthContracts[_caller].contains(msg.sender), 'SV: contract not enabled');
require(bonded[_caller] >= _penalty, 'SV: not enough bonded');
require(canUnbondAt[_caller] == 0, 'SV: unbonding');
address reportedBy = hashReportedBy[_hash];
if (reportedBy != address(0)) {
// User reported this TX as public, locking penalty away
_penalize(_caller, _penalty, reportedBy);
emit PenaltyApplied(_hash, _caller, _penalty, reportedBy);
// invalid: has was reported
return false;
}
emit ValidatedHash(_hash, _caller, _penalty);
// valid: hash was not reported
return true;
}
function reportHash(bytes32 _hash) external override nonReentrant() {
_reportHash(_hash);
}
function reportHashAndPay(bytes32 _hash) external payable override nonReentrant() {
_reportHash(_hash);
block.coinbase.transfer(msg.value);
}
function _reportHash(bytes32 _hash) internal {
require(hashReportedBy[_hash] == address(0), 'SV: hash already reported');
hashReportedBy[_hash] = msg.sender;
emit ReportedHash(_hash, msg.sender);
}
// Caller Contracts
function enableStealthContract(address _contract) external override nonReentrant() {
_addCallerContract(_contract);
emit StealthContractEnabled(msg.sender, _contract);
}
function enableStealthContracts(address[] calldata _contracts) external override nonReentrant() {
for (uint256 i = 0; i < _contracts.length; i++) {
_addCallerContract(_contracts[i]);
}
emit StealthContractsEnabled(msg.sender, _contracts);
}
function disableStealthContract(address _contract) external override nonReentrant() {
_removeCallerContract(_contract);
emit StealthContractDisabled(msg.sender, _contract);
}
function disableStealthContracts(address[] calldata _contracts) external override nonReentrant() {
for (uint256 i = 0; i < _contracts.length; i++) {
_removeCallerContract(_contracts[i]);
}
emit StealthContractsDisabled(msg.sender, _contracts);
}
function _addCallerContract(address _contract) internal {
if (!_callers.contains(msg.sender)) _callers.add(msg.sender);
require(_callerStealthContracts[msg.sender].add(_contract), 'SV: contract already added');
}
function _removeCallerContract(address _contract) internal {
require(_callerStealthContracts[msg.sender].remove(_contract), 'SV: contract not found');
if (_callerStealthContracts[msg.sender].length() == 0) _callers.remove(msg.sender);
}
// Manageable: restricted-access
function setGasBuffer(uint256 _gasBuffer) external virtual override onlyManager {
require(_gasBuffer < (block.gaslimit * 63) / 64, 'SV: gasBuffer too high');
gasBuffer = _gasBuffer;
}
// Governable: restricted-access
function transferGovernorBond(address _caller, uint256 _amount) external override onlyGovernor {
bonded[governor] = bonded[governor] - _amount;
bonded[_caller] = bonded[_caller] + _amount;
}
function transferBondToGovernor(address _caller, uint256 _amount) external override onlyGovernor {
bonded[_caller] = bonded[_caller] - _amount;
bonded[governor] = bonded[governor] + _amount;
}
// Manageable: setters
function setPendingManager(address _pendingManager) external override onlyGovernor {
_setPendingManager(_pendingManager);
}
function acceptManager() external override onlyPendingManager {
_acceptManager();
}
// Governable: setters
function setPendingGovernor(address _pendingGovernor) external override onlyGovernor {
_setPendingGovernor(_pendingGovernor);
}
function acceptGovernor() external override onlyPendingGovernor {
_acceptGovernor();
}
// Collectable Dust: restricted-access
function sendDust(
address _to,
address _token,
uint256 _amount
) external override onlyGovernor {
_sendDust(_to, _token, _amount);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
import '@openzeppelin/contracts/utils/structs/EnumerableSet.sol';
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import '../../interfaces/utils/ICollectableDust.sol';
abstract
contract CollectableDust is ICollectableDust {
using SafeERC20 for IERC20;
using EnumerableSet for EnumerableSet.AddressSet;
address public constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
EnumerableSet.AddressSet internal protocolTokens;
constructor() {}
function _addProtocolToken(address _token) internal {
require(!protocolTokens.contains(_token), 'collectable-dust/token-is-part-of-the-protocol');
protocolTokens.add(_token);
}
function _removeProtocolToken(address _token) internal {
require(protocolTokens.contains(_token), 'collectable-dust/token-not-part-of-the-protocol');
protocolTokens.remove(_token);
}
function _sendDust(
address _to,
address _token,
uint256 _amount
) internal {
require(_to != address(0), 'collectable-dust/cant-send-dust-to-zero-address');
require(!protocolTokens.contains(_token), 'collectable-dust/token-is-part-of-the-protocol');
if (_token == ETH_ADDRESS) {
payable(_to).transfer(_amount);
} else {
IERC20(_token).safeTransfer(_to, _amount);
}
emit DustSent(_to, _token, _amount);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
import '../../interfaces/utils/IGovernable.sol';
abstract
contract Governable is IGovernable {
address public override governor;
address public override pendingGovernor;
constructor(address _governor) {
require(_governor != address(0), 'governable/governor-should-not-be-zero-address');
governor = _governor;
}
function _setPendingGovernor(address _pendingGovernor) internal {
require(_pendingGovernor != address(0), 'governable/pending-governor-should-not-be-zero-addres');
pendingGovernor = _pendingGovernor;
emit PendingGovernorSet(_pendingGovernor);
}
function _acceptGovernor() internal {
governor = pendingGovernor;
pendingGovernor = address(0);
emit GovernorAccepted();
}
function isGovernor(address _account) public view override returns (bool _isGovernor) {
return _account == governor;
}
modifier onlyGovernor {
require(isGovernor(msg.sender), 'governable/only-governor');
_;
}
modifier onlyPendingGovernor {
require(msg.sender == pendingGovernor, 'governable/only-pending-governor');
_;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
import '../../interfaces/utils/IManageable.sol';
abstract
contract Manageable is IManageable {
address public override manager;
address public override pendingManager;
constructor(address _manager) {
require(_manager != address(0), 'manageable/manager-should-not-be-zero-address');
manager = _manager;
}
function _setPendingManager(address _pendingManager) internal {
require(_pendingManager != address(0), 'manageable/pending-manager-should-not-be-zero-addres');
pendingManager = _pendingManager;
emit PendingManagerSet(_pendingManager);
}
function _acceptManager() internal {
manager = pendingManager;
pendingManager = address(0);
emit ManagerAccepted();
}
function isManager(address _account) public view override returns (bool _isManager) {
return _account == manager;
}
modifier onlyManager {
require(isManager(msg.sender), 'manageable/only-manager');
_;
}
modifier onlyPendingManager {
require(msg.sender == pendingManager, 'manageable/only-pending-manager');
_;
}
}// SPDX-License-Identifier: MIT
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.
*/
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;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
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) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
// 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);
}
// 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))));
}
// 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 on 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));
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
interface IStealthVault {
//events
event Bonded(address indexed _caller, uint256 _amount, uint256 _finalBond);
event Unbonded(address indexed _caller, uint256 _amount, uint256 _finalBond);
event ReportedHash(bytes32 _hash, address _reportedBy);
event PenaltyApplied(bytes32 _hash, address _caller, uint256 _penalty, address _reportedBy);
event ValidatedHash(bytes32 _hash, address _caller, uint256 _penalty);
event StealthContractEnabled(address indexed _caller, address _contract);
event StealthContractsEnabled(address indexed _caller, address[] _contracts);
event StealthContractDisabled(address indexed _caller, address _contract);
event StealthContractsDisabled(address indexed _caller, address[] _contracts);
function isStealthVault() external pure returns (bool);
// getters
function callers() external view returns (address[] memory _callers);
function callerContracts(address _caller) external view returns (address[] memory _contracts);
// global bond
function gasBuffer() external view returns (uint256 _gasBuffer);
function totalBonded() external view returns (uint256 _totalBonded);
function bonded(address _caller) external view returns (uint256 _bond);
function canUnbondAt(address _caller) external view returns (uint256 _canUnbondAt);
// global caller
function caller(address _caller) external view returns (bool _enabled);
function callerStealthContract(address _caller, address _contract) external view returns (bool _enabled);
// global hash
function hashReportedBy(bytes32 _hash) external view returns (address _reportedBy);
// governor
function setGasBuffer(uint256 _gasBuffer) external;
function transferGovernorBond(address _caller, uint256 _amount) external;
function transferBondToGovernor(address _caller, uint256 _amount) external;
// caller
function bond() external payable;
function startUnbond() external;
function cancelUnbond() external;
function unbondAll() external;
function unbond(uint256 _amount) external;
function enableStealthContract(address _contract) external;
function enableStealthContracts(address[] calldata _contracts) external;
function disableStealthContract(address _contract) external;
function disableStealthContracts(address[] calldata _contracts) external;
// stealth-contract
function validateHash(
address _caller,
bytes32 _hash,
uint256 _penalty
) external returns (bool);
// watcher
function reportHash(bytes32 _hash) external;
function reportHashAndPay(bytes32 _hash) external payable;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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 `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);
/**
* @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);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../IERC20.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'
// solhint-disable-next-line max-line-length
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));
}
}
/**
* @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
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
interface ICollectableDust {
event DustSent(address _to, address token, uint256 amount);
function sendDust(address _to, address _token, uint256 _amount) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @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
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 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");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(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 functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
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");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
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) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
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) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// 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
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
interface IGovernable {
event PendingGovernorSet(address pendingGovernor);
event GovernorAccepted();
function setPendingGovernor(address _pendingGovernor) external;
function acceptGovernor() external;
function governor() external view returns (address _governor);
function pendingGovernor() external view returns (address _pendingGovernor);
function isGovernor(address _account) external view returns (bool _isGovernor);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
interface IManageable {
event PendingManagerSet(address pendingManager);
event ManagerAccepted();
function setPendingManager(address _pendingManager) external;
function acceptManager() external;
function manager() external view returns (address _manager);
function pendingManager() external view returns (address _pendingManager);
function isManager(address _account) external view returns (bool _isManager);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_finalBond","type":"uint256"}],"name":"Bonded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DustSent","type":"event"},{"anonymous":false,"inputs":[],"name":"GovernorAccepted","type":"event"},{"anonymous":false,"inputs":[],"name":"ManagerAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_hash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"_penalty","type":"uint256"},{"indexed":false,"internalType":"address","name":"_reportedBy","type":"address"}],"name":"PenaltyApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingGovernor","type":"address"}],"name":"PendingGovernorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingManager","type":"address"}],"name":"PendingManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_hash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_reportedBy","type":"address"}],"name":"ReportedHash","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_caller","type":"address"},{"indexed":false,"internalType":"address","name":"_contract","type":"address"}],"name":"StealthContractDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_caller","type":"address"},{"indexed":false,"internalType":"address","name":"_contract","type":"address"}],"name":"StealthContractEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_caller","type":"address"},{"indexed":false,"internalType":"address[]","name":"_contracts","type":"address[]"}],"name":"StealthContractsDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_caller","type":"address"},{"indexed":false,"internalType":"address[]","name":"_contracts","type":"address[]"}],"name":"StealthContractsEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_finalBond","type":"uint256"}],"name":"Unbonded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_hash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"_penalty","type":"uint256"}],"name":"ValidatedHash","type":"event"},{"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bond","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bonded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"}],"name":"caller","outputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"}],"name":"callerContracts","outputs":[{"internalType":"address[]","name":"_callerContractsList","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"},{"internalType":"address","name":"_contract","type":"address"}],"name":"callerStealthContract","outputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callers","outputs":[{"internalType":"address[]","name":"_callersList","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canUnbondAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelUnbond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"disableStealthContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_contracts","type":"address[]"}],"name":"disableStealthContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"enableStealthContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_contracts","type":"address[]"}],"name":"enableStealthContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasBuffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"hashReportedBy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isGovernor","outputs":[{"internalType":"bool","name":"_isGovernor","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isManager","outputs":[{"internalType":"bool","name":"_isManager","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStealthVault","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"reportHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"reportHashAndPay","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sendDust","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasBuffer","type":"uint256"}],"name":"setGasBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pendingGovernor","type":"address"}],"name":"setPendingGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pendingManager","type":"address"}],"name":"setPendingManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startUnbond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalBonded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferBondToGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferGovernorBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unbond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unbondAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"},{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"uint256","name":"_penalty","type":"uint256"}],"name":"validateHash","outputs":[{"internalType":"bool","name":"_valid","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405262010f2c60075534801561001757600080fd5b503380806100835760405162461bcd60e51b815260206004820152602e60248201527f676f7665726e61626c652f676f7665726e6f722d73686f756c642d6e6f742d6260448201526d652d7a65726f2d6164647265737360901b60648201526084015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392831617905581166101035760405162461bcd60e51b815260206004820152602d60248201527f6d616e61676561626c652f6d616e616765722d73686f756c642d6e6f742d626560448201526c2d7a65726f2d6164647265737360981b606482015260840161007a565b600280546001600160a01b0319166001600160a01b03929092169190911790556001600655612579806101376000396000f3fe60806040526004361061021a5760003560e01c806372e67d0611610123578063e43581b8116100ab578063f235757f1161006f578063f235757f14610634578063f3ae241514610654578063f41fc30914610683578063f600d3cf146106a3578063fe40c4bf146106c357600080fd5b8063e43581b814610583578063e58bb639146105b2578063e8fd1184146105c7578063ebba513e146105e7578063f19e2a211461060757600080fd5b8063b0e024f7116100f2578063b0e024f7146104fc578063bfb15cbc14610510578063de480cbf14610523578063dfeb2c2814610543578063e3056a341461056357600080fd5b806372e67d06146104745780638fb9c71814610494578063a00fff6f146104b4578063a734f06e146104d457600080fd5b806327de9e32116101a657806344d96e951161017557806344d96e95146103f457806345b6e8fd1461040a578063481c6a751461043757806348ff15b31461045757806364c9ec6f1461046c57600080fd5b806327de9e32146103705780632db8c129146103905780633fdefa6e146103b05780634241e9dd146103d457600080fd5b80631441be18116101ed5780631441be18146102d657806315f7b402146102f65780631c1233b01461030b5780631d15b6111461032b57806325dd09131461035b57600080fd5b8063074dcf131461021f5780630c340a24146102725780630dfb451d14610292578063108e6cfc146102b4575b600080fd5b34801561022b57600080fd5b5061025561023a366004612306565b600c602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027e57600080fd5b50600054610255906001600160a01b031681565b34801561029e57600080fd5b506102b26102ad366004612276565b6106d8565b005b3480156102c057600080fd5b506102c96107b0565b6040516102699190612386565b3480156102e257600080fd5b506102b26102f1366004612194565b61087b565b34801561030257600080fd5b506102b26108f3565b34801561031757600080fd5b506102b2610326366004612306565b61090e565b34801561033757600080fd5b5061034b610346366004612194565b610947565b6040519015158152602001610269565b34801561036757600080fd5b506102b261095a565b34801561037c57600080fd5b506102b261038b366004612306565b6109a6565b34801561039c57600080fd5b506102b26103ab3660046121e0565b610bc9565b3480156103bc57600080fd5b506103c660075481565b604051908152602001610269565b3480156103e057600080fd5b506102b26103ef366004612276565b610c03565b34801561040057600080fd5b506103c660085481565b34801561041657600080fd5b506103c6610425366004612194565b600a6020526000908152604090205481565b34801561044357600080fd5b50600254610255906001600160a01b031681565b34801561046357600080fd5b506102b2610cc1565b6102b2610d23565b34801561048057600080fd5b506102b261048f366004612194565b610e23565b3480156104a057600080fd5b5061034b6104af3660046121ae565b610e59565b3480156104c057600080fd5b50600354610255906001600160a01b031681565b3480156104e057600080fd5b5061025573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b34801561050857600080fd5b50600161034b565b6102b261051e366004612306565b610e82565b34801561052f57600080fd5b506102b261053e366004612194565b610ee8565b34801561054f57600080fd5b506102b261055e36600461224d565b610f54565b34801561056f57600080fd5b50600154610255906001600160a01b031681565b34801561058f57600080fd5b5061034b61059e366004612194565b6000546001600160a01b0391821691161490565b3480156105be57600080fd5b506102b2610ff2565b3480156105d357600080fd5b506102b26105e236600461224d565b611054565b3480156105f357600080fd5b5061034b61060236600461221b565b6110f1565b34801561061357600080fd5b506103c6610622366004612194565b60096020526000908152604090205481565b34801561064057600080fd5b506102b261064f366004612194565b6113db565b34801561066057600080fd5b5061034b61066f366004612194565b6002546001600160a01b0391821691161490565b34801561068f57600080fd5b506102b261069e366004612306565b61140e565b3480156106af57600080fd5b506102c96106be366004612194565b6114cb565b3480156106cf57600080fd5b506102b26115de565b600260065414156107045760405162461bcd60e51b81526004016106fb9061243d565b60405180910390fd5b600260065560005b818110156107635761075183838381811061073757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061074c9190612194565b611618565b8061075b81612512565b91505061070c565b50336001600160a01b03167fbcb9cc97f139eeb06e506e335f87e6ff975e3f146f3ed5cb49fd1d4c3a73a180838360405161079f92919061233a565b60405180910390a250506001600655565b60606107bc600d6116a1565b67ffffffffffffffff8111156107e257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561080b578160200160208202803683370190505b50905060005b61081b600d6116a1565b8110156108775761082d600d826116ab565b82828151811061084d57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101528061086f81612512565b915050610811565b5090565b6002600654141561089e5760405162461bcd60e51b81526004016106fb9061243d565b60026006556108ac81611618565b6040516001600160a01b038216815233907f2b2676fc13806310c71624d03e7bf3a36e481fd1b8908f1bf9dd7a73eb71f95b906020015b60405180910390a2506001600655565b3360009081526009602052604090205461090c906109a6565b565b600260065414156109315760405162461bcd60e51b81526004016106fb9061243d565b600260065561093f816116b7565b506001600655565b6000610954600d83611779565b92915050565b6002600654141561097d5760405162461bcd60e51b81526004016106fb9061243d565b600260065561098f4262054600612474565b336000908152600a60205260409020556001600655565b600260065414156109c95760405162461bcd60e51b81526004016106fb9061243d565b600260065580610a105760405162461bcd60e51b815260206004820152601260248201527153563a206d6f7265207468616e207a65726f60701b60448201526064016106fb565b33600090815260096020526040902054811115610a655760405162461bcd60e51b81526020600482015260136024820152720a6ac7440c2dadeeadce840e8dede40d0d2ced606b1b60448201526064016106fb565b336000908152600a6020526040902054610ab55760405162461bcd60e51b815260206004820152601160248201527014d58e881b9bdd081d5b989bdb991a5b99607a1b60448201526064016106fb565b336000908152600a60205260409020544211610b0c5760405162461bcd60e51b815260206004820152601660248201527529ab1d103ab73137b7321034b71031b7b7b63237bbb760511b60448201526064016106fb565b33600090815260096020526040902054610b279082906124cb565b33600090815260096020526040902055600854610b459082906124cb565b600855336000818152600a60205260408082208290555183156108fc0291849190818181858888f19350505050158015610b83573d6000803e3d6000fd5b5033600081815260096020908152604091829020548251858152918201527f6377e6852c3c3eb914806be9085171e0f4e00da79573f3f740695326ba92a61291016108e3565b6000546001600160a01b03163314610bf35760405162461bcd60e51b81526004016106fb90612406565b610bfe83838361179b565b505050565b60026006541415610c265760405162461bcd60e51b81526004016106fb9061243d565b600260065560005b81811015610c8557610c73838383818110610c5957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c6e9190612194565b61193d565b80610c7d81612512565b915050610c2e565b50336001600160a01b03167f94c38a7de565f6af7d3938586088629e43576475b9270dbc5312852c73157f39838360405161079f92919061233a565b6003546001600160a01b03163314610d1b5760405162461bcd60e51b815260206004820152601f60248201527f6d616e61676561626c652f6f6e6c792d70656e64696e672d6d616e616765720060448201526064016106fb565b61090c6119be565b60026006541415610d465760405162461bcd60e51b81526004016106fb9061243d565b600260065534610d985760405162461bcd60e51b815260206004820152601760248201527f53563a20626f6e64206d6f7265207468616e207a65726f00000000000000000060448201526064016106fb565b33600090815260096020526040902054610db3903490612474565b33600090815260096020526040902055600854610dd1903490612474565b60085533600081815260096020908152604091829020548251348152918201527f524384adee0b2f52827eebf00ddd616aa286978612393216724d61cdb43dc835910160405180910390a26001600655565b6000546001600160a01b03163314610e4d5760405162461bcd60e51b81526004016106fb90612406565b610e5681611a0e565b50565b6001600160a01b0382166000908152600b60205260408120610e7b9083611779565b9392505050565b60026006541415610ea55760405162461bcd60e51b81526004016106fb9061243d565b6002600655610eb3816116b7565b60405141903480156108fc02916000818181858888f19350505050158015610edf573d6000803e3d6000fd5b50506001600655565b60026006541415610f0b5760405162461bcd60e51b81526004016106fb9061243d565b6002600655610f198161193d565b6040516001600160a01b038216815233907f61b5fbb676c4f96aed2acfa1f569b4cfdac9cdfdc7aa5ec96c8649be3d0c6771906020016108e3565b6000546001600160a01b03163314610f7e5760405162461bcd60e51b81526004016106fb90612406565b600080546001600160a01b0316815260096020526040902054610fa29082906124cb565b600080546001600160a01b0390811682526009602052604080832093909355841681522054610fd2908290612474565b6001600160a01b0390921660009081526009602052604090209190915550565b6001546001600160a01b0316331461104c5760405162461bcd60e51b815260206004820181905260248201527f676f7665726e61626c652f6f6e6c792d70656e64696e672d676f7665726e6f7260448201526064016106fb565b61090c611acf565b6000546001600160a01b0316331461107e5760405162461bcd60e51b81526004016106fb90612406565b6001600160a01b0382166000908152600960205260409020546110a29082906124cb565b6001600160a01b03808416600090815260096020526040808220939093558054909116815220546110d4908290612474565b600080546001600160a01b03168152600960205260409020555050565b6000806007545a6111029190612474565b9050604061111145603f6124ac565b61111b919061248c565b81101561116a5760405162461bcd60e51b815260206004820152601860248201527f53563a20656f612067617320636865636b206661696c6564000000000000000060448201526064016106fb565b6002600654141561118d5760405162461bcd60e51b81526004016106fb9061243d565b60026006556001600160a01b03851632146111d85760405162461bcd60e51b815260206004820152600b60248201526a53563a206e6f7420656f6160a81b60448201526064016106fb565b6001600160a01b0385166000908152600b602052604090206111fa9033611779565b6112465760405162461bcd60e51b815260206004820152601860248201527f53563a20636f6e7472616374206e6f7420656e61626c6564000000000000000060448201526064016106fb565b6001600160a01b0385166000908152600960205260409020548311156112a65760405162461bcd60e51b815260206004820152601560248201527414d58e881b9bdd08195b9bdd59da08189bdb991959605a1b60448201526064016106fb565b6001600160a01b0385166000908152600a6020526040902054156112fc5760405162461bcd60e51b815260206004820152600d60248201526c53563a20756e626f6e64696e6760981b60448201526064016106fb565b6000848152600c60205260409020546001600160a01b0316801561137f57611325868583611b1f565b604080518681526001600160a01b0388811660208301528183018790528316606082015290517f7be02a2fd54c37d0e0b778041218b63d326601099b9fa370509ce354d1a3e6b19181900360800190a160009250506113ce565b604080518681526001600160a01b03881660208201529081018590527f5910d0b06d5b6cf4a55816a77f9d0a2f503457ea8a5cabfb1a5ff5118f3484349060600160405180910390a160019250505b5060016006559392505050565b6000546001600160a01b031633146114055760405162461bcd60e51b81526004016106fb90612406565b610e5681611bf6565b6002546001600160a01b031633146114685760405162461bcd60e51b815260206004820152601760248201527f6d616e61676561626c652f6f6e6c792d6d616e6167657200000000000000000060448201526064016106fb565b604061147545603f6124ac565b61147f919061248c565b81106114c65760405162461bcd60e51b81526020600482015260166024820152750a6ac7440cec2e684eacccccae440e8dede40d0d2ced60531b60448201526064016106fb565b600755565b6001600160a01b0381166000908152600b602052604090206060906114ef906116a1565b67ffffffffffffffff81111561151557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060005b6001600160a01b0383166000908152600b60205260409020611565906116a1565b8110156115d8576001600160a01b0383166000908152600b6020526040902061158e90826116ab565b8282815181106115ae57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152806115d081612512565b915050611544565b50919050565b600260065414156116015760405162461bcd60e51b81526004016106fb9061243d565b336000908152600a60205260408120556001600655565b336000908152600b602052604090206116319082611cb8565b6116765760405162461bcd60e51b815260206004820152601660248201527514d58e8818dbdb9d1c9858dd081b9bdd08199bdd5b9960521b60448201526064016106fb565b336000908152600b6020526040902061168e906116a1565b610e565761169d600d33611cb8565b5050565b6000610954825490565b6000610e7b8383611ccd565b6000818152600c60205260409020546001600160a01b03161561171c5760405162461bcd60e51b815260206004820152601960248201527f53563a206861736820616c7265616479207265706f727465640000000000000060448201526064016106fb565b6000818152600c602090815260409182902080546001600160a01b031916339081179091558251848152918201527fb36d3204afeab0f1b9e9a7c0fc862d02ae59998e7f1b7bae706d9385c984710191015b60405180910390a150565b6001600160a01b03811660009081526001830160205260408120541515610e7b565b6001600160a01b0383166118095760405162461bcd60e51b815260206004820152602f60248201527f636f6c6c65637461626c652d647573742f63616e742d73656e642d647573742d60448201526e746f2d7a65726f2d6164647265737360881b60648201526084016106fb565b611814600483611779565b156118785760405162461bcd60e51b815260206004820152602e60248201527f636f6c6c65637461626c652d647573742f746f6b656e2d69732d706172742d6f60448201526d198b5d1a194b5c1c9bdd1bd8dbdb60921b60648201526084016106fb565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156118d9576040516001600160a01b0384169082156108fc029083906000818181858888f193505050501580156118d3573d6000803e3d6000fd5b506118ed565b6118ed6001600160a01b0383168483611d61565b604080516001600160a01b038086168252841660208201529081018290527f1e34c1aee8e83c2dcc14c21bb4bfeea7f46c0c998cb797ac7cc4d7a18f5c656b9060600160405180910390a1505050565b611948600d33611779565b61195957611957600d33611db3565b505b336000908152600b602052604090206119729082611db3565b610e565760405162461bcd60e51b815260206004820152601a60248201527f53563a20636f6e747261637420616c726561647920616464656400000000000060448201526064016106fb565b60038054600280546001600160a01b03199081166001600160a01b038416179091551690556040517fe612cd6de6d0c300d83e2ae8e67306e2417bed7075e47af680e1ae64c6221a5490600090a1565b6001600160a01b038116611a815760405162461bcd60e51b815260206004820152603460248201527f6d616e61676561626c652f70656e64696e672d6d616e616765722d73686f756c604482015273642d6e6f742d62652d7a65726f2d61646472657360601b60648201526084016106fb565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f3025986a13cb430ec0d10d77ec0049e08699da116679264966ee1436a39562549060200161176e565b60018054600080546001600160a01b03199081166001600160a01b0384161782559091169091556040517f7880f0fcc848e1f26e461654b100a69f8d0641e29aa29f6596c6afadbb36b5ea9190a1565b6001600160a01b038316600090815260096020526040902054611b439083906124cb565b6001600160a01b038416600090815260096020526040812091909155611b6a600a8461248c565b6001600160a01b038316600090815260096020526040902054909150611b91908290612474565b6001600160a01b038316600090815260096020526040902055611bb481846124cb565b600080546001600160a01b0316815260096020526040902054611bd79190612474565b600080546001600160a01b031681526009602052604090205550505050565b6001600160a01b038116611c6a5760405162461bcd60e51b815260206004820152603560248201527f676f7665726e61626c652f70656e64696e672d676f7665726e6f722d73686f756044820152746c642d6e6f742d62652d7a65726f2d61646472657360581b60648201526084016106fb565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f56bddfa0cee9697cebddf9acd7f23dc6583663b05e007b877056d05017994def9060200161176e565b6000610e7b836001600160a01b038416611dc8565b81546000908210611d2b5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016106fb565b826000018281548110611d4e57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610bfe908490611edf565b6000610e7b836001600160a01b038416611fb1565b60008181526001830160205260408120548015611ed5576000611dec6001836124cb565b8554909150600090611e00906001906124cb565b90506000866000018281548110611e2757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611e5857634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260018901909152604090208490558654879080611e9957634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610954565b6000915050610954565b6000611f34826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120009092919063ffffffff16565b805190915015610bfe5780806020019051810190611f5291906122e6565b610bfe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106fb565b6000818152600183016020526040812054611ff857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610954565b506000610954565b606061200f8484600085612017565b949350505050565b6060824710156120785760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106fb565b843b6120c65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106fb565b600080866001600160a01b031685876040516120e2919061231e565b60006040518083038185875af1925050503d806000811461211f576040519150601f19603f3d011682016040523d82523d6000602084013e612124565b606091505b509150915061213482828661213f565b979650505050505050565b6060831561214e575081610e7b565b82511561215e5782518084602001fd5b8160405162461bcd60e51b81526004016106fb91906123d3565b80356001600160a01b038116811461218f57600080fd5b919050565b6000602082840312156121a5578081fd5b610e7b82612178565b600080604083850312156121c0578081fd5b6121c983612178565b91506121d760208401612178565b90509250929050565b6000806000606084860312156121f4578081fd5b6121fd84612178565b925061220b60208501612178565b9150604084013590509250925092565b60008060006060848603121561222f578283fd5b61223884612178565b95602085013595506040909401359392505050565b6000806040838503121561225f578182fd5b61226883612178565b946020939093013593505050565b60008060208385031215612288578182fd5b823567ffffffffffffffff8082111561229f578384fd5b818501915085601f8301126122b2578384fd5b8135818111156122c0578485fd5b8660208260051b85010111156122d4578485fd5b60209290920196919550909350505050565b6000602082840312156122f7578081fd5b81518015158114610e7b578182fd5b600060208284031215612317578081fd5b5035919050565b600082516123308184602087016124e2565b9190910192915050565b60208082528181018390526000908460408401835b8681101561237b576001600160a01b0361236884612178565b168252918301919083019060010161234f565b509695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156123c75783516001600160a01b0316835292840192918401916001016123a2565b50909695505050505050565b60208152600082518060208401526123f28160408501602087016124e2565b601f01601f19169190910160400192915050565b60208082526018908201527f676f7665726e61626c652f6f6e6c792d676f7665726e6f720000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156124875761248761252d565b500190565b6000826124a757634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156124c6576124c661252d565b500290565b6000828210156124dd576124dd61252d565b500390565b60005b838110156124fd5781810151838201526020016124e5565b8381111561250c576000848401525b50505050565b60006000198214156125265761252661252d565b5060010190565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220200ab9dd250b81cbf5b01aae7dccfdd8be3152bea0437a9fb3cce5b94f7339b764736f6c63430008040033
Deployed Bytecode
0x60806040526004361061021a5760003560e01c806372e67d0611610123578063e43581b8116100ab578063f235757f1161006f578063f235757f14610634578063f3ae241514610654578063f41fc30914610683578063f600d3cf146106a3578063fe40c4bf146106c357600080fd5b8063e43581b814610583578063e58bb639146105b2578063e8fd1184146105c7578063ebba513e146105e7578063f19e2a211461060757600080fd5b8063b0e024f7116100f2578063b0e024f7146104fc578063bfb15cbc14610510578063de480cbf14610523578063dfeb2c2814610543578063e3056a341461056357600080fd5b806372e67d06146104745780638fb9c71814610494578063a00fff6f146104b4578063a734f06e146104d457600080fd5b806327de9e32116101a657806344d96e951161017557806344d96e95146103f457806345b6e8fd1461040a578063481c6a751461043757806348ff15b31461045757806364c9ec6f1461046c57600080fd5b806327de9e32146103705780632db8c129146103905780633fdefa6e146103b05780634241e9dd146103d457600080fd5b80631441be18116101ed5780631441be18146102d657806315f7b402146102f65780631c1233b01461030b5780631d15b6111461032b57806325dd09131461035b57600080fd5b8063074dcf131461021f5780630c340a24146102725780630dfb451d14610292578063108e6cfc146102b4575b600080fd5b34801561022b57600080fd5b5061025561023a366004612306565b600c602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027e57600080fd5b50600054610255906001600160a01b031681565b34801561029e57600080fd5b506102b26102ad366004612276565b6106d8565b005b3480156102c057600080fd5b506102c96107b0565b6040516102699190612386565b3480156102e257600080fd5b506102b26102f1366004612194565b61087b565b34801561030257600080fd5b506102b26108f3565b34801561031757600080fd5b506102b2610326366004612306565b61090e565b34801561033757600080fd5b5061034b610346366004612194565b610947565b6040519015158152602001610269565b34801561036757600080fd5b506102b261095a565b34801561037c57600080fd5b506102b261038b366004612306565b6109a6565b34801561039c57600080fd5b506102b26103ab3660046121e0565b610bc9565b3480156103bc57600080fd5b506103c660075481565b604051908152602001610269565b3480156103e057600080fd5b506102b26103ef366004612276565b610c03565b34801561040057600080fd5b506103c660085481565b34801561041657600080fd5b506103c6610425366004612194565b600a6020526000908152604090205481565b34801561044357600080fd5b50600254610255906001600160a01b031681565b34801561046357600080fd5b506102b2610cc1565b6102b2610d23565b34801561048057600080fd5b506102b261048f366004612194565b610e23565b3480156104a057600080fd5b5061034b6104af3660046121ae565b610e59565b3480156104c057600080fd5b50600354610255906001600160a01b031681565b3480156104e057600080fd5b5061025573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b34801561050857600080fd5b50600161034b565b6102b261051e366004612306565b610e82565b34801561052f57600080fd5b506102b261053e366004612194565b610ee8565b34801561054f57600080fd5b506102b261055e36600461224d565b610f54565b34801561056f57600080fd5b50600154610255906001600160a01b031681565b34801561058f57600080fd5b5061034b61059e366004612194565b6000546001600160a01b0391821691161490565b3480156105be57600080fd5b506102b2610ff2565b3480156105d357600080fd5b506102b26105e236600461224d565b611054565b3480156105f357600080fd5b5061034b61060236600461221b565b6110f1565b34801561061357600080fd5b506103c6610622366004612194565b60096020526000908152604090205481565b34801561064057600080fd5b506102b261064f366004612194565b6113db565b34801561066057600080fd5b5061034b61066f366004612194565b6002546001600160a01b0391821691161490565b34801561068f57600080fd5b506102b261069e366004612306565b61140e565b3480156106af57600080fd5b506102c96106be366004612194565b6114cb565b3480156106cf57600080fd5b506102b26115de565b600260065414156107045760405162461bcd60e51b81526004016106fb9061243d565b60405180910390fd5b600260065560005b818110156107635761075183838381811061073757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061074c9190612194565b611618565b8061075b81612512565b91505061070c565b50336001600160a01b03167fbcb9cc97f139eeb06e506e335f87e6ff975e3f146f3ed5cb49fd1d4c3a73a180838360405161079f92919061233a565b60405180910390a250506001600655565b60606107bc600d6116a1565b67ffffffffffffffff8111156107e257634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561080b578160200160208202803683370190505b50905060005b61081b600d6116a1565b8110156108775761082d600d826116ab565b82828151811061084d57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101528061086f81612512565b915050610811565b5090565b6002600654141561089e5760405162461bcd60e51b81526004016106fb9061243d565b60026006556108ac81611618565b6040516001600160a01b038216815233907f2b2676fc13806310c71624d03e7bf3a36e481fd1b8908f1bf9dd7a73eb71f95b906020015b60405180910390a2506001600655565b3360009081526009602052604090205461090c906109a6565b565b600260065414156109315760405162461bcd60e51b81526004016106fb9061243d565b600260065561093f816116b7565b506001600655565b6000610954600d83611779565b92915050565b6002600654141561097d5760405162461bcd60e51b81526004016106fb9061243d565b600260065561098f4262054600612474565b336000908152600a60205260409020556001600655565b600260065414156109c95760405162461bcd60e51b81526004016106fb9061243d565b600260065580610a105760405162461bcd60e51b815260206004820152601260248201527153563a206d6f7265207468616e207a65726f60701b60448201526064016106fb565b33600090815260096020526040902054811115610a655760405162461bcd60e51b81526020600482015260136024820152720a6ac7440c2dadeeadce840e8dede40d0d2ced606b1b60448201526064016106fb565b336000908152600a6020526040902054610ab55760405162461bcd60e51b815260206004820152601160248201527014d58e881b9bdd081d5b989bdb991a5b99607a1b60448201526064016106fb565b336000908152600a60205260409020544211610b0c5760405162461bcd60e51b815260206004820152601660248201527529ab1d103ab73137b7321034b71031b7b7b63237bbb760511b60448201526064016106fb565b33600090815260096020526040902054610b279082906124cb565b33600090815260096020526040902055600854610b459082906124cb565b600855336000818152600a60205260408082208290555183156108fc0291849190818181858888f19350505050158015610b83573d6000803e3d6000fd5b5033600081815260096020908152604091829020548251858152918201527f6377e6852c3c3eb914806be9085171e0f4e00da79573f3f740695326ba92a61291016108e3565b6000546001600160a01b03163314610bf35760405162461bcd60e51b81526004016106fb90612406565b610bfe83838361179b565b505050565b60026006541415610c265760405162461bcd60e51b81526004016106fb9061243d565b600260065560005b81811015610c8557610c73838383818110610c5957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c6e9190612194565b61193d565b80610c7d81612512565b915050610c2e565b50336001600160a01b03167f94c38a7de565f6af7d3938586088629e43576475b9270dbc5312852c73157f39838360405161079f92919061233a565b6003546001600160a01b03163314610d1b5760405162461bcd60e51b815260206004820152601f60248201527f6d616e61676561626c652f6f6e6c792d70656e64696e672d6d616e616765720060448201526064016106fb565b61090c6119be565b60026006541415610d465760405162461bcd60e51b81526004016106fb9061243d565b600260065534610d985760405162461bcd60e51b815260206004820152601760248201527f53563a20626f6e64206d6f7265207468616e207a65726f00000000000000000060448201526064016106fb565b33600090815260096020526040902054610db3903490612474565b33600090815260096020526040902055600854610dd1903490612474565b60085533600081815260096020908152604091829020548251348152918201527f524384adee0b2f52827eebf00ddd616aa286978612393216724d61cdb43dc835910160405180910390a26001600655565b6000546001600160a01b03163314610e4d5760405162461bcd60e51b81526004016106fb90612406565b610e5681611a0e565b50565b6001600160a01b0382166000908152600b60205260408120610e7b9083611779565b9392505050565b60026006541415610ea55760405162461bcd60e51b81526004016106fb9061243d565b6002600655610eb3816116b7565b60405141903480156108fc02916000818181858888f19350505050158015610edf573d6000803e3d6000fd5b50506001600655565b60026006541415610f0b5760405162461bcd60e51b81526004016106fb9061243d565b6002600655610f198161193d565b6040516001600160a01b038216815233907f61b5fbb676c4f96aed2acfa1f569b4cfdac9cdfdc7aa5ec96c8649be3d0c6771906020016108e3565b6000546001600160a01b03163314610f7e5760405162461bcd60e51b81526004016106fb90612406565b600080546001600160a01b0316815260096020526040902054610fa29082906124cb565b600080546001600160a01b0390811682526009602052604080832093909355841681522054610fd2908290612474565b6001600160a01b0390921660009081526009602052604090209190915550565b6001546001600160a01b0316331461104c5760405162461bcd60e51b815260206004820181905260248201527f676f7665726e61626c652f6f6e6c792d70656e64696e672d676f7665726e6f7260448201526064016106fb565b61090c611acf565b6000546001600160a01b0316331461107e5760405162461bcd60e51b81526004016106fb90612406565b6001600160a01b0382166000908152600960205260409020546110a29082906124cb565b6001600160a01b03808416600090815260096020526040808220939093558054909116815220546110d4908290612474565b600080546001600160a01b03168152600960205260409020555050565b6000806007545a6111029190612474565b9050604061111145603f6124ac565b61111b919061248c565b81101561116a5760405162461bcd60e51b815260206004820152601860248201527f53563a20656f612067617320636865636b206661696c6564000000000000000060448201526064016106fb565b6002600654141561118d5760405162461bcd60e51b81526004016106fb9061243d565b60026006556001600160a01b03851632146111d85760405162461bcd60e51b815260206004820152600b60248201526a53563a206e6f7420656f6160a81b60448201526064016106fb565b6001600160a01b0385166000908152600b602052604090206111fa9033611779565b6112465760405162461bcd60e51b815260206004820152601860248201527f53563a20636f6e7472616374206e6f7420656e61626c6564000000000000000060448201526064016106fb565b6001600160a01b0385166000908152600960205260409020548311156112a65760405162461bcd60e51b815260206004820152601560248201527414d58e881b9bdd08195b9bdd59da08189bdb991959605a1b60448201526064016106fb565b6001600160a01b0385166000908152600a6020526040902054156112fc5760405162461bcd60e51b815260206004820152600d60248201526c53563a20756e626f6e64696e6760981b60448201526064016106fb565b6000848152600c60205260409020546001600160a01b0316801561137f57611325868583611b1f565b604080518681526001600160a01b0388811660208301528183018790528316606082015290517f7be02a2fd54c37d0e0b778041218b63d326601099b9fa370509ce354d1a3e6b19181900360800190a160009250506113ce565b604080518681526001600160a01b03881660208201529081018590527f5910d0b06d5b6cf4a55816a77f9d0a2f503457ea8a5cabfb1a5ff5118f3484349060600160405180910390a160019250505b5060016006559392505050565b6000546001600160a01b031633146114055760405162461bcd60e51b81526004016106fb90612406565b610e5681611bf6565b6002546001600160a01b031633146114685760405162461bcd60e51b815260206004820152601760248201527f6d616e61676561626c652f6f6e6c792d6d616e6167657200000000000000000060448201526064016106fb565b604061147545603f6124ac565b61147f919061248c565b81106114c65760405162461bcd60e51b81526020600482015260166024820152750a6ac7440cec2e684eacccccae440e8dede40d0d2ced60531b60448201526064016106fb565b600755565b6001600160a01b0381166000908152600b602052604090206060906114ef906116a1565b67ffffffffffffffff81111561151557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561153e578160200160208202803683370190505b50905060005b6001600160a01b0383166000908152600b60205260409020611565906116a1565b8110156115d8576001600160a01b0383166000908152600b6020526040902061158e90826116ab565b8282815181106115ae57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152806115d081612512565b915050611544565b50919050565b600260065414156116015760405162461bcd60e51b81526004016106fb9061243d565b336000908152600a60205260408120556001600655565b336000908152600b602052604090206116319082611cb8565b6116765760405162461bcd60e51b815260206004820152601660248201527514d58e8818dbdb9d1c9858dd081b9bdd08199bdd5b9960521b60448201526064016106fb565b336000908152600b6020526040902061168e906116a1565b610e565761169d600d33611cb8565b5050565b6000610954825490565b6000610e7b8383611ccd565b6000818152600c60205260409020546001600160a01b03161561171c5760405162461bcd60e51b815260206004820152601960248201527f53563a206861736820616c7265616479207265706f727465640000000000000060448201526064016106fb565b6000818152600c602090815260409182902080546001600160a01b031916339081179091558251848152918201527fb36d3204afeab0f1b9e9a7c0fc862d02ae59998e7f1b7bae706d9385c984710191015b60405180910390a150565b6001600160a01b03811660009081526001830160205260408120541515610e7b565b6001600160a01b0383166118095760405162461bcd60e51b815260206004820152602f60248201527f636f6c6c65637461626c652d647573742f63616e742d73656e642d647573742d60448201526e746f2d7a65726f2d6164647265737360881b60648201526084016106fb565b611814600483611779565b156118785760405162461bcd60e51b815260206004820152602e60248201527f636f6c6c65637461626c652d647573742f746f6b656e2d69732d706172742d6f60448201526d198b5d1a194b5c1c9bdd1bd8dbdb60921b60648201526084016106fb565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156118d9576040516001600160a01b0384169082156108fc029083906000818181858888f193505050501580156118d3573d6000803e3d6000fd5b506118ed565b6118ed6001600160a01b0383168483611d61565b604080516001600160a01b038086168252841660208201529081018290527f1e34c1aee8e83c2dcc14c21bb4bfeea7f46c0c998cb797ac7cc4d7a18f5c656b9060600160405180910390a1505050565b611948600d33611779565b61195957611957600d33611db3565b505b336000908152600b602052604090206119729082611db3565b610e565760405162461bcd60e51b815260206004820152601a60248201527f53563a20636f6e747261637420616c726561647920616464656400000000000060448201526064016106fb565b60038054600280546001600160a01b03199081166001600160a01b038416179091551690556040517fe612cd6de6d0c300d83e2ae8e67306e2417bed7075e47af680e1ae64c6221a5490600090a1565b6001600160a01b038116611a815760405162461bcd60e51b815260206004820152603460248201527f6d616e61676561626c652f70656e64696e672d6d616e616765722d73686f756c604482015273642d6e6f742d62652d7a65726f2d61646472657360601b60648201526084016106fb565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f3025986a13cb430ec0d10d77ec0049e08699da116679264966ee1436a39562549060200161176e565b60018054600080546001600160a01b03199081166001600160a01b0384161782559091169091556040517f7880f0fcc848e1f26e461654b100a69f8d0641e29aa29f6596c6afadbb36b5ea9190a1565b6001600160a01b038316600090815260096020526040902054611b439083906124cb565b6001600160a01b038416600090815260096020526040812091909155611b6a600a8461248c565b6001600160a01b038316600090815260096020526040902054909150611b91908290612474565b6001600160a01b038316600090815260096020526040902055611bb481846124cb565b600080546001600160a01b0316815260096020526040902054611bd79190612474565b600080546001600160a01b031681526009602052604090205550505050565b6001600160a01b038116611c6a5760405162461bcd60e51b815260206004820152603560248201527f676f7665726e61626c652f70656e64696e672d676f7665726e6f722d73686f756044820152746c642d6e6f742d62652d7a65726f2d61646472657360581b60648201526084016106fb565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f56bddfa0cee9697cebddf9acd7f23dc6583663b05e007b877056d05017994def9060200161176e565b6000610e7b836001600160a01b038416611dc8565b81546000908210611d2b5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016106fb565b826000018281548110611d4e57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610bfe908490611edf565b6000610e7b836001600160a01b038416611fb1565b60008181526001830160205260408120548015611ed5576000611dec6001836124cb565b8554909150600090611e00906001906124cb565b90506000866000018281548110611e2757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611e5857634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260018901909152604090208490558654879080611e9957634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610954565b6000915050610954565b6000611f34826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120009092919063ffffffff16565b805190915015610bfe5780806020019051810190611f5291906122e6565b610bfe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106fb565b6000818152600183016020526040812054611ff857508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610954565b506000610954565b606061200f8484600085612017565b949350505050565b6060824710156120785760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106fb565b843b6120c65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106fb565b600080866001600160a01b031685876040516120e2919061231e565b60006040518083038185875af1925050503d806000811461211f576040519150601f19603f3d011682016040523d82523d6000602084013e612124565b606091505b509150915061213482828661213f565b979650505050505050565b6060831561214e575081610e7b565b82511561215e5782518084602001fd5b8160405162461bcd60e51b81526004016106fb91906123d3565b80356001600160a01b038116811461218f57600080fd5b919050565b6000602082840312156121a5578081fd5b610e7b82612178565b600080604083850312156121c0578081fd5b6121c983612178565b91506121d760208401612178565b90509250929050565b6000806000606084860312156121f4578081fd5b6121fd84612178565b925061220b60208501612178565b9150604084013590509250925092565b60008060006060848603121561222f578283fd5b61223884612178565b95602085013595506040909401359392505050565b6000806040838503121561225f578182fd5b61226883612178565b946020939093013593505050565b60008060208385031215612288578182fd5b823567ffffffffffffffff8082111561229f578384fd5b818501915085601f8301126122b2578384fd5b8135818111156122c0578485fd5b8660208260051b85010111156122d4578485fd5b60209290920196919550909350505050565b6000602082840312156122f7578081fd5b81518015158114610e7b578182fd5b600060208284031215612317578081fd5b5035919050565b600082516123308184602087016124e2565b9190910192915050565b60208082528181018390526000908460408401835b8681101561237b576001600160a01b0361236884612178565b168252918301919083019060010161234f565b509695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156123c75783516001600160a01b0316835292840192918401916001016123a2565b50909695505050505050565b60208152600082518060208401526123f28160408501602087016124e2565b601f01601f19169190910160400192915050565b60208082526018908201527f676f7665726e61626c652f6f6e6c792d676f7665726e6f720000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156124875761248761252d565b500190565b6000826124a757634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156124c6576124c661252d565b500290565b6000828210156124dd576124dd61252d565b500390565b60005b838110156124fd5781810151838201526020016124e5565b8381111561250c576000848401525b50505050565b60006000198214156125265761252661252d565b5060010190565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220200ab9dd250b81cbf5b01aae7dccfdd8be3152bea0437a9fb3cce5b94f7339b764736f6c63430008040033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$7,889.71
Net Worth in ETH
4.001
Token Allocations
ETH
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $1,971.93 | 4.001 | $7,889.71 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.