Latest 25 from a total of 11,010 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Claim | 18993521 | 773 days ago | IN | 0 ETH | 0.0026397 | ||||
| Claim | 18971531 | 776 days ago | IN | 0 ETH | 0.00935236 | ||||
| Claim | 18971403 | 776 days ago | IN | 0 ETH | 0.00298047 | ||||
| Claim | 18969992 | 776 days ago | IN | 0 ETH | 0.00231282 | ||||
| Claim | 18963654 | 777 days ago | IN | 0 ETH | 0.00229754 | ||||
| Claim | 18949456 | 779 days ago | IN | 0 ETH | 0.00291949 | ||||
| Claim | 18949250 | 779 days ago | IN | 0 ETH | 0.00180836 | ||||
| Claim | 18944533 | 780 days ago | IN | 0 ETH | 0.00166202 | ||||
| Claim | 18919707 | 783 days ago | IN | 0 ETH | 0.00152521 | ||||
| Claim | 18900075 | 786 days ago | IN | 0 ETH | 0.00196012 | ||||
| Claim | 18878606 | 789 days ago | IN | 0 ETH | 0.00421444 | ||||
| Claim | 18853812 | 793 days ago | IN | 0 ETH | 0.01483086 | ||||
| Claim | 18836144 | 795 days ago | IN | 0 ETH | 0.00482065 | ||||
| Claim | 18811946 | 799 days ago | IN | 0 ETH | 0.00413013 | ||||
| Claim | 18694118 | 815 days ago | IN | 0 ETH | 0.00397614 | ||||
| Claim | 18676485 | 818 days ago | IN | 0 ETH | 0.00333293 | ||||
| Claim | 18529681 | 838 days ago | IN | 0 ETH | 0.00448169 | ||||
| Claim | 18508766 | 841 days ago | IN | 0 ETH | 0.00193598 | ||||
| Claim | 18304326 | 870 days ago | IN | 0 ETH | 0.00058172 | ||||
| Claim To | 18249923 | 877 days ago | IN | 0 ETH | 0.00107684 | ||||
| Claim To | 18249899 | 877 days ago | IN | 0 ETH | 0.00139629 | ||||
| Claim To | 18249880 | 877 days ago | IN | 0 ETH | 0.00150444 | ||||
| Claim To | 18249750 | 877 days ago | IN | 0 ETH | 0.00199946 | ||||
| Claim | 17955149 | 919 days ago | IN | 0 ETH | 0.00110929 | ||||
| Claim | 17773371 | 944 days ago | IN | 0 ETH | 0.00180934 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SynapseVesting
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
import { ReentrancyGuard } from "./external/openzeppelin/ReentrancyGuard.sol";
import { StableMath } from "./libraries/StableMath.sol";
import { IERC20 } from "./interfaces/IERC20.sol";
import { Ownable } from "./abstract/Ownable.sol";
import { Lockable } from "./abstract/Lockable.sol";
/**
* @title SynapseVesting
* @notice Synapse Network Vesting contract
* @dev Vesting is constantly releasing tokens every block every second
*/
contract SynapseVesting is Ownable, Lockable, ReentrancyGuard {
using StableMath for uint256;
/// @notice address of Synapse Network token
address public snpToken;
/// @notice total tokens vested in contract
/// @dev tokens from not initialized sale contracts are not included
uint256 public totalVested;
/// @notice total tokens already claimed form vesting
uint256 public totalClaimed;
/// @notice staking contract address
/// @dev set by Owner, for claimAndStake
address public stakingAddress;
struct Vest {
uint256 dateStart; // start of claiming, can claim startTokens
uint256 dateEnd; // after it all tokens can be claimed
uint256 totalTokens; // total tokens to claim
uint256 startTokens; // tokens to claim on start
uint256 claimedTokens; // tokens already claimed
}
/// @notice storage of vestings
Vest[] internal vestings;
/// @notice map of vestings for user
mapping(address => uint256[]) internal user2vesting;
struct SaleContract {
address[] contractAddresses; // list of cross sale contracts from sale round
uint256 tokensPerCent; // amount of tokens per cent for sale round
uint256 maxAmount; // max amount in USD cents for sale round
uint256 percentOnStart; // percent of tokens to claim on start
uint256 startDate; // start of claiming, can claim start tokens
uint256 endDate; // after it all tokens can be claimed
}
/// @notice list of sale contract that will be checked
SaleContract[] internal saleContracts;
/// @notice map of users that initialized vestings from sale contracts
mapping(address => bool) public vestingAdded;
/// @notice map of users that were refunded after sales
mapping(address => bool) public refunded;
/// @dev events
event Claimed(address indexed user, uint256 amount);
event Vested(address indexed user, uint256 totalAmount, uint256 endDate);
/**
* @dev Contract initiator
* @param _token address of SNP token
*/
function init(address _token) external onlyOwner {
require(_token != address(0), "_token address cannot be 0");
require(snpToken == address(0), "Init already done");
snpToken = _token;
}
/**
* @dev Add multiple vesting to contract by arrays of data
* @param _users[] addresses of holders
* @param _startTokens[] tokens that can be withdrawn at startDate
* @param _totalTokens[] total tokens in vesting
* @param _startDate date from when tokens can be claimed
* @param _endDate date after which all tokens can be claimed
*/
function massAddHolders(
address[] calldata _users,
uint256[] calldata _startTokens,
uint256[] calldata _totalTokens,
uint256 _startDate,
uint256 _endDate
) external onlyOwner whenNotLocked {
uint256 len = _users.length; //cheaper to use one variable
require((len == _startTokens.length) && (len == _totalTokens.length), "data size mismatch");
require(_startDate < _endDate, "startDate cannot exceed endDate");
uint256 i;
for (i; i < len; i++) {
_addHolder(_users[i], _startTokens[i], _totalTokens[i], _startDate, _endDate);
}
}
/**
* @dev Add new vesting to contract
* @param _user address of a holder
* @param _startTokens how many tokens are claimable at start date
* @param _totalTokens total number of tokens in added vesting
* @param _startDate date from when tokens can be claimed
* @param _endDate date after which all tokens can be claimed
*/
function _addHolder(
address _user,
uint256 _startTokens,
uint256 _totalTokens,
uint256 _startDate,
uint256 _endDate
) internal {
require(_user != address(0), "user address cannot be 0");
Vest memory v;
v.startTokens = _startTokens;
v.totalTokens = _totalTokens;
v.dateStart = _startDate;
v.dateEnd = _endDate;
totalVested += _totalTokens;
vestings.push(v);
user2vesting[_user].push(vestings.length); // we are skipping index "0" for reasons
emit Vested(_user, _totalTokens, _endDate);
}
/**
* @dev Claim tokens from msg.sender vestings
*/
function claim() external {
_claim(msg.sender, msg.sender);
}
/**
* @dev Claim tokens from msg.sender vestings to external address
* @param _target transfer address for claimed tokens
*/
function claimTo(address _target) external {
_claim(msg.sender, _target);
}
/**
* @dev Claim and stake claimed tokens directly in staking contract
* Ask staking contract if user is not in withdrawing state
*/
function claimAndStake() external {
require(stakingAddress != address(0), "Staking contract not configured");
require(IStaking(stakingAddress).canStakeTokens(msg.sender), "Unable to stake");
uint256 amt = _claim(msg.sender, stakingAddress);
IStaking(stakingAddress).onClaimAndStake(msg.sender, amt);
}
/**
* @dev internal claim function
* @param _user address of holder
* @param _target where tokens should be send
* @return amt number of tokens claimed
*/
function _claim(address _user, address _target) internal nonReentrant returns (uint256 amt) {
require(_target != address(0), "Claim, then burn");
if (!vestingAdded[_user] && !refunded[_user]) {
_addVesting(_user);
}
uint256 len = user2vesting[_user].length;
require(len > 0, "No vestings for user");
uint256 cl;
uint256 i;
for (i; i < len; i++) {
Vest storage v = vestings[user2vesting[_user][i] - 1];
cl = _claimable(v);
v.claimedTokens += cl;
amt += cl;
}
if (amt > 0) {
totalClaimed += amt;
_transfer(_target, amt);
emit Claimed(_user, amt);
} else revert("Nothing to claim");
}
/**
* @dev Internal function to send out claimed tokens
* @param _user address that we send tokens
* @param _amt amount of tokens
*/
function _transfer(address _user, uint256 _amt) internal {
require(IERC20(snpToken).transfer(_user, _amt), "Token transfer failed");
}
/**
* @dev Count how many tokens can be claimed from vesting to date
* @param _vesting Vesting object
* @return canWithdraw number of tokens
*/
function _claimable(Vest memory _vesting) internal view returns (uint256 canWithdraw) {
uint256 currentTime = block.timestamp;
if (_vesting.dateStart > currentTime) return 0;
// we are somewhere in the middle
if (currentTime < _vesting.dateEnd) {
// how much time passed (as fraction * 10^18)
// timeRatio = (time passed * 1e18) / duration
uint256 timeRatio = (currentTime - _vesting.dateStart).divPrecisely(_vesting.dateEnd - _vesting.dateStart);
// how much tokens we can get in total to date
canWithdraw = (_vesting.totalTokens - _vesting.startTokens).mulTruncate(timeRatio) + _vesting.startTokens;
}
// time has passed, we can take all tokens
else {
canWithdraw = _vesting.totalTokens;
}
// but maybe we take something earlier?
canWithdraw -= _vesting.claimedTokens;
}
/**
* @dev Read number of claimable tokens by user and vesting no
* @param _user address of holder
* @param _id his vesting number (starts from 0)
* @return amount number of tokens
*/
function getClaimable(address _user, uint256 _id) external view returns (uint256 amount) {
amount = _claimable(vestings[user2vesting[_user][_id] - 1]);
}
/**
* @dev Read total amount of tokens that user can claim to date from all vestings
* Function also includes tokens to claim from sale contracts that were not
* yet initiated for user.
* @param _user address of holder
* @return amount number of tokens
*/
function getAllClaimable(address _user) public view returns (uint256 amount) {
uint256 len = user2vesting[_user].length;
uint256 i;
for (i; i < len; i++) {
amount += _claimable(vestings[user2vesting[_user][i] - 1]);
}
if (!vestingAdded[_user]) {
amount += _claimableFromSaleContracts(_user);
}
}
/**
* @dev Extract all the vestings for the user
* Also extract not initialized vestings from
* sale contracts.
* @param _user address of holder
* @return v array of Vest objects
*/
function getVestings(address _user) external view returns (Vest[] memory) {
// array of pending vestings
Vest[] memory pV;
if (!vestingAdded[_user]) {
pV = _vestingsFromSaleContracts(_user);
}
uint256 pLen = pV.length;
uint256 len = user2vesting[_user].length;
Vest[] memory v = new Vest[](len + pLen);
// copy normal vestings
uint256 i;
for (i; i < len; i++) {
v[i] = vestings[user2vesting[_user][i] - 1];
}
// copy not initialized vestings
if (!vestingAdded[_user]) {
uint256 j;
for (j; j < pLen; j++) {
v[i + j] = pV[j];
}
}
return v;
}
/**
* @dev Read total number of vestings registered
* @return number of registered vestings on contract
*/
function getVestingsCount() external view returns (uint256) {
return vestings.length;
}
/**
* @dev Read single registered vesting entry
* @param _id index of vesting in storage
* @return Vest object
*/
function getVestingByIndex(uint256 _id) external view returns (Vest memory) {
return vestings[_id];
}
/**
* @dev Read registered vesting list by range from-to
* @param _start first index
* @param _end last index
* @return array of Vest objects
*/
function getVestingsByRange(uint256 _start, uint256 _end) external view returns (Vest[] memory) {
uint256 cnt = _end - _start + 1;
uint256 len = vestings.length;
require(_end < len, "range error");
Vest[] memory v = new Vest[](cnt);
uint256 i;
for (i; i < cnt; i++) {
v[i] = vestings[_start + i];
}
return v;
}
/**
* @dev Extract all sale contracts
* @return array of SaleContract objects
*/
function getSaleContracts() external view returns (SaleContract[] memory) {
return saleContracts;
}
/**
* @dev Read total number of sale contracts
* @return number of SaleContracts
*/
function getSaleContractsCount() external view returns (uint256) {
return saleContracts.length;
}
/**
* @dev Read single sale contract entry
* @param _id index of sale contract in storage
* @return SaleContract object
*/
function getSaleContractByIndex(uint256 _id) external view returns (SaleContract memory) {
return saleContracts[_id];
}
/**
* @dev Register sale contract
* @param _contractAddresses addresses of sale contracts
* @param _tokensPerCent sale price
* @param _maxAmount the maximum amount in USD cents for which user could buy
* @param _percentOnStart percentage of vested coins that can be claimed on start date
* @param _startDate date when initial vesting can be released
* @param _endDate final date of vesting, where all tokens can be claimed
*/
function addSaleContract(
address[] memory _contractAddresses,
uint256 _tokensPerCent,
uint256 _maxAmount,
uint256 _percentOnStart,
uint256 _startDate,
uint256 _endDate
) external onlyOwner whenNotLocked {
require(_contractAddresses.length > 0, "data is missing");
require(_startDate < _endDate, "startDate cannot exceed endDate");
SaleContract memory s;
s.contractAddresses = _contractAddresses;
s.tokensPerCent = _tokensPerCent;
s.maxAmount = _maxAmount;
s.startDate = _startDate;
s.percentOnStart = _percentOnStart;
s.endDate = _endDate;
saleContracts.push(s);
}
/**
* @dev Initialize vestings from sale contracts for msg.sender
*/
function addMyVesting() external {
_addVesting(msg.sender);
}
/**
* @dev Initialize vestings from sale contracts for target user
* @param _user address of user that will be initialized
*/
function addVesting(address _user) external {
require(_user != address(0), "User address cannot be 0");
_addVesting(_user);
}
/**
* @dev Function iterate sale contracts and initialize corresponding
* vesting for user.
* @param _user address that will be initialized
*/
function _addVesting(address _user) internal {
require(!refunded[_user], "User refunded");
require(!vestingAdded[_user], "Already done");
uint256 len = saleContracts.length;
uint256 i;
for (i; i < len; i++) {
SaleContract memory s = saleContracts[i];
uint256 sLen = s.contractAddresses.length;
uint256 j;
uint256 amt;
for (j; j < sLen; j++) {
amt += ISaleContract(s.contractAddresses[j]).balanceOf(_user);
}
// amt is in cents, so $100 = 10000
if (amt > 0) {
if (amt > s.maxAmount) {
amt = s.maxAmount;
}
// create Vest object
Vest memory v = _vestFromSaleContractAndAmount(s, amt);
// update contract data
totalVested += v.totalTokens;
vestings.push(v);
user2vesting[_user].push(vestings.length);
emit Vested(_user, v.totalTokens, v.dateEnd);
}
}
vestingAdded[_user] = true;
}
/**
* @dev Function iterate sale contracts and count claimable amounts for given user.
* Used to calculate claimable amounts from not initialized vestings.
* @param _user address of user to count claimable
* @return claimable amount of tokens
*/
function _claimableFromSaleContracts(address _user) internal view returns (uint256 claimable) {
if (refunded[_user]) return 0;
uint256 len = saleContracts.length;
if (len == 0) return 0;
uint256 i;
for (i; i < len; i++) {
SaleContract memory s = saleContracts[i];
uint256 sLen = s.contractAddresses.length;
uint256 j;
uint256 amt;
for (j; j < sLen; j++) {
amt += ISaleContract(s.contractAddresses[j]).balanceOf(_user);
}
// amt is in cents, so $100 = 10000
if (amt > 0) {
if (amt > s.maxAmount) {
amt = s.maxAmount;
}
claimable += _claimable(_vestFromSaleContractAndAmount(s, amt));
}
}
}
/**
* @dev Function iterate sale contracts and extract not initialized user vestings.
* Used to return all stored and not initialized vestings.
* @param _user address of user to extract vestings
* @return v vesting array
*/
function _vestingsFromSaleContracts(address _user) internal view returns (Vest[] memory) {
uint256 len = saleContracts.length;
if (refunded[_user] || len == 0) return new Vest[](0);
Vest[] memory v = new Vest[](_numberOfVestingsFromSaleContracts(_user));
uint256 i;
uint256 idx;
for (i; i < len; i++) {
SaleContract memory s = saleContracts[i];
uint256 sLen = s.contractAddresses.length;
uint256 j;
uint256 amt;
for (j; j < sLen; j++) {
amt += ISaleContract(s.contractAddresses[j]).balanceOf(_user);
}
// amt is in cents, so $100 = 10000
if (amt > 0) {
if (amt > s.maxAmount) {
amt = s.maxAmount;
}
v[idx] = _vestFromSaleContractAndAmount(s, amt);
idx++;
}
}
return v;
}
/**
* @dev Function iterate sale contracts and return number of not initialized vestings for user.
* @param _user address of user to extract vestings
* @return number of not not initialized user vestings
*/
function _numberOfVestingsFromSaleContracts(address _user) internal view returns (uint256 number) {
uint256 len = saleContracts.length;
uint256 i;
for (i; i < len; i++) {
SaleContract memory s = saleContracts[i];
uint256 sLen = s.contractAddresses.length;
uint256 j;
uint256 amt;
for (j; j < sLen; j++) {
amt += ISaleContract(s.contractAddresses[j]).balanceOf(_user);
}
// amt is in cents, so $100 = 10000
if (amt > 0) {
number++;
}
}
}
/**
* @dev Return vesting created from given sale and usd cent amount.
* @param _sale address of user to extract vestings
* @param _amount address of user to extract vestings
* @return v vesting from given parameters
*/
function _vestFromSaleContractAndAmount(SaleContract memory _sale, uint256 _amount) internal pure returns (Vest memory v) {
v.dateStart = _sale.startDate;
v.dateEnd = _sale.endDate;
uint256 total = _amount * _sale.tokensPerCent;
v.totalTokens = total;
v.startTokens = (total * _sale.percentOnStart) / 100;
}
/**
* @dev Set staking contract address for Claim and Stake.
* Only contract owner can set.
* @param _staking address
*/
function setStakingAddress(address _staking) external onlyOwner {
stakingAddress = _staking;
}
/**
* @dev Mark user as refunded
* @param _user address of user
* @param _refunded true=refunded
*/
function setRefunded(address _user, bool _refunded) external onlyOwner whenNotLocked {
require(_user != address(0), "user address cannot be 0");
refunded[_user] = _refunded;
}
/**
* @dev Mark multiple refunded users
* @param _users[] addresses of refunded users
*/
function massSetRefunded(address[] calldata _users) external onlyOwner whenNotLocked {
uint256 i;
for (i; i < _users.length; i++) {
require(_users[i] != address(0), "user address cannot be 0");
refunded[_users[i]] = true;
}
}
/**
* @dev Recover ETH from contract to owner address.
*/
function recoverETH() external {
payable(owner).transfer(address(this).balance);
}
/**
* @dev Recover given ERC20 token from contract to owner address.
* Can't recover SNP tokens.
* @param _token address of ERC20 token to recover
*/
function recoverErc20(address _token) external {
require(_token != snpToken, "Not permitted");
uint256 amt = IERC20(_token).balanceOf(address(this));
require(amt > 0, "Nothing to recover");
IBadErc20(_token).transfer(owner, amt);
}
}
/**
* @title IStaking
* @dev Interface for claim and stake
*/
interface IStaking {
function canStakeTokens(address _account) external view returns (bool);
function onClaimAndStake(address _from, uint256 _amount) external;
}
/**
* @title ISaleContract
* @dev Interface for sale contract
*/
interface ISaleContract {
function balanceOf(address _account) external view returns (uint256);
}
/**
* @title IBadErc20
* @dev Interface for emergency recover any ERC20-tokens,
* even non-erc20-compliant like USDT not returning boolean
*/
interface IBadErc20 {
function transfer(address _recipient, uint256 _amount) external;
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
import { Ownable } from "./Ownable.sol";
abstract contract LockableData {
bool public locked;
}
abstract contract Lockable is LockableData, Ownable {
/**
* @dev Locks functions with whenNotLocked modifier
*/
function lock() external onlyOwner {
locked = true;
}
/**
* @dev Throws if called after it was locked.
*/
modifier whenNotLocked {
require(!locked, "Lockable: locked");
_;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
abstract contract OwnableData {
address public owner;
address public pendingOwner;
}
abstract contract Ownable is OwnableData {
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev `owner` defaults to msg.sender on construction.
*/
constructor() {
_setOwner(msg.sender);
}
/**
* @dev Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.
* Can only be invoked by the current `owner`.
* @param _newOwner Address of the new owner.
* @param _direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.
*/
function transferOwnership(address _newOwner, bool _direct) external onlyOwner {
if (_direct) {
require(_newOwner != address(0), "zero address");
emit OwnershipTransferred(owner, _newOwner);
owner = _newOwner;
pendingOwner = address(0);
} else {
pendingOwner = _newOwner;
}
}
/**
* @dev Needs to be called by `pendingOwner` to claim ownership.
*/
function claimOwnership() external {
address _pendingOwner = pendingOwner;
require(msg.sender == _pendingOwner, "caller != pending owner");
emit OwnershipTransferred(owner, _pendingOwner);
owner = _pendingOwner;
pendingOwner = address(0);
}
/**
* @dev Throws if called by any account other than the Owner.
*/
modifier onlyOwner() {
require(msg.sender == owner, "caller is not the owner");
_;
}
function _setOwner(address newOwner) internal {
address oldOwner = owner;
owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;
/**
* @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.6;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function decimals() external view returns (uint8);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
// EIP 2612
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
function nonces(address owner) external view returns (uint256);
function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
function transferWithPermit(address target, address to, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external returns (bool);
}// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.8.6;
// Based on StableMath from mStable
// https://github.com/mstable/mStable-contracts/blob/master/contracts/shared/StableMath.sol
library StableMath {
/**
* @dev Scaling unit for use in specific calculations,
* where 1 * 10**18, or 1e18 represents a unit '1'
*/
uint256 private constant FULL_SCALE = 1e18;
/**
* @dev Provides an interface to the scaling unit
* @return Scaling unit (1e18 or 1 * 10**18)
*/
function getFullScale() internal pure returns (uint256) {
return FULL_SCALE;
}
/**
* @dev Scales a given integer to the power of the full scale.
* @param x Simple uint256 to scale
* @return Scaled value a to an exact number
*/
function scaleInteger(uint256 x) internal pure returns (uint256) {
return x * FULL_SCALE;
}
/***************************************
PRECISE ARITHMETIC
****************************************/
/**
* @dev Multiplies two precise units, and then truncates by the full scale
* @param x Left hand input to multiplication
* @param y Right hand input to multiplication
* @return Result after multiplying the two inputs and then dividing by the shared
* scale unit
*/
function mulTruncate(uint256 x, uint256 y) internal pure returns (uint256) {
return mulTruncateScale(x, y, FULL_SCALE);
}
/**
* @dev Multiplies two precise units, and then truncates by the given scale. For example,
* when calculating 90% of 10e18, (10e18 * 9e17) / 1e18 = (9e36) / 1e18 = 9e18
* @param x Left hand input to multiplication
* @param y Right hand input to multiplication
* @param scale Scale unit
* @return Result after multiplying the two inputs and then dividing by the shared
* scale unit
*/
function mulTruncateScale(
uint256 x,
uint256 y,
uint256 scale
) internal pure returns (uint256) {
// e.g. assume scale = fullScale
// z = 10e18 * 9e17 = 9e36
// return 9e36 / 1e18 = 9e18
return (x * y) / scale;
}
/**
* @dev Multiplies two precise units, and then truncates by the full scale, rounding up the result
* @param x Left hand input to multiplication
* @param y Right hand input to multiplication
* @return Result after multiplying the two inputs and then dividing by the shared
* scale unit, rounded up to the closest base unit.
*/
function mulTruncateCeil(uint256 x, uint256 y) internal pure returns (uint256) {
// e.g. 8e17 * 17268172638 = 138145381104e17
uint256 scaled = x * y;
// e.g. 138145381104e17 + 9.99...e17 = 138145381113.99...e17
uint256 ceil = scaled + FULL_SCALE - 1;
// e.g. 13814538111.399...e18 / 1e18 = 13814538111
return ceil / FULL_SCALE;
}
/**
* @dev Precisely divides two units, by first scaling the left hand operand. Useful
* for finding percentage weightings, i.e. 8e18/10e18 = 80% (or 8e17)
* @param x Left hand input to division
* @param y Right hand input to division
* @return Result after multiplying the left operand by the scale, and
* executing the division on the right hand input.
*/
function divPrecisely(uint256 x, uint256 y) internal pure returns (uint256) {
// e.g. 8e18 * 1e18 = 8e36
// e.g. 8e36 / 10e18 = 8e17
return (x * FULL_SCALE) / y;
}
/***************************************
HELPERS
****************************************/
/**
* @dev Calculates minimum of two numbers
* @param x Left hand input
* @param y Right hand input
* @return Minimum of the two inputs
*/
function min(uint256 x, uint256 y) internal pure returns (uint256) {
return x > y ? y : x;
}
/**
* @dev Calculated maximum of two numbers
* @param x Left hand input
* @param y Right hand input
* @return Maximum of the two inputs
*/
function max(uint256 x, uint256 y) internal pure returns (uint256) {
return x > y ? x : y;
}
/**
* @dev Clamps a value to an upper bound
* @param x Left hand input
* @param upperBound Maximum possible value to return
* @return Input x clamped to a maximum value, upperBound
*/
function clamp(uint256 x, uint256 upperBound) internal pure returns (uint256) {
return x > upperBound ? upperBound : x;
}
}{
"evmVersion": "berlin",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 999999
},
"remappings": [],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","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":false,"internalType":"uint256","name":"totalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endDate","type":"uint256"}],"name":"Vested","type":"event"},{"inputs":[],"name":"addMyVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_contractAddresses","type":"address[]"},{"internalType":"uint256","name":"_tokensPerCent","type":"uint256"},{"internalType":"uint256","name":"_maxAmount","type":"uint256"},{"internalType":"uint256","name":"_percentOnStart","type":"uint256"},{"internalType":"uint256","name":"_startDate","type":"uint256"},{"internalType":"uint256","name":"_endDate","type":"uint256"}],"name":"addSaleContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"addVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"claimTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getAllClaimable","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getClaimable","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getSaleContractByIndex","outputs":[{"components":[{"internalType":"address[]","name":"contractAddresses","type":"address[]"},{"internalType":"uint256","name":"tokensPerCent","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint256","name":"percentOnStart","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"}],"internalType":"struct SynapseVesting.SaleContract","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleContracts","outputs":[{"components":[{"internalType":"address[]","name":"contractAddresses","type":"address[]"},{"internalType":"uint256","name":"tokensPerCent","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint256","name":"percentOnStart","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"}],"internalType":"struct SynapseVesting.SaleContract[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleContractsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getVestingByIndex","outputs":[{"components":[{"internalType":"uint256","name":"dateStart","type":"uint256"},{"internalType":"uint256","name":"dateEnd","type":"uint256"},{"internalType":"uint256","name":"totalTokens","type":"uint256"},{"internalType":"uint256","name":"startTokens","type":"uint256"},{"internalType":"uint256","name":"claimedTokens","type":"uint256"}],"internalType":"struct SynapseVesting.Vest","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getVestings","outputs":[{"components":[{"internalType":"uint256","name":"dateStart","type":"uint256"},{"internalType":"uint256","name":"dateEnd","type":"uint256"},{"internalType":"uint256","name":"totalTokens","type":"uint256"},{"internalType":"uint256","name":"startTokens","type":"uint256"},{"internalType":"uint256","name":"claimedTokens","type":"uint256"}],"internalType":"struct SynapseVesting.Vest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"getVestingsByRange","outputs":[{"components":[{"internalType":"uint256","name":"dateStart","type":"uint256"},{"internalType":"uint256","name":"dateEnd","type":"uint256"},{"internalType":"uint256","name":"totalTokens","type":"uint256"},{"internalType":"uint256","name":"startTokens","type":"uint256"},{"internalType":"uint256","name":"claimedTokens","type":"uint256"}],"internalType":"struct SynapseVesting.Vest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVestingsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_startTokens","type":"uint256[]"},{"internalType":"uint256[]","name":"_totalTokens","type":"uint256[]"},{"internalType":"uint256","name":"_startDate","type":"uint256"},{"internalType":"uint256","name":"_endDate","type":"uint256"}],"name":"massAddHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"massSetRefunded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"refunded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_refunded","type":"bool"}],"name":"setRefunded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"}],"name":"setStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snpToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalVested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"bool","name":"_direct","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vestingAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506200001d3362000028565b600160025562000081565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b613f6280620000916000396000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c806391a6de8e1161012a578063d02ffa55116100bd578063e30c39781161008c578063f83d08ba11610071578063f83d08ba146104dd578063fc0d8329146104e5578063fcf4b140146104f857600080fd5b8063e30c3978146104aa578063f4e0d9ac146104ca57600080fd5b8063d02ffa551461044e578063d54ad2a114610461578063d7b4be241461046a578063da638e641461048a57600080fd5b8063b95e099e116100f9578063b95e099e14610403578063c033a49014610416578063cb1a4fc014610439578063cf3090121461044157600080fd5b806391a6de8e146103b55780639a854bc4146103d5578063a262f5f8146103dd578063b242e534146103f057600080fd5b80634e71d92d116101bd578063603e56061161018c5780637a0c6dc0116101715780637a0c6dc014610338578063843277d1146103585780638da5cb5b1461036b57600080fd5b8063603e5606146103125780636f5244b11461032557600080fd5b80634e71d92d146102cd5780634e71e0c8146102d557806355f8b368146102dd5780635ae2a4e1146102fd57600080fd5b80631fb61122116101f95780631fb611221461026c5780633138b0a91461029f57806334671e64146102a75780633860f9d0146102ba57600080fd5b80630614117a1461022b5780631811ba9514610235578063199cbc541461023d57806319ab453c14610259575b600080fd5b61023361050b565b005b61023361055c565b61024660045481565b6040519081526020015b60405180910390f35b6102336102673660046138f3565b610567565b61028f61027a3660046138f3565b600a6020526000908152604090205460ff1681565b6040519015158152602001610250565b600754610246565b6102336102b53660046138f3565b610736565b6102336102c836600461396f565b6107bc565b6102336109f8565b610233610a02565b6102f06102eb366004613b88565b610b43565b6040516102509190613d65565b610305610c50565b6040516102509190613c6c565b610233610320366004613a5a565b610d50565b610246610333366004613945565b611001565b61034b6103463660046138f3565b6110bf565b6040516102509190613cec565b6102336103663660046139b1565b61132f565b60005461039090610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610250565b6003546103909073ffffffffffffffffffffffffffffffffffffffff1681565b600954610246565b6102336103eb3660046138f3565b61158c565b6102336103fe36600461390e565b61159a565b6102336104113660046138f3565b6117a6565b61028f6104243660046138f3565b600b6020526000908152604090205460ff1681565b6102336119cc565b60005461028f9060ff1681565b61024661045c3660046138f3565b611c07565b61024660055481565b6006546103909073ffffffffffffffffffffffffffffffffffffffff1681565b61049d610498366004613b88565b611cf6565b6040516102509190613d78565b6001546103909073ffffffffffffffffffffffffffffffffffffffff1681565b6102336104d83660046138f3565b611d8d565b610233611e5a565b61034b6104f3366004613bba565b611f0d565b61023361050636600461390e565b6120c4565b6000805460405173ffffffffffffffffffffffffffffffffffffffff61010090920491909116914780156108fc02929091818181858888f19350505050158015610559573d6000803e3d6000fd5b50565b6105653361228a565b565b600054610100900473ffffffffffffffffffffffffffffffffffffffff1633146105f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811661066f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064016105e9565b60035473ffffffffffffffffffffffffffffffffffffffff16156106ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e697420616c726561647920646f6e6500000000000000000000000000000060448201526064016105e9565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff81166107b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b6105598161228a565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff16156108af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b60005b818110156109f35760008383838181106108ce576108ce613ec0565b90506020020160208101906108e391906138f3565b73ffffffffffffffffffffffffffffffffffffffff161415610961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b6001600b600085858581811061097957610979613ec0565b905060200201602081019061098e91906138f3565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806109eb81613e58565b9150506108b2565b505050565b6105593333612786565b60015473ffffffffffffffffffffffffffffffffffffffff16338114610a84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c657220213d2070656e64696e67206f776e657200000000000000000060448201526064016105e9565b6000805460405173ffffffffffffffffffffffffffffffffffffffff8085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b610b7c6040518060c001604052806060815260200160008152602001600081526020016000815260200160008152602001600081525090565b60098281548110610b8f57610b8f613ec0565b90600052602060002090600602016040518060c001604052908160008201805480602002602001604051908101604052809291908181526020018280548015610c0e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610be3575b50505050508152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050919050565b60606009805480602002602001604051908101604052809291908181526020016000905b82821015610d4757838290600052602060002090600602016040518060c001604052908160008201805480602002602001604051908101604052809291908181526020018280548015610cfd57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610cd2575b505050505081526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505081526020019060010190610c74565b50505050905090565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff1615610e43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b6000865111610eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f64617461206973206d697373696e67000000000000000000000000000000000060448201526064016105e9565b808210610f17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f7374617274446174652063616e6e6f742065786365656420656e64446174650060448201526064016105e9565b610f506040518060c001604052806060815260200160008152602001600081526020016000815260200160008152602001600081525090565b868152602080820187905260408201869052608082018490526060820185905260a082018390526009805460018101825560009190915282518051849360069093027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0192610fc39284929101906137df565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040812080546110b891600791600191908690811061104357611043613ec0565b90600052602060002001546110589190613e41565b8154811061106857611068613ec0565b90600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050612b59565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a6020526040902054606090819060ff166110fd576110fa83612bf5565b90505b805173ffffffffffffffffffffffffffffffffffffffff8416600090815260086020526040812054906111308383613db1565b67ffffffffffffffff81111561114857611148613eef565b6040519080825280602002602001820160405280156111ab57816020015b6111986040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816111665790505b50905060005b828110156112965773ffffffffffffffffffffffffffffffffffffffff871660009081526008602052604090208054600791600191849081106111f6576111f6613ec0565b906000526020600020015461120b9190613e41565b8154811061121b5761121b613ec0565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505082828151811061127857611278613ec0565b6020026020010181905250808061128e90613e58565b9150506111b1565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a602052604090205460ff166113255760005b84811015611323578581815181106112e0576112e0613ec0565b60200260200101518382846112f59190613db1565b8151811061130557611305613ec0565b6020026020010181905250808061131b90613e58565b9150506112c6565b505b5095945050505050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff1633146113b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff1615611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b86858114801561143157508084145b611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f646174612073697a65206d69736d61746368000000000000000000000000000060448201526064016105e9565b818310611500576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f7374617274446174652063616e6e6f742065786365656420656e64446174650060448201526064016105e9565b60005b818110156115805761156e8a8a8381811061152057611520613ec0565b905060200201602081019061153591906138f3565b89898481811061154757611547613ec0565b9050602002013588888581811061156057611560613ec0565b905060200201358787612f5a565b8061157881613e58565b915050611503565b50505050505050505050565b6115963382612786565b5050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314611620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b80156117605773ffffffffffffffffffffffffffffffffffffffff82166116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f2061646472657373000000000000000000000000000000000000000060448201526064016105e9565b6000805460405173ffffffffffffffffffffffffffffffffffffffff8086169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff8416610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909116179055600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6001805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790555050565b60035473ffffffffffffffffffffffffffffffffffffffff8281169116141561182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4e6f74207065726d69747465640000000000000000000000000000000000000060448201526064016105e9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b15801561189357600080fd5b505afa1580156118a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cb9190613ba1565b905060008111611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7468696e6720746f207265636f766572000000000000000000000000000060448201526064016105e9565b6000546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff90811660048301526024820183905283169063a9059cbb90604401600060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050505050565b60065473ffffffffffffffffffffffffffffffffffffffff16611a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5374616b696e6720636f6e7472616374206e6f7420636f6e666967757265640060448201526064016105e9565b6006546040517f95ba0bee00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116906395ba0bee9060240160206040518083038186803b158015611ab457600080fd5b505afa158015611ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aec9190613b6b565b611b52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f556e61626c6520746f207374616b65000000000000000000000000000000000060448201526064016105e9565b600654600090611b7990339073ffffffffffffffffffffffffffffffffffffffff16612786565b6006546040517fee14613a0000000000000000000000000000000000000000000000000000000081523360048201526024810183905291925073ffffffffffffffffffffffffffffffffffffffff169063ee14613a90604401600060405180830381600087803b158015611bec57600080fd5b505af1158015611c00573d6000803e3d6000fd5b5050505050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260086020526040812054815b81811015611cac57611c8e60076001600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061104357611043613ec0565b611c989084613db1565b925080611ca481613e58565b915050611c2f565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604090205460ff16611cef57611ce284613197565b611cec9084613db1565b92505b5050919050565b611d286040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60078281548110611d3b57611d3b613ec0565b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050919050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314611e13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314611ee0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60606000611f1b8484613e41565b611f26906001613db1565b600754909150808410611f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f72616e6765206572726f7200000000000000000000000000000000000000000060448201526064016105e9565b60008267ffffffffffffffff811115611fb057611fb0613eef565b60405190808252806020026020018201604052801561201357816020015b6120006040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200190600190039081611fce5790505b50905060005b838110156120b857600761202d8289613db1565b8154811061203d5761203d613ec0565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505082828151811061209a5761209a613ec0565b602002602001018190525080806120b090613e58565b915050612019565b50925050505b92915050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff16331461214a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff16156121b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff8216612234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602052604090205460ff161561231a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5573657220726566756e6465640000000000000000000000000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604090205460ff16156123aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f416c726561647920646f6e65000000000000000000000000000000000000000060448201526064016105e9565b60095460005b81811015612735576000600982815481106123cd576123cd613ec0565b90600052602060002090600602016040518060c00160405290816000820180548060200260200160405190810160405280929190818152602001828054801561244c57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311612421575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b828210156125775783518051839081106124ae576124ae613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152909116906370a082319060240160206040518083038186803b15801561252157600080fd5b505afa158015612535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125599190613ba1565b6125639082613db1565b90508161256f81613e58565b925050612492565b801561271e578360400151811115612590575060408301515b600061259c85836133f7565b90508060400151600460008282546125b49190613db1565b909155505060078054600181810183556000838152845160059093027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688810193909355602080860180517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689860155604080880180517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a88015560608901517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b88015560808901517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68c9097019690965573ffffffffffffffffffffffffffffffffffffffff8f168085526008845281852097548854968701895597855292909320909301949094559151905191517ffbeff59d2bfda0d79ea8a29f8c57c66d48c7a13eabbdb90908d9115ec41c9dc692612714928252602082015260400190565b60405180910390a2505b50505050808061272d90613e58565b9150506123b0565b505073ffffffffffffffffffffffffffffffffffffffff166000908152600a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006002805414156127f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105e9565b6002805573ffffffffffffffffffffffffffffffffffffffff8216612875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f436c61696d2c207468656e206275726e0000000000000000000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090205460ff161580156128d1575073ffffffffffffffffffffffffffffffffffffffff83166000908152600b602052604090205460ff16155b156128df576128df8361228a565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600860205260409020548061296c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f2076657374696e677320666f72207573657200000000000000000000000060448201526064016105e9565b6000805b82811015612a6c5773ffffffffffffffffffffffffffffffffffffffff861660009081526008602052604081208054600791600191859081106129b5576129b5613ec0565b90600052602060002001546129ca9190613e41565b815481106129da576129da613ec0565b90600052602060002090600502019050612a30816040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050612b59565b925082816004016000828254612a469190613db1565b90915550612a5690508386613db1565b9450508080612a6490613e58565b915050612970565b8315612ae9578360056000828254612a849190613db1565b90915550612a9490508585613480565b8573ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a85604051612adc91815260200190565b60405180910390a2612b4b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f7468696e6720746f20636c61696d0000000000000000000000000000000060448201526064016105e9565b505060016002555092915050565b80516000904290811015612b705750600092915050565b8260200151811015612bde576000612ba784600001518560200151612b959190613e41565b8551612ba19085613e41565b90613592565b90508360600151612bcc8286606001518760400151612bc69190613e41565b906135b1565b612bd69190613db1565b925050612be6565b826040015191505b60808301516110b89083613e41565b60095473ffffffffffffffffffffffffffffffffffffffff82166000908152600b60205260409020546060919060ff1680612c2e575080155b15612c96576040805160008082526020820190925290612c8e565b612c7b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200190600190039081612c495790505b509392505050565b6000612ca1846135c6565b67ffffffffffffffff811115612cb957612cb9613eef565b604051908082528060200260200182016040528015612d1c57816020015b612d096040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200190600190039081612cd75790505b5090506000805b83821015612f5057600060098381548110612d4057612d40613ec0565b90600052602060002090600602016040518060c001604052908160008201805480602002602001604051908101604052809291908181526020018280548015612dbf57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311612d94575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b82821015612eea578351805183908110612e2157612e21613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152909116906370a082319060240160206040518083038186803b158015612e9457600080fd5b505afa158015612ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecc9190613ba1565b612ed69082613db1565b905081612ee281613e58565b925050612e05565b8015612f39578360400151811115612f03575060408301515b612f0d84826133f7565b878681518110612f1f57612f1f613ec0565b60200260200101819052508480612f3590613e58565b9550505b505050508180612f4890613e58565b925050612d23565b5090949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516612fd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b6130096040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60608101859052604081018490528281526020810182905260048054859190600090613036908490613db1565b90915550506007805460018082018355600083815284517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6886005909402938401556020808601517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6898501556040808701517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a86015560608701517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b86015560808701517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68c9095019490945573ffffffffffffffffffffffffffffffffffffffff8b1680835260088252848320955486549485018755958352918190209092019390935581518781529081018590527ffbeff59d2bfda0d79ea8a29f8c57c66d48c7a13eabbdb90908d9115ec41c9dc6910160405180910390a2505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602052604081205460ff16156131cd57506000919050565b600954806131de5750600092915050565b60005b81811015611cef576000600982815481106131fe576131fe613ec0565b90600052602060002090600602016040518060c00160405290816000820180548060200260200160405190810160405280929190818152602001828054801561327d57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311613252575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b828210156133a85783518051839081106132df576132df613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152909116906370a082319060240160206040518083038186803b15801561335257600080fd5b505afa158015613366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338a9190613ba1565b6133949082613db1565b9050816133a081613e58565b9250506132c3565b80156133e05783604001518111156133c1575060408301515b6133d36133ce85836133f7565b612b59565b6133dd9088613db1565b96505b5050505080806133ef90613e58565b9150506131e1565b6134296040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6080830151815260a083015160208083019190915283015160009061344e9084613e04565b60408301819052606085015190915060649061346a9083613e04565b6134749190613dc9565b60608301525092915050565b6003546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b1580156134f457600080fd5b505af1158015613508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061352c9190613b6b565b611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f546f6b656e207472616e73666572206661696c6564000000000000000000000060448201526064016105e9565b6000816135a7670de0b6b3a764000085613e04565b6110b89190613dc9565b60006110b88383670de0b6b3a76400006137c0565b600954600090815b81811015611cef576000600982815481106135eb576135eb613ec0565b90600052602060002090600602016040518060c00160405290816000820180548060200260200160405190810160405280929190818152602001828054801561366a57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161363f575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b828210156137955783518051839081106136cc576136cc613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152909116906370a082319060240160206040518083038186803b15801561373f57600080fd5b505afa158015613753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137779190613ba1565b6137819082613db1565b90508161378d81613e58565b9250506136b0565b80156137a957866137a581613e58565b9750505b5050505080806137b890613e58565b9150506135ce565b6000816137cd8486613e04565b6137d79190613dc9565b949350505050565b828054828255906000526020600020908101928215613859579160200282015b8281111561385957825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906137ff565b50613865929150613869565b5090565b5b80821115613865576000815560010161386a565b803573ffffffffffffffffffffffffffffffffffffffff811681146138a257600080fd5b919050565b60008083601f8401126138b957600080fd5b50813567ffffffffffffffff8111156138d157600080fd5b6020830191508360208260051b85010111156138ec57600080fd5b9250929050565b60006020828403121561390557600080fd5b6110b88261387e565b6000806040838503121561392157600080fd5b61392a8361387e565b9150602083013561393a81613f1e565b809150509250929050565b6000806040838503121561395857600080fd5b6139618361387e565b946020939093013593505050565b6000806020838503121561398257600080fd5b823567ffffffffffffffff81111561399957600080fd5b6139a5858286016138a7565b90969095509350505050565b60008060008060008060008060a0898b0312156139cd57600080fd5b883567ffffffffffffffff808211156139e557600080fd5b6139f18c838d016138a7565b909a50985060208b0135915080821115613a0a57600080fd5b613a168c838d016138a7565b909850965060408b0135915080821115613a2f57600080fd5b50613a3c8b828c016138a7565b999c989b509699959896976060870135966080013595509350505050565b60008060008060008060c08789031215613a7357600080fd5b863567ffffffffffffffff80821115613a8b57600080fd5b818901915089601f830112613a9f57600080fd5b8135602082821115613ab357613ab3613eef565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108682111715613af657613af6613eef565b604052838152828101945085830182870184018f1015613b1557600080fd5b600096505b84871015613b3f57613b2b8161387e565b865260019690960195948301948301613b1a565b509d918c01359c505060408b01359a60608101359a506080810135995060a00135975095505050505050565b600060208284031215613b7d57600080fd5b81516110b881613f1e565b600060208284031215613b9a57600080fd5b5035919050565b600060208284031215613bb357600080fd5b5051919050565b60008060408385031215613bcd57600080fd5b50508035926020909101359150565b805160c080845281519084018190526000916020919082019060e0860190845b81811015613c2e57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613bfc565b5050828501518387015260408501516040870152606085015160608701526080850151608087015260a085015160a087015280935050505092915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613cdf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613ccd858351613bdc565b94509285019290850190600101613c93565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613d5957613d4683855180518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b9284019260a09290920191600101613d08565b50909695505050505050565b6020815260006110b86020830184613bdc565b60a081016120be828480518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b60008219821115613dc457613dc4613e91565b500190565b600082613dff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e3c57613e3c613e91565b500290565b600082821015613e5357613e53613e91565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e8a57613e8a613e91565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b801515811461055957600080fdfea26469706673582212200c6b23ef39c0ae2a456b9d96c467ca73ead268fcb3a3da61be0e9d630b51d82564736f6c63430008060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102265760003560e01c806391a6de8e1161012a578063d02ffa55116100bd578063e30c39781161008c578063f83d08ba11610071578063f83d08ba146104dd578063fc0d8329146104e5578063fcf4b140146104f857600080fd5b8063e30c3978146104aa578063f4e0d9ac146104ca57600080fd5b8063d02ffa551461044e578063d54ad2a114610461578063d7b4be241461046a578063da638e641461048a57600080fd5b8063b95e099e116100f9578063b95e099e14610403578063c033a49014610416578063cb1a4fc014610439578063cf3090121461044157600080fd5b806391a6de8e146103b55780639a854bc4146103d5578063a262f5f8146103dd578063b242e534146103f057600080fd5b80634e71d92d116101bd578063603e56061161018c5780637a0c6dc0116101715780637a0c6dc014610338578063843277d1146103585780638da5cb5b1461036b57600080fd5b8063603e5606146103125780636f5244b11461032557600080fd5b80634e71d92d146102cd5780634e71e0c8146102d557806355f8b368146102dd5780635ae2a4e1146102fd57600080fd5b80631fb61122116101f95780631fb611221461026c5780633138b0a91461029f57806334671e64146102a75780633860f9d0146102ba57600080fd5b80630614117a1461022b5780631811ba9514610235578063199cbc541461023d57806319ab453c14610259575b600080fd5b61023361050b565b005b61023361055c565b61024660045481565b6040519081526020015b60405180910390f35b6102336102673660046138f3565b610567565b61028f61027a3660046138f3565b600a6020526000908152604090205460ff1681565b6040519015158152602001610250565b600754610246565b6102336102b53660046138f3565b610736565b6102336102c836600461396f565b6107bc565b6102336109f8565b610233610a02565b6102f06102eb366004613b88565b610b43565b6040516102509190613d65565b610305610c50565b6040516102509190613c6c565b610233610320366004613a5a565b610d50565b610246610333366004613945565b611001565b61034b6103463660046138f3565b6110bf565b6040516102509190613cec565b6102336103663660046139b1565b61132f565b60005461039090610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610250565b6003546103909073ffffffffffffffffffffffffffffffffffffffff1681565b600954610246565b6102336103eb3660046138f3565b61158c565b6102336103fe36600461390e565b61159a565b6102336104113660046138f3565b6117a6565b61028f6104243660046138f3565b600b6020526000908152604090205460ff1681565b6102336119cc565b60005461028f9060ff1681565b61024661045c3660046138f3565b611c07565b61024660055481565b6006546103909073ffffffffffffffffffffffffffffffffffffffff1681565b61049d610498366004613b88565b611cf6565b6040516102509190613d78565b6001546103909073ffffffffffffffffffffffffffffffffffffffff1681565b6102336104d83660046138f3565b611d8d565b610233611e5a565b61034b6104f3366004613bba565b611f0d565b61023361050636600461390e565b6120c4565b6000805460405173ffffffffffffffffffffffffffffffffffffffff61010090920491909116914780156108fc02929091818181858888f19350505050158015610559573d6000803e3d6000fd5b50565b6105653361228a565b565b600054610100900473ffffffffffffffffffffffffffffffffffffffff1633146105f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811661066f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064016105e9565b60035473ffffffffffffffffffffffffffffffffffffffff16156106ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e697420616c726561647920646f6e6500000000000000000000000000000060448201526064016105e9565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff81166107b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b6105598161228a565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff16156108af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b60005b818110156109f35760008383838181106108ce576108ce613ec0565b90506020020160208101906108e391906138f3565b73ffffffffffffffffffffffffffffffffffffffff161415610961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b6001600b600085858581811061097957610979613ec0565b905060200201602081019061098e91906138f3565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806109eb81613e58565b9150506108b2565b505050565b6105593333612786565b60015473ffffffffffffffffffffffffffffffffffffffff16338114610a84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c657220213d2070656e64696e67206f776e657200000000000000000060448201526064016105e9565b6000805460405173ffffffffffffffffffffffffffffffffffffffff8085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b610b7c6040518060c001604052806060815260200160008152602001600081526020016000815260200160008152602001600081525090565b60098281548110610b8f57610b8f613ec0565b90600052602060002090600602016040518060c001604052908160008201805480602002602001604051908101604052809291908181526020018280548015610c0e57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610be3575b50505050508152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050919050565b60606009805480602002602001604051908101604052809291908181526020016000905b82821015610d4757838290600052602060002090600602016040518060c001604052908160008201805480602002602001604051908101604052809291908181526020018280548015610cfd57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610cd2575b505050505081526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505081526020019060010190610c74565b50505050905090565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314610dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff1615610e43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b6000865111610eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f64617461206973206d697373696e67000000000000000000000000000000000060448201526064016105e9565b808210610f17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f7374617274446174652063616e6e6f742065786365656420656e64446174650060448201526064016105e9565b610f506040518060c001604052806060815260200160008152602001600081526020016000815260200160008152602001600081525090565b868152602080820187905260408201869052608082018490526060820185905260a082018390526009805460018101825560009190915282518051849360069093027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0192610fc39284929101906137df565b506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020526040812080546110b891600791600191908690811061104357611043613ec0565b90600052602060002001546110589190613e41565b8154811061106857611068613ec0565b90600052602060002090600502016040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050612b59565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a6020526040902054606090819060ff166110fd576110fa83612bf5565b90505b805173ffffffffffffffffffffffffffffffffffffffff8416600090815260086020526040812054906111308383613db1565b67ffffffffffffffff81111561114857611148613eef565b6040519080825280602002602001820160405280156111ab57816020015b6111986040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b8152602001906001900390816111665790505b50905060005b828110156112965773ffffffffffffffffffffffffffffffffffffffff871660009081526008602052604090208054600791600191849081106111f6576111f6613ec0565b906000526020600020015461120b9190613e41565b8154811061121b5761121b613ec0565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505082828151811061127857611278613ec0565b6020026020010181905250808061128e90613e58565b9150506111b1565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600a602052604090205460ff166113255760005b84811015611323578581815181106112e0576112e0613ec0565b60200260200101518382846112f59190613db1565b8151811061130557611305613ec0565b6020026020010181905250808061131b90613e58565b9150506112c6565b505b5095945050505050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff1633146113b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff1615611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b86858114801561143157508084145b611497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f646174612073697a65206d69736d61746368000000000000000000000000000060448201526064016105e9565b818310611500576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f7374617274446174652063616e6e6f742065786365656420656e64446174650060448201526064016105e9565b60005b818110156115805761156e8a8a8381811061152057611520613ec0565b905060200201602081019061153591906138f3565b89898481811061154757611547613ec0565b9050602002013588888581811061156057611560613ec0565b905060200201358787612f5a565b8061157881613e58565b915050611503565b50505050505050505050565b6115963382612786565b5050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314611620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b80156117605773ffffffffffffffffffffffffffffffffffffffff82166116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f2061646472657373000000000000000000000000000000000000000060448201526064016105e9565b6000805460405173ffffffffffffffffffffffffffffffffffffffff8086169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff8416610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909116179055600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6001805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790555050565b60035473ffffffffffffffffffffffffffffffffffffffff8281169116141561182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4e6f74207065726d69747465640000000000000000000000000000000000000060448201526064016105e9565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b15801561189357600080fd5b505afa1580156118a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cb9190613ba1565b905060008111611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4e6f7468696e6720746f207265636f766572000000000000000000000000000060448201526064016105e9565b6000546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815261010090910473ffffffffffffffffffffffffffffffffffffffff90811660048301526024820183905283169063a9059cbb90604401600060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050505050565b60065473ffffffffffffffffffffffffffffffffffffffff16611a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5374616b696e6720636f6e7472616374206e6f7420636f6e666967757265640060448201526064016105e9565b6006546040517f95ba0bee00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116906395ba0bee9060240160206040518083038186803b158015611ab457600080fd5b505afa158015611ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aec9190613b6b565b611b52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f556e61626c6520746f207374616b65000000000000000000000000000000000060448201526064016105e9565b600654600090611b7990339073ffffffffffffffffffffffffffffffffffffffff16612786565b6006546040517fee14613a0000000000000000000000000000000000000000000000000000000081523360048201526024810183905291925073ffffffffffffffffffffffffffffffffffffffff169063ee14613a90604401600060405180830381600087803b158015611bec57600080fd5b505af1158015611c00573d6000803e3d6000fd5b5050505050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260086020526040812054815b81811015611cac57611c8e60076001600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061104357611043613ec0565b611c989084613db1565b925080611ca481613e58565b915050611c2f565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604090205460ff16611cef57611ce284613197565b611cec9084613db1565b92505b5050919050565b611d286040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60078281548110611d3b57611d3b613ec0565b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050919050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314611e13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600054610100900473ffffffffffffffffffffffffffffffffffffffff163314611ee0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60606000611f1b8484613e41565b611f26906001613db1565b600754909150808410611f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f72616e6765206572726f7200000000000000000000000000000000000000000060448201526064016105e9565b60008267ffffffffffffffff811115611fb057611fb0613eef565b60405190808252806020026020018201604052801561201357816020015b6120006040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200190600190039081611fce5790505b50905060005b838110156120b857600761202d8289613db1565b8154811061203d5761203d613ec0565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505082828151811061209a5761209a613ec0565b602002602001018190525080806120b090613e58565b915050612019565b50925050505b92915050565b600054610100900473ffffffffffffffffffffffffffffffffffffffff16331461214a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016105e9565b60005460ff16156121b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c6f636b61626c653a206c6f636b65640000000000000000000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff8216612234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602052604090205460ff161561231a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5573657220726566756e6465640000000000000000000000000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604090205460ff16156123aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f416c726561647920646f6e65000000000000000000000000000000000000000060448201526064016105e9565b60095460005b81811015612735576000600982815481106123cd576123cd613ec0565b90600052602060002090600602016040518060c00160405290816000820180548060200260200160405190810160405280929190818152602001828054801561244c57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311612421575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b828210156125775783518051839081106124ae576124ae613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152909116906370a082319060240160206040518083038186803b15801561252157600080fd5b505afa158015612535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125599190613ba1565b6125639082613db1565b90508161256f81613e58565b925050612492565b801561271e578360400151811115612590575060408301515b600061259c85836133f7565b90508060400151600460008282546125b49190613db1565b909155505060078054600181810183556000838152845160059093027fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688810193909355602080860180517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689860155604080880180517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a88015560608901517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b88015560808901517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68c9097019690965573ffffffffffffffffffffffffffffffffffffffff8f168085526008845281852097548854968701895597855292909320909301949094559151905191517ffbeff59d2bfda0d79ea8a29f8c57c66d48c7a13eabbdb90908d9115ec41c9dc692612714928252602082015260400190565b60405180910390a2505b50505050808061272d90613e58565b9150506123b0565b505073ffffffffffffffffffffffffffffffffffffffff166000908152600a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006002805414156127f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105e9565b6002805573ffffffffffffffffffffffffffffffffffffffff8216612875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f436c61696d2c207468656e206275726e0000000000000000000000000000000060448201526064016105e9565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090205460ff161580156128d1575073ffffffffffffffffffffffffffffffffffffffff83166000908152600b602052604090205460ff16155b156128df576128df8361228a565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600860205260409020548061296c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f2076657374696e677320666f72207573657200000000000000000000000060448201526064016105e9565b6000805b82811015612a6c5773ffffffffffffffffffffffffffffffffffffffff861660009081526008602052604081208054600791600191859081106129b5576129b5613ec0565b90600052602060002001546129ca9190613e41565b815481106129da576129da613ec0565b90600052602060002090600502019050612a30816040518060a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481525050612b59565b925082816004016000828254612a469190613db1565b90915550612a5690508386613db1565b9450508080612a6490613e58565b915050612970565b8315612ae9578360056000828254612a849190613db1565b90915550612a9490508585613480565b8573ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a85604051612adc91815260200190565b60405180910390a2612b4b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f7468696e6720746f20636c61696d0000000000000000000000000000000060448201526064016105e9565b505060016002555092915050565b80516000904290811015612b705750600092915050565b8260200151811015612bde576000612ba784600001518560200151612b959190613e41565b8551612ba19085613e41565b90613592565b90508360600151612bcc8286606001518760400151612bc69190613e41565b906135b1565b612bd69190613db1565b925050612be6565b826040015191505b60808301516110b89083613e41565b60095473ffffffffffffffffffffffffffffffffffffffff82166000908152600b60205260409020546060919060ff1680612c2e575080155b15612c96576040805160008082526020820190925290612c8e565b612c7b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200190600190039081612c495790505b509392505050565b6000612ca1846135c6565b67ffffffffffffffff811115612cb957612cb9613eef565b604051908082528060200260200182016040528015612d1c57816020015b612d096040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b815260200190600190039081612cd75790505b5090506000805b83821015612f5057600060098381548110612d4057612d40613ec0565b90600052602060002090600602016040518060c001604052908160008201805480602002602001604051908101604052809291908181526020018280548015612dbf57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311612d94575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b82821015612eea578351805183908110612e2157612e21613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152909116906370a082319060240160206040518083038186803b158015612e9457600080fd5b505afa158015612ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecc9190613ba1565b612ed69082613db1565b905081612ee281613e58565b925050612e05565b8015612f39578360400151811115612f03575060408301515b612f0d84826133f7565b878681518110612f1f57612f1f613ec0565b60200260200101819052508480612f3590613e58565b9550505b505050508180612f4890613e58565b925050612d23565b5090949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516612fd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7573657220616464726573732063616e6e6f742062652030000000000000000060448201526064016105e9565b6130096040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b60608101859052604081018490528281526020810182905260048054859190600090613036908490613db1565b90915550506007805460018082018355600083815284517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6886005909402938401556020808601517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6898501556040808701517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a86015560608701517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68b86015560808701517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68c9095019490945573ffffffffffffffffffffffffffffffffffffffff8b1680835260088252848320955486549485018755958352918190209092019390935581518781529081018590527ffbeff59d2bfda0d79ea8a29f8c57c66d48c7a13eabbdb90908d9115ec41c9dc6910160405180910390a2505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602052604081205460ff16156131cd57506000919050565b600954806131de5750600092915050565b60005b81811015611cef576000600982815481106131fe576131fe613ec0565b90600052602060002090600602016040518060c00160405290816000820180548060200260200160405190810160405280929190818152602001828054801561327d57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311613252575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b828210156133a85783518051839081106132df576132df613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152909116906370a082319060240160206040518083038186803b15801561335257600080fd5b505afa158015613366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061338a9190613ba1565b6133949082613db1565b9050816133a081613e58565b9250506132c3565b80156133e05783604001518111156133c1575060408301515b6133d36133ce85836133f7565b612b59565b6133dd9088613db1565b96505b5050505080806133ef90613e58565b9150506131e1565b6134296040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6080830151815260a083015160208083019190915283015160009061344e9084613e04565b60408301819052606085015190915060649061346a9083613e04565b6134749190613dc9565b60608301525092915050565b6003546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b1580156134f457600080fd5b505af1158015613508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061352c9190613b6b565b611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f546f6b656e207472616e73666572206661696c6564000000000000000000000060448201526064016105e9565b6000816135a7670de0b6b3a764000085613e04565b6110b89190613dc9565b60006110b88383670de0b6b3a76400006137c0565b600954600090815b81811015611cef576000600982815481106135eb576135eb613ec0565b90600052602060002090600602016040518060c00160405290816000820180548060200260200160405190810160405280929190818152602001828054801561366a57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161363f575b50505091835250506001820154602082015260028201546040820152600382015460608201526004820154608082015260059091015460a0909101528051519091506000805b828210156137955783518051839081106136cc576136cc613ec0565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152909116906370a082319060240160206040518083038186803b15801561373f57600080fd5b505afa158015613753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137779190613ba1565b6137819082613db1565b90508161378d81613e58565b9250506136b0565b80156137a957866137a581613e58565b9750505b5050505080806137b890613e58565b9150506135ce565b6000816137cd8486613e04565b6137d79190613dc9565b949350505050565b828054828255906000526020600020908101928215613859579160200282015b8281111561385957825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906137ff565b50613865929150613869565b5090565b5b80821115613865576000815560010161386a565b803573ffffffffffffffffffffffffffffffffffffffff811681146138a257600080fd5b919050565b60008083601f8401126138b957600080fd5b50813567ffffffffffffffff8111156138d157600080fd5b6020830191508360208260051b85010111156138ec57600080fd5b9250929050565b60006020828403121561390557600080fd5b6110b88261387e565b6000806040838503121561392157600080fd5b61392a8361387e565b9150602083013561393a81613f1e565b809150509250929050565b6000806040838503121561395857600080fd5b6139618361387e565b946020939093013593505050565b6000806020838503121561398257600080fd5b823567ffffffffffffffff81111561399957600080fd5b6139a5858286016138a7565b90969095509350505050565b60008060008060008060008060a0898b0312156139cd57600080fd5b883567ffffffffffffffff808211156139e557600080fd5b6139f18c838d016138a7565b909a50985060208b0135915080821115613a0a57600080fd5b613a168c838d016138a7565b909850965060408b0135915080821115613a2f57600080fd5b50613a3c8b828c016138a7565b999c989b509699959896976060870135966080013595509350505050565b60008060008060008060c08789031215613a7357600080fd5b863567ffffffffffffffff80821115613a8b57600080fd5b818901915089601f830112613a9f57600080fd5b8135602082821115613ab357613ab3613eef565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108682111715613af657613af6613eef565b604052838152828101945085830182870184018f1015613b1557600080fd5b600096505b84871015613b3f57613b2b8161387e565b865260019690960195948301948301613b1a565b509d918c01359c505060408b01359a60608101359a506080810135995060a00135975095505050505050565b600060208284031215613b7d57600080fd5b81516110b881613f1e565b600060208284031215613b9a57600080fd5b5035919050565b600060208284031215613bb357600080fd5b5051919050565b60008060408385031215613bcd57600080fd5b50508035926020909101359150565b805160c080845281519084018190526000916020919082019060e0860190845b81811015613c2e57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613bfc565b5050828501518387015260408501516040870152606085015160608701526080850151608087015260a085015160a087015280935050505092915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613cdf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613ccd858351613bdc565b94509285019290850190600101613c93565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613d5957613d4683855180518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b9284019260a09290920191600101613d08565b50909695505050505050565b6020815260006110b86020830184613bdc565b60a081016120be828480518252602081015160208301526040810151604083015260608101516060830152608081015160808301525050565b60008219821115613dc457613dc4613e91565b500190565b600082613dff577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e3c57613e3c613e91565b500290565b600082821015613e5357613e53613e91565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e8a57613e8a613e91565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b801515811461055957600080fdfea26469706673582212200c6b23ef39c0ae2a456b9d96c467ca73ead268fcb3a3da61be0e9d630b51d82564736f6c63430008060033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$4,746.41
Net Worth in ETH
2.604885
Token Allocations
SNP
100.00%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $0.001454 | 3,263,466.5579 | $4,746.41 |
Loading...
Loading
Loading...
Loading
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.