Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Grant Transfer A... | 8762549 | 2328 days ago | IN | 0 ETH | 0.00009391 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RestrictedToken
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2019-10-18
*/
// File: contracts/ITransferRules.sol
pragma solidity 0.5.12;
contract ITransferRules {
/// @notice Detects if a transfer will be reverted and if so returns an appropriate reference code
/// @param from Sending address
/// @param to Receiving address
/// @param value Amount of tokens being transferred
/// @return Code by which to reference message for rejection reasoning
function detectTransferRestriction(
address token,
address from,
address to,
uint256 value
) external view returns (uint8);
/// @notice Returns a human-readable message for a given restriction code
/// @param restrictionCode Identifier for looking up a message
/// @return Text showing the restriction's reasoning
function messageForTransferRestriction(uint8 restrictionCode)
external
view
returns (string memory);
function checkSuccess(uint8 restrictionCode) external view returns (bool);
}
// File: @openzeppelin/contracts/access/Roles.sol
pragma solidity ^0.5.0;
/**
* @title Roles
* @dev Library for managing addresses assigned to a Role.
*/
library Roles {
struct Role {
mapping (address => bool) bearer;
}
/**
* @dev Give an account access to this role.
*/
function add(Role storage role, address account) internal {
require(!has(role, account), "Roles: account already has role");
role.bearer[account] = true;
}
/**
* @dev Remove an account's access to this role.
*/
function remove(Role storage role, address account) internal {
require(has(role, account), "Roles: account does not have role");
role.bearer[account] = false;
}
/**
* @dev Check if an account has this role.
* @return bool
*/
function has(Role storage role, address account) internal view returns (bool) {
require(account != address(0), "Roles: account is the zero address");
return role.bearer[account];
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.5.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see `ERC20Detailed`.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a `Transfer` event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through `transferFrom`. This is
* zero by default.
*
* This value changes when `approve` or `transferFrom` are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* > Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an `Approval` event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a `Transfer` event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to `approve`. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity ^0.5.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, "SafeMath: division by zero");
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0, "SafeMath: modulo by zero");
return a % b;
}
}
// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
pragma solidity ^0.5.0;
/**
* @dev Implementation of the `IERC20` interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using `_mint`.
* For a generic mechanism see `ERC20Mintable`.
*
* *For a detailed writeup see our guide [How to implement supply
* mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an `Approval` event is emitted on calls to `transferFrom`.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard `decreaseAllowance` and `increaseAllowance`
* functions have been added to mitigate the well-known issues around setting
* allowances. See `IERC20.approve`.
*/
contract ERC20 is IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
/**
* @dev See `IERC20.totalSupply`.
*/
function totalSupply() public view returns (uint256) {
return _totalSupply;
}
/**
* @dev See `IERC20.balanceOf`.
*/
function balanceOf(address account) public view returns (uint256) {
return _balances[account];
}
/**
* @dev See `IERC20.transfer`.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
/**
* @dev See `IERC20.allowance`.
*/
function allowance(address owner, address spender) public view returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See `IERC20.approve`.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
/**
* @dev See `IERC20.transferFrom`.
*
* Emits an `Approval` event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of `ERC20`;
*
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `value`.
* - the caller must have allowance for `sender`'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to `approve` that can be used as a mitigation for
* problems described in `IERC20.approve`.
*
* Emits an `Approval` event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
_approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to `approve` that can be used as a mitigation for
* problems described in `IERC20.approve`.
*
* Emits an `Approval` event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
_approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to `transfer`, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a `Transfer` event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_balances[sender] = _balances[sender].sub(amount);
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a `Transfer` event with `from` set to the zero address.
*
* Requirements
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destoys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a `Transfer` event with `to` set to the zero address.
*
* Requirements
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 value) internal {
require(account != address(0), "ERC20: burn from the zero address");
_totalSupply = _totalSupply.sub(value);
_balances[account] = _balances[account].sub(value);
emit Transfer(account, address(0), value);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
*
* This is internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an `Approval` event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 value) internal {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = value;
emit Approval(owner, spender, value);
}
/**
* @dev Destoys `amount` tokens from `account`.`amount` is then deducted
* from the caller's allowance.
*
* See `_burn` and `_approve`.
*/
function _burnFrom(address account, uint256 amount) internal {
_burn(account, amount);
_approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
}
}
// File: contracts/RestrictedToken.sol
pragma solidity 0.5.12;
/// @title Restricted Token
/// @author CoMakery, Inc.
/// @notice An ERC-20 token with ERC-1404 transfer restrictions for managing security tokens, etc.
contract RestrictedToken is ERC20 {
using SafeMath for uint256;
string public symbol;
string public name;
uint8 public decimals;
ITransferRules public transferRules;
using Roles for Roles.Role;
Roles.Role private _contractAdmins;
Roles.Role private _transferAdmins;
uint256 public maxTotalSupply;
uint256 public contractAdminCount;
// Transfer restriction "eternal storage" mappings that can be used by future TransferRules contract upgrades
// They are accessed through getter and setter methods
mapping(address => uint256) private _maxBalances;
mapping(address => uint256) private _lockUntil; // unix timestamp to lock funds until
mapping(address => uint256) private _transferGroups; // restricted groups like Reg D Accredited US, Reg CF Unaccredited US and Reg S Foreign
mapping(uint256 => mapping(uint256 => uint256)) private _allowGroupTransfers; // approve transfers between groups: from => to => TimeLockUntil
mapping(address => bool) private _frozenAddresses;
bool public isPaused = false;
uint256 public constant MAX_UINT256 = ((2 ** 255 - 1) * 2) + 1; // get max uint256 without overflow
event RoleChange(address indexed grantor, address indexed grantee, string role, bool indexed status);
event AddressMaxBalance(address indexed admin, address indexed addr, uint256 indexed value);
event AddressTimeLock(address indexed admin, address indexed addr, uint256 indexed value);
event AddressTransferGroup(address indexed admin, address indexed addr, uint256 indexed value);
event AddressFrozen(address indexed admin, address indexed addr, bool indexed status);
event AllowGroupTransfer(address indexed admin, uint256 indexed fromGroup, uint256 indexed toGroup, uint256 lockedUntil);
event Pause(address admin, bool status);
event Upgrade(address admin, address oldRules, address newRules);
constructor(
address transferRules_,
address contractAdmin_,
address tokenReserveAdmin_,
string memory symbol_,
string memory name_,
uint8 decimals_,
uint256 totalSupply_,
uint256 maxTotalSupply_
) public {
require(transferRules_ != address(0), "Transfer rules address cannot be 0x0");
require(contractAdmin_ != address(0), "Token owner address cannot be 0x0");
require(tokenReserveAdmin_ != address(0), "Token reserve admin address cannot be 0x0");
// Transfer rules can be swapped out for a new contract inheriting from the ITransferRules interface
// The "eternal storage" for rule data stays in this RestrictedToken contract for use by TransferRules contract upgrades
transferRules = ITransferRules(transferRules_);
symbol = symbol_;
name = name_;
decimals = decimals_;
maxTotalSupply = maxTotalSupply_;
_contractAdmins.add(contractAdmin_);
contractAdminCount = 1;
_mint(tokenReserveAdmin_, totalSupply_);
}
modifier onlyContractAdmin() {
require(_contractAdmins.has(msg.sender), "DOES NOT HAVE CONTRACT OWNER ROLE");
_;
}
modifier onlyTransferAdmin() {
require(_transferAdmins.has(msg.sender), "DOES NOT HAVE TRANSFER ADMIN ROLE");
_;
}
modifier onlyTransferAdminOrContractAdmin() {
require((_contractAdmins.has(msg.sender) || _transferAdmins.has(msg.sender)),
"DOES NOT HAVE TRANSFER ADMIN OR CONTRACT ADMIN ROLE");
_;
}
modifier validAddress(address addr) {
require(addr != address(0), "Address cannot be 0x0");
_;
}
/// @dev Authorizes an address holder to write transfer restriction rules
/// @param addr The address to grant transfer admin rights to
function grantTransferAdmin(address addr) external validAddress(addr) onlyContractAdmin {
_transferAdmins.add(addr);
emit RoleChange(msg.sender, addr, "TransferAdmin", true);
}
/// @dev Revokes authorization to write transfer restriction rules
/// @param addr The address to grant transfer admin rights to
function revokeTransferAdmin(address addr) external validAddress(addr) onlyContractAdmin {
_transferAdmins.remove(addr);
emit RoleChange(msg.sender, addr, "TransferAdmin", false);
}
/// @dev Checks if an address is an authorized transfer admin.
/// @param addr The address to check for transfer admin privileges.
/// @return hasPermission returns true if the address has transfer admin permission and false if not.
function checkTransferAdmin(address addr) external view returns(bool hasPermission) {
return _transferAdmins.has(addr);
}
/// @dev Authorizes an address holder to be a contract admin. Contract admins grant privileges to accounts.
/// Contract admins can mint/burn tokens and freeze accounts.
/// @param addr The address to grant transfer admin rights to.
function grantContractAdmin(address addr) external validAddress(addr) onlyContractAdmin {
_contractAdmins.add(addr);
contractAdminCount = contractAdminCount.add(1);
emit RoleChange(msg.sender, addr, "ContractAdmin", true);
}
/// @dev Revokes authorization as a contract admin.
/// The contract requires there is at least 1 Contract Admin to avoid locking the Contract Admin functionality.
/// @param addr The address to remove contract admin rights from
function revokeContractAdmin(address addr) external validAddress(addr) onlyContractAdmin {
require(contractAdminCount > 1, "Must have at least one contract admin");
_contractAdmins.remove(addr);
contractAdminCount = contractAdminCount.sub(1);
emit RoleChange(msg.sender, addr, "ContractAdmin", false);
}
/// @dev Checks if an address is an authorized contract admin.
/// @param addr The address to check for contract admin privileges.
/// @return hasPermission returns true if the address has contract admin permission and false if not.
function checkContractAdmin(address addr) external view returns(bool hasPermission) {
return _contractAdmins.has(addr);
}
/// @dev Enforces transfer restrictions managed using the ERC-1404 standard functions.
/// The TransferRules contract defines what the rules are. The data inputs to those rules remains in the RestrictedToken contract.
/// TransferRules is a separate contract so its logic can be upgraded.
/// @param from The address the tokens are transferred from
/// @param to The address the tokens would be transferred to
/// @param value the quantity of tokens to be transferred
function enforceTransferRestrictions(address from, address to, uint256 value) private view {
uint8 restrictionCode = detectTransferRestriction(from, to, value);
require(transferRules.checkSuccess(restrictionCode), messageForTransferRestriction(restrictionCode));
}
/// @dev Calls the TransferRules detectTransferRetriction function to determine if tokens can be transferred.
/// detectTransferRestriction returns a status code.
/// @param from The address the tokens are transferred from
/// @param to The address the tokens would be transferred to
/// @param value The quantity of tokens to be transferred
function detectTransferRestriction(address from, address to, uint256 value) public view returns(uint8) {
return transferRules.detectTransferRestriction(address(this), from, to, value);
}
/// @dev Calls TransferRules to lookup a human readable error message that goes with an error code.
/// @param restrictionCode is an error code to lookup an error code for
function messageForTransferRestriction(uint8 restrictionCode) public view returns(string memory) {
return transferRules.messageForTransferRestriction(restrictionCode);
}
/// @dev Sets the maximum number of tokens an address will be allowed to hold.
/// Addresses can hold 0 tokens by default.
/// @param addr The address to restrict
/// @param updatedValue the maximum number of tokens the address can hold
function setMaxBalance(address addr, uint256 updatedValue) public validAddress(addr) onlyTransferAdmin {
_maxBalances[addr] = updatedValue;
emit AddressMaxBalance(msg.sender, addr, updatedValue);
}
/// @dev Gets the maximum number of tokens an address is allowed to hold
/// @param addr The address to check restrictions for
function getMaxBalance(address addr) external view returns(uint256) {
return _maxBalances[addr];
}
/// @dev Lock tokens in the address from being transfered until the specified time
/// @param addr The address to restrict
/// @param timestamp The time the tokens will be locked until as a Unix timetsamp.
/// Unix timestamp is the number of seconds since the Unix epoch of 00:00:00 UTC on 1 January 1970.
function setLockUntil(address addr, uint256 timestamp) public validAddress(addr) onlyTransferAdmin {
_lockUntil[addr] = timestamp;
emit AddressTimeLock(msg.sender, addr, timestamp);
}
/// @dev A convenience method to remove an addresses timelock. It sets the lock date to 0 which corresponds to the
/// earliest possible timestamp in the past 00:00:00 UTC on 1 January 1970.
/// @param addr The address to remove the timelock for.
function removeLockUntil(address addr) external validAddress(addr) onlyTransferAdmin {
_lockUntil[addr] = 0;
emit AddressTimeLock(msg.sender, addr, 0);
}
/// @dev Check when the address will be locked for transfers until
/// @param addr The address to check
/// @return timestamp The time the address will be locked until.
/// The format is the number of seconds since the Unix epoch of 00:00:00 UTC on 1 January 1970.
function getLockUntil(address addr) external view returns(uint256 timestamp) {
return _lockUntil[addr];
}
/// @dev Set the one group that the address belongs to, such as a US Reg CF investor group.
/// @param addr The address to set the group for.
/// @param groupID The uint256 numeric ID of the group.
function setTransferGroup(address addr, uint256 groupID) public validAddress(addr) onlyTransferAdmin {
_transferGroups[addr] = groupID;
emit AddressTransferGroup(msg.sender, addr, groupID);
}
/// @dev Gets the transfer group the address belongs to. The default group is 0.
/// @param addr The address to check.
/// @return groupID The group id of the address.
function getTransferGroup(address addr) external view returns(uint256 groupID) {
return _transferGroups[addr];
}
/// @dev Freezes or unfreezes an address.
/// Tokens in a frozen address cannot be transferred from until the address is unfrozen.
/// @param addr The address to be frozen.
/// @param status The frozenAddress status of the address. True means frozen false means not frozen.
function freeze(address addr, bool status) public validAddress(addr) onlyTransferAdminOrContractAdmin {
_frozenAddresses[addr] = status;
emit AddressFrozen(msg.sender, addr, status);
}
/// @dev Checks the status of an address to see if its frozen
/// @param addr The address to check
/// @return status Returns true if the address is frozen and false if its not frozen.
function getFrozenStatus(address addr) external view returns(bool status) {
return _frozenAddresses[addr];
}
/// @dev A convenience method for updating the transfer group, lock until, max balance, and freeze status.
/// The convenience method also helps to reduce gas costs.
/// @param addr The address to set permissions for.
/// @param groupID The ID of the address
/// @param timeLockUntil The unix timestamp that the address should be locked until. Use 0 if it's not locked.
/// The format is the number of seconds since the Unix epoch of 00:00:00 UTC on 1 January 1970.
/// @param maxBalance Is the maximum number of tokens the account can hold.
/// @param status The frozenAddress status of the address. True means frozen false means not frozen.
function setAddressPermissions(address addr, uint256 groupID, uint256 timeLockUntil,
uint256 maxBalance, bool status) public validAddress(addr) onlyTransferAdmin {
setTransferGroup(addr, groupID);
setLockUntil(addr, timeLockUntil);
setMaxBalance(addr, maxBalance);
freeze(addr, status);
}
/// @dev Sets an allowed transfer from a group to another group beginning at a specific time.
/// There is only one definitive rule per from and to group.
/// @param from The group the transfer is coming from.
/// @param to The group the transfer is going to.
/// @param lockedUntil The unix timestamp that the transfer is locked until. 0 is a special number. 0 means the transfer is not allowed.
/// This is because in the smart contract mapping all pairs are implicitly defined with a default lockedUntil value of 0.
/// But no transfers should be authorized until explicitly allowed. Thus 0 must mean no transfer is allowed.
function setAllowGroupTransfer(uint256 from, uint256 to, uint256 lockedUntil) external onlyTransferAdmin {
_allowGroupTransfers[from][to] = lockedUntil;
emit AllowGroupTransfer(msg.sender, from, to, lockedUntil);
}
/// @dev Checks to see when a transfer between two addresses would be allowed.
/// @param from The address the transfer is coming from
/// @param to The address the transfer is going to
/// @return timestamp The Unix timestamp of the time the transfer would be allowed. A 0 means never.
/// The format is the number of seconds since the Unix epoch of 00:00:00 UTC on 1 January 1970.
function getAllowTransferTime(address from, address to) external view returns(uint timestamp) {
return _allowGroupTransfers[_transferGroups[from]][_transferGroups[to]];
}
/// @dev Checks to see when a transfer between two groups would be allowed.
/// @param from The group id the transfer is coming from
/// @param to The group id the transfer is going to
/// @return timestamp The Unix timestamp of the time the transfer would be allowed. A 0 means never.
/// The format is the number of seconds since the Unix epoch of 00:00:00 UTC on 1 January 1970.
function getAllowGroupTransferTime(uint from, uint to) external view returns(uint timestamp) {
return _allowGroupTransfers[from][to];
}
/// @dev Destroys tokens and removes them from the total supply. Can only be called by an address with a Contract Admin role.
/// @param from The address to destroy the tokens from.
/// @param value The number of tokens to destroy from the address.
function burn(address from, uint256 value) external validAddress(from) onlyContractAdmin {
require(value <= balanceOf(from), "Insufficent tokens to burn");
_burn(from, value);
}
/// @dev Allows the contract admin to create new tokens in a specified address.
/// The total number of tokens cannot exceed the maxTotalSupply (the "Hard Cap").
/// @param to The addres to mint tokens into.
/// @param value The number of tokens to mint.
function mint(address to, uint256 value) external validAddress(to) onlyContractAdmin {
require(SafeMath.add(totalSupply(), value) <= maxTotalSupply, "Cannot mint more than the max total supply");
_mint(to, value);
}
/// @dev Allows the contract admin to pause transfers.
function pause() external onlyContractAdmin() {
isPaused = true;
emit Pause(msg.sender, true);
}
/// @dev Allows the contract admin to unpause transfers.
function unpause() external onlyContractAdmin() {
isPaused = false;
emit Pause(msg.sender, false);
}
/// @dev Allows the contrac admin to upgrade the transfer rules.
/// The upgraded transfer rules must implement the ITransferRules interface which conforms to the ERC-1404 token standard.
/// @param newTransferRules The address of the deployed TransferRules contract.
function upgradeTransferRules(ITransferRules newTransferRules) external onlyContractAdmin {
require(address(newTransferRules) != address(0x0), "Address cannot be 0x0");
address oldRules = address(transferRules);
transferRules = newTransferRules;
emit Upgrade(msg.sender, oldRules, address(newTransferRules));
}
function transfer(address to, uint256 value) public validAddress(to) returns(bool success) {
require(value <= balanceOf(msg.sender), "Insufficent tokens");
enforceTransferRestrictions(msg.sender, to, value);
super.transfer(to, value);
return true;
}
function transferFrom(address from, address to, uint256 value) public validAddress(from) validAddress(to) returns(bool success) {
require(value <= allowance(from, to), "The approved allowance is lower than the transfer amount");
require(value <= balanceOf(from), "Insufficent tokens");
enforceTransferRestrictions(from, to, value);
super.transferFrom(from, to, value);
return true;
}
function safeApprove(address spender, uint256 value) public {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require((value == 0) || (allowance(address(msg.sender), spender) == 0),
"Cannot approve from non-zero to non-zero allowance"
);
approve(spender, value);
}
}
// File: contracts/TransferRules.sol
pragma solidity 0.5.12;
contract TransferRules is ITransferRules {
using SafeMath for uint256;
mapping(uint8 => string) internal errorMessage;
uint8 public constant SUCCESS = 0;
uint8 public constant GREATER_THAN_RECIPIENT_MAX_BALANCE = 1;
uint8 public constant SENDER_TOKENS_TIME_LOCKED = 2;
uint8 public constant DO_NOT_SEND_TO_TOKEN_CONTRACT = 3;
uint8 public constant DO_NOT_SEND_TO_EMPTY_ADDRESS = 4;
uint8 public constant SENDER_ADDRESS_FROZEN = 5;
uint8 public constant ALL_TRANSFERS_PAUSED = 6;
uint8 public constant TRANSFER_GROUP_NOT_APPROVED = 7;
uint8 public constant TRANSFER_GROUP_NOT_ALLOWED_UNTIL_LATER = 8;
constructor() public {
errorMessage[SUCCESS] = "SUCCESS";
errorMessage[GREATER_THAN_RECIPIENT_MAX_BALANCE] = "GREATER THAN RECIPIENT MAX BALANCE";
errorMessage[SENDER_TOKENS_TIME_LOCKED] = "SENDER TOKENS LOCKED";
errorMessage[DO_NOT_SEND_TO_TOKEN_CONTRACT] = "DO NOT SEND TO TOKEN CONTRACT";
errorMessage[DO_NOT_SEND_TO_EMPTY_ADDRESS] = "DO NOT SEND TO EMPTY ADDRESS";
errorMessage[SENDER_ADDRESS_FROZEN] = "SENDER ADDRESS IS FROZEN";
errorMessage[ALL_TRANSFERS_PAUSED] = "ALL TRANSFERS PAUSED";
errorMessage[TRANSFER_GROUP_NOT_APPROVED] = "TRANSFER GROUP NOT APPROVED";
errorMessage[TRANSFER_GROUP_NOT_ALLOWED_UNTIL_LATER] = "TRANSFER GROUP NOT ALLOWED UNTIL LATER";
}
/// @notice Detects if a transfer will be reverted and if so returns an appropriate reference code
/// @param from Sending address
/// @param to Receiving address
/// @param value Amount of tokens being transferred
/// @return Code by which to reference message for rejection reason
function detectTransferRestriction(address _token, address from, address to, uint256 value) external view returns(uint8) {
RestrictedToken token = RestrictedToken(_token);
if (token.isPaused()) return ALL_TRANSFERS_PAUSED;
if (to == address(0)) return DO_NOT_SEND_TO_EMPTY_ADDRESS;
if (to == address(token)) return DO_NOT_SEND_TO_TOKEN_CONTRACT;
if (token.balanceOf(to).add(value) > token.getMaxBalance(to)) return GREATER_THAN_RECIPIENT_MAX_BALANCE;
if (now < token.getLockUntil(from)) return SENDER_TOKENS_TIME_LOCKED;
if (token.getFrozenStatus(from)) return SENDER_ADDRESS_FROZEN;
uint256 lockedUntil = token.getAllowTransferTime(from, to);
if (0 == lockedUntil) return TRANSFER_GROUP_NOT_APPROVED;
if (now < lockedUntil) return TRANSFER_GROUP_NOT_ALLOWED_UNTIL_LATER;
return SUCCESS;
}
/// @notice Returns a human-readable message for a given restriction code
/// @param restrictionCode Identifier for looking up a message
/// @return Text showing the restriction's reasoning
function messageForTransferRestriction(uint8 restrictionCode) external view returns(string memory) {
return errorMessage[restrictionCode];
}
/// @notice a method for checking a response code to determine if a transfer was succesful.
/// Defining this separately from the token contract allows it to be upgraded.
/// For instance this method would need to be upgraded if the SUCCESS code was changed to 1
/// as specified in ERC-1066 instead of 0 as specified in ERC-1404.
/// @param restrictionCode The code to check.
/// @return isSuccess A boolean indicating if the code is the SUCCESS code.
function checkSuccess(uint8 restrictionCode) external view returns(bool isSuccess) {
return restrictionCode == SUCCESS;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"transferRules_","type":"address"},{"internalType":"address","name":"contractAdmin_","type":"address"},{"internalType":"address","name":"tokenReserveAdmin_","type":"address"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"totalSupply_","type":"uint256"},{"internalType":"uint256","name":"maxTotalSupply_","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AddressFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AddressMaxBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AddressTimeLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AddressTransferGroup","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":true,"internalType":"uint256","name":"fromGroup","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"toGroup","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockedUntil","type":"uint256"}],"name":"AllowGroupTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"grantor","type":"address"},{"indexed":true,"internalType":"address","name":"grantee","type":"address"},{"indexed":false,"internalType":"string","name":"role","type":"string"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"RoleChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"address","name":"oldRules","type":"address"},{"indexed":false,"internalType":"address","name":"newRules","type":"address"}],"name":"Upgrade","type":"event"},{"constant":true,"inputs":[],"name":"MAX_UINT256","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkContractAdmin","outputs":[{"internalType":"bool","name":"hasPermission","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkTransferAdmin","outputs":[{"internalType":"bool","name":"hasPermission","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"contractAdminCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"detectTransferRestriction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"freeze","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"}],"name":"getAllowGroupTransferTime","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"getAllowTransferTime","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getFrozenStatus","outputs":[{"internalType":"bool","name":"status","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getLockUntil","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getMaxBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getTransferGroup","outputs":[{"internalType":"uint256","name":"groupID","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"grantContractAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"grantTransferAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint8","name":"restrictionCode","type":"uint8"}],"name":"messageForTransferRestriction","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeLockUntil","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"revokeContractAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"revokeTransferAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"safeApprove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"groupID","type":"uint256"},{"internalType":"uint256","name":"timeLockUntil","type":"uint256"},{"internalType":"uint256","name":"maxBalance","type":"uint256"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setAddressPermissions","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"uint256","name":"lockedUntil","type":"uint256"}],"name":"setAllowGroupTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setLockUntil","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"updatedValue","type":"uint256"}],"name":"setMaxBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"groupID","type":"uint256"}],"name":"setTransferGroup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"transferRules","outputs":[{"internalType":"contract ITransferRules","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ITransferRules","name":"newTransferRules","type":"address"}],"name":"upgradeTransferRules","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6080604052600f805460ff191690553480156200001b57600080fd5b506040516200304c3803806200304c83398181016040526101008110156200004257600080fd5b8151602083015160408085015160608601805192519496939591949391820192846401000000008211156200007657600080fd5b9083019060208201858111156200008c57600080fd5b8251640100000000811182820188101715620000a757600080fd5b82525081516020918201929091019080838360005b83811015620000d6578181015183820152602001620000bc565b50505050905090810190601f168015620001045780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200012857600080fd5b9083019060208201858111156200013e57600080fd5b82516401000000008111828201881017156200015957600080fd5b82525081516020918201929091019080838360005b83811015620001885781810151838201526020016200016e565b50505050905090810190601f168015620001b65780820380516001836020036101000a031916815260200191505b5060409081526020820151908201516060909201519093509091506001600160a01b03881662000232576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180620030066024913960400191505060405180910390fd5b6001600160a01b03871662000293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018062002fbc6021913960400191505060405180910390fd5b6001600160a01b038616620002f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018062002fdd6029913960400191505060405180910390fd5b60058054610100600160a81b0319166101006001600160a01b038b160217905584516200032990600390602088019062000656565b5083516200033f90600490602087019062000656565b506005805460ff191660ff851617905560088190556200036d60068862000395602090811b6200231a17901c565b60016009556200038786836001600160e01b036200043c16565b5050505050505050620006fb565b620003aa82826001600160e01b036200055716565b156200041757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b038216620004b257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b620004ce81600254620005da60201b620021c91790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000501918390620021c9620005da821b17901c565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60006001600160a01b038216620005ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806200302a6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6000828201838110156200064f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200069957805160ff1916838001178555620006c9565b82800160010185558215620006c9579182015b82811115620006c9578251825591602001919060010190620006ac565b50620006d7929150620006db565b5090565b620006f891905b80821115620006d75760008155600101620006e2565b90565b6128b1806200070b6000396000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c806364ca0ac311610151578063b187bd26116100c3578063db74fa3611610087578063db74fa36146107e8578063dd62ed3e1461080e578063dfb7300e1461083c578063e98a0c6414610862578063fbc6d1cb1461088b578063fc96f7d8146108b757610269565b8063b187bd2614610732578063bf120ae51461073a578063c63aa52114610768578063ceca46c21461078e578063d4ce1415146107b257610269565b80638e64eac5116101155780638e64eac51461067857806395d89b411461068057806395ed620a146106885780639dc29fac146106ae578063a457c2d7146106da578063a9059cbb1461070657610269565b806364ca0ac3146105d257806370a08231146105fe5780637f4ab1dd146106245780638456cb59146106445780638d56cc9c1461064c57610269565b806333a581d2116101ea57806340c10f19116101ae57806340c10f19146104c657806340dc95c5146104f257806343c8fc6f1461052057806345d11299146105465780634723778c14610586578063587c9571146105ac57610269565b806333a581d21461044157806339509351146104495780633b1f927f146104755780633c637d741461049b5780633f4ba83a146104be57610269565b806318160ddd1161023157806318160ddd146103b157806323b872dd146103b95780632ab4d052146103ef57806330e15818146103f7578063313ce5671461042357610269565b8063025cb46b1461026e57806306fdde03146102a8578063079ade0114610325578063095ea7b31461035d5780631309d2e514610389575b600080fd5b6102946004803603602081101561028457600080fd5b50356001600160a01b03166108dd565b604080519115158252519081900360200190f35b6102b06108f6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ea5781810151838201526020016102d2565b50505050905090810190601f1680156103175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61034b6004803603602081101561033b57600080fd5b50356001600160a01b0316610984565b60408051918252519081900360200190f35b6102946004803603604081101561037357600080fd5b506001600160a01b03813516906020013561099f565b6103af6004803603602081101561039f57600080fd5b50356001600160a01b03166109b5565b005b61034b610aaf565b610294600480360360608110156103cf57600080fd5b506001600160a01b03813581169160208101359091169060400135610ab5565b61034b610c08565b6103af6004803603604081101561040d57600080fd5b506001600160a01b038135169060200135610c0e565b61042b610cef565b6040805160ff9092168252519081900360200190f35b61034b610cf8565b6102946004803603604081101561045f57600080fd5b506001600160a01b038135169060200135610cfe565b6103af6004803603602081101561048b57600080fd5b50356001600160a01b0316610d3f565b61034b600480360360408110156104b157600080fd5b5080359060200135610e20565b6103af610e3d565b6103af600480360360408110156104dc57600080fd5b506001600160a01b038135169060200135610ed0565b61034b6004803603604081101561050857600080fd5b506001600160a01b0381358116916020013516610fc6565b6103af6004803603602081101561053657600080fd5b50356001600160a01b0316611004565b6103af600480360360a081101561055c57600080fd5b506001600160a01b03813516906020810135906040810135906060810135906080013515156110fe565b6103af6004803603602081101561059c57600080fd5b50356001600160a01b03166111c4565b6103af600480360360208110156105c257600080fd5b50356001600160a01b03166112d5565b6103af600480360360408110156105e857600080fd5b506001600160a01b038135169060200135611427565b61034b6004803603602081101561061457600080fd5b50356001600160a01b0316611508565b6102b06004803603602081101561063a57600080fd5b503560ff16611523565b6103af61166a565b6103af6004803603604081101561066257600080fd5b506001600160a01b038135169060200135611703565b61034b6117e4565b6102b06117ea565b6102946004803603602081101561069e57600080fd5b50356001600160a01b0316611845565b6103af600480360360408110156106c457600080fd5b506001600160a01b038135169060200135611858565b610294600480360360408110156106f057600080fd5b506001600160a01b038135169060200135611955565b6102946004803603604081101561071c57600080fd5b506001600160a01b038135169060200135611991565b610294611a4f565b6103af6004803603604081101561075057600080fd5b506001600160a01b0381351690602001351515611a58565b61034b6004803603602081101561077e57600080fd5b50356001600160a01b0316611b5d565b610796611b78565b604080516001600160a01b039092168252519081900360200190f35b61042b600480360360608110156107c857600080fd5b506001600160a01b03813581169160208101359091169060400135611b8c565b61034b600480360360208110156107fe57600080fd5b50356001600160a01b0316611c2a565b61034b6004803603604081101561082457600080fd5b506001600160a01b0381358116916020013516611c45565b6103af6004803603602081101561085257600080fd5b50356001600160a01b0316611c70565b6103af6004803603606081101561087857600080fd5b5080359060208101359060400135611d7a565b6103af600480360360408110156108a157600080fd5b506001600160a01b038135169060200135611e1f565b610294600480360360208110156108cd57600080fd5b50356001600160a01b0316611e78565b60006108f060068363ffffffff611e9616565b92915050565b6004805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561097c5780601f106109515761010080835404028352916020019161097c565b820191906000526020600020905b81548152906001019060200180831161095f57829003601f168201915b505050505081565b6001600160a01b03166000908152600b602052604090205490565b60006109ac338484611efd565b50600192915050565b806001600160a01b0381166109ff576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610a1060063363ffffffff611e9616565b610a4b5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b610a5c60078363ffffffff611fe916565b604080516020808252600d908201526c2a3930b739b332b920b236b4b760991b8183015290516000916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b60025490565b6000836001600160a01b038116610b01576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b836001600160a01b038116610b4b576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610b558686611c45565b841115610b935760405162461bcd60e51b815260040180806020018281038252603881526020018061281b6038913960400191505060405180910390fd5b610b9c86611508565b841115610be5576040805162461bcd60e51b8152602060048201526012602482015271496e737566666963656e7420746f6b656e7360701b604482015290519081900360640190fd5b610bf0868686612050565b610bfb868686612177565b5060019695505050505050565b60085481565b816001600160a01b038116610c58576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610c6960073363ffffffff611e9616565b610ca45760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0383166000818152600b60205260408082208590555184929133917fb52d7c619ff55f3f330a200dfb412b8dae21bbabf8fecf8d1b6626e47560c8dc9190a4505050565b60055460ff1681565b60001981565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109ac918590610d3a908663ffffffff6121c916565b611efd565b806001600160a01b038116610d89576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610d9a60073363ffffffff611e9616565b610dd55760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0382166000818152600b60205260408082208290555190919033907fb52d7c619ff55f3f330a200dfb412b8dae21bbabf8fecf8d1b6626e47560c8dc908490a45050565b6000918252600d6020908152604080842092845291905290205490565b610e4e60063363ffffffff611e9616565b610e895760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b600f805460ff19169055604080513381526000602082015281517f0d7fd1e314b29407db3d79c46ecf1fa3d2108961fab8d20584277358cac41e89929181900390910190a1565b816001600160a01b038116610f1a576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610f2b60063363ffffffff611e9616565b610f665760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b600854610f7a610f74610aaf565b846121c9565b1115610fb75760405162461bcd60e51b815260040180806020018281038252602a815260200180612853602a913960400191505060405180910390fd5b610fc1838361222a565b505050565b6001600160a01b039182166000908152600c60208181526040808420548452600d825280842094909516835290815283822054825291909152205490565b806001600160a01b03811661104e576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61105f60063363ffffffff611e9616565b61109a5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6110ab60078363ffffffff61231a16565b604080516020808252600d908201526c2a3930b739b332b920b236b4b760991b8183015290516001916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b846001600160a01b038116611148576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61115960073363ffffffff611e9616565b6111945760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b61119e8686611427565b6111a88685610c0e565b6111b28684611703565b6111bc8683611a58565b505050505050565b806001600160a01b03811661120e576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61121f60063363ffffffff611e9616565b61125a5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b61126b60068363ffffffff61231a16565b60095461127f90600163ffffffff6121c916565b600955604080516020808252600d908201526c21b7b73a3930b1ba20b236b4b760991b8183015290516001916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b806001600160a01b03811661131f576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61133060063363ffffffff611e9616565b61136b5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6001600954116113ac5760405162461bcd60e51b81526004018080602001828103825260258152602001806126d56025913960400191505060405180910390fd5b6113bd60068363ffffffff611fe916565b6009546113d190600163ffffffff61239b16565b600955604080516020808252600d908201526c21b7b73a3930b1ba20b236b4b760991b8183015290516000916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b816001600160a01b038116611471576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61148260073363ffffffff611e9616565b6114bd5760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0383166000818152600c60205260408082208590555184929133917ff213aa445739b8d5bb514c5e3142fe13baacfa991314172ceaf756996259b8b39190a4505050565b6001600160a01b031660009081526020819052604090205490565b60055460408051637f4ab1dd60e01b815260ff84166004820152905160609261010090046001600160a01b031691637f4ab1dd916024808301926000929190829003018186803b15801561157657600080fd5b505afa15801561158a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156115b357600080fd5b81019080805160405193929190846401000000008211156115d357600080fd5b9083019060208201858111156115e857600080fd5b825164010000000081118282018810171561160257600080fd5b82525081516020918201929091019080838360005b8381101561162f578181015183820152602001611617565b50505050905090810190601f16801561165c5780820380516001836020036101000a031916815260200191505b506040525050509050919050565b61167b60063363ffffffff611e9616565b6116b65760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b600f805460ff1916600190811790915560408051338152602081019290925280517f0d7fd1e314b29407db3d79c46ecf1fa3d2108961fab8d20584277358cac41e899281900390910190a1565b816001600160a01b03811661174d576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61175e60073363ffffffff611e9616565b6117995760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0383166000818152600a60205260408082208590555184929133917f0765aaf231b09368f07b83425559b145d7d386b1ff8f16c157a2ff2c7b9896fe9190a4505050565b60095481565b6003805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561097c5780601f106109515761010080835404028352916020019161097c565b60006108f060078363ffffffff611e9616565b816001600160a01b0381166118a2576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b6118b360063363ffffffff611e9616565b6118ee5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6118f783611508565b82111561194b576040805162461bcd60e51b815260206004820152601a60248201527f496e737566666963656e7420746f6b656e7320746f206275726e000000000000604482015290519081900360640190fd5b610fc183836123f8565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109ac918590610d3a908663ffffffff61239b16565b6000826001600160a01b0381166119dd576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b6119e633611508565b831115611a2f576040805162461bcd60e51b8152602060048201526012602482015271496e737566666963656e7420746f6b656e7360701b604482015290519081900360640190fd5b611a3a338585612050565b611a4484846124d1565b506001949350505050565b600f5460ff1681565b816001600160a01b038116611aa2576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b611ab360063363ffffffff611e9616565b80611aca5750611aca60073363ffffffff611e9616565b611b055760405162461bcd60e51b81526004018080602001828103825260338152602001806126fa6033913960400191505060405180910390fd5b6001600160a01b0383166000818152600e6020526040808220805460ff1916861515908117909155905190929133917f17ec2643977f0865dd45350e9efdcdfead258c9220974e67d1a37ca1447722939190a4505050565b6001600160a01b03166000908152600a602052604090205490565b60055461010090046001600160a01b031681565b6005546040805163cfdb31a960e01b81523060048201526001600160a01b038681166024830152858116604483015260648201859052915160009361010090049092169163cfdb31a991608480820192602092909190829003018186803b158015611bf657600080fd5b505afa158015611c0a573d6000803e3d6000fd5b505050506040513d6020811015611c2057600080fd5b5051949350505050565b6001600160a01b03166000908152600c602052604090205490565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611c8160063363ffffffff611e9616565b611cbc5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6001600160a01b038116611d05576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b600580546001600160a01b03838116610100818102610100600160a81b03198516179094556040805133815294909304919091166020840181905283830191909152905190917f8c78349fc44add47ae711ddc6e926b7845597c57473e587420693d8d0547845a919081900360600190a15050565b611d8b60073363ffffffff611e9616565b611dc65760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6000838152600d60209081526040808320858452825291829020839055815183815291518492869233927f5845e315015ee03f0d4ab1d198172b4f733609dc3de8b957ae1d86c8740301899281900390910190a4505050565b801580611e335750611e313383611c45565b155b611e6e5760405162461bcd60e51b815260040180806020018281038252603281526020018061261d6032913960400191505060405180910390fd5b610fc1828261099f565b6001600160a01b03166000908152600e602052604090205460ff1690565b60006001600160a01b038216611edd5760405162461bcd60e51b815260040180806020018281038252602281526020018061274e6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b038316611f425760405162461bcd60e51b81526004018080602001828103825260248152602001806127f76024913960400191505060405180910390fd5b6001600160a01b038216611f875760405162461bcd60e51b81526004018080602001828103825260228152602001806126926022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b611ff38282611e96565b61202e5760405162461bcd60e51b815260040180806020018281038252602181526020018061272d6021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b600061205d848484611b8c565b60055460408051637d8e7d1b60e01b815260ff8416600482015290519293506101009091046001600160a01b031691637d8e7d1b91602480820192602092909190829003018186803b1580156120b257600080fd5b505afa1580156120c6573d6000803e3d6000fd5b505050506040513d60208110156120dc57600080fd5b50516120e782611523565b906121705760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561213557818101518382015260200161211d565b50505050905090810190601f1680156121625780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505050565b60006121848484846124da565b6001600160a01b0384166000908152600160209081526040808320338085529252909120546121bf918691610d3a908663ffffffff61239b16565b5060019392505050565b600082820183811015612223576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216612285576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254612298908263ffffffff6121c916565b6002556001600160a01b0382166000908152602081905260409020546122c4908263ffffffff6121c916565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6123248282611e96565b15612376576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000828211156123f2576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03821661243d5760405162461bcd60e51b81526004018080602001828103825260218152602001806127916021913960400191505060405180910390fd5b600254612450908263ffffffff61239b16565b6002556001600160a01b03821660009081526020819052604090205461247c908263ffffffff61239b16565b6001600160a01b038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b60006109ac3384845b6001600160a01b03831661251f5760405162461bcd60e51b81526004018080602001828103825260258152602001806127d26025913960400191505060405180910390fd5b6001600160a01b0382166125645760405162461bcd60e51b815260040180806020018281038252602381526020018061264f6023913960400191505060405180910390fd5b6001600160a01b03831660009081526020819052604090205461258d908263ffffffff61239b16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546125c2908263ffffffff6121c916565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a350505056fe43616e6e6f7420617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a207472616e7366657220746f20746865207a65726f2061646472657373416464726573732063616e6e6f7420626520307830000000000000000000000045524332303a20617070726f766520746f20746865207a65726f2061646472657373444f4553204e4f54204841564520434f4e5452414354204f574e455220524f4c454d7573742068617665206174206c65617374206f6e6520636f6e74726163742061646d696e444f4553204e4f542048415645205452414e534645522041444d494e204f5220434f4e54524143542041444d494e20524f4c45526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373444f4553204e4f542048415645205452414e534645522041444d494e20524f4c4545524332303a206275726e2066726f6d20746865207a65726f2061646472657373b8d6abb0a3f68d78d33d9d0a174f38ab8806c36318ade20e0eff6b585c8d413b45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737354686520617070726f76656420616c6c6f77616e6365206973206c6f776572207468616e20746865207472616e7366657220616d6f756e7443616e6e6f74206d696e74206d6f7265207468616e20746865206d617820746f74616c20737570706c79a265627a7a72315820ccfbc6e4dd4827747e21570ea618016582b01d4b9bb253a408ff0135733064a964736f6c634300050c0032546f6b656e206f776e657220616464726573732063616e6e6f7420626520307830546f6b656e20726573657276652061646d696e20616464726573732063616e6e6f74206265203078305472616e736665722072756c657320616464726573732063616e6e6f7420626520307830526f6c65733a206163636f756e7420697320746865207a65726f20616464726573730000000000000000000000005b097a5f2d5579912494dbbeef8c0c1c8e1fe170000000000000000000000000fb87c53b7770b451a5f193fe9e954d87d2872855000000000000000000000000a153dd6e4725c94066a7aa3425a3a737cfaf7c1200000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000052b7d2dcc80cd2e400000000000000000000000000000000000000000000000052b7d2dcc80cd2e4000000000000000000000000000000000000000000000000000000000000000000000758595a546573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000155265737472696374656420546f6b656e20546573740000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102695760003560e01c806364ca0ac311610151578063b187bd26116100c3578063db74fa3611610087578063db74fa36146107e8578063dd62ed3e1461080e578063dfb7300e1461083c578063e98a0c6414610862578063fbc6d1cb1461088b578063fc96f7d8146108b757610269565b8063b187bd2614610732578063bf120ae51461073a578063c63aa52114610768578063ceca46c21461078e578063d4ce1415146107b257610269565b80638e64eac5116101155780638e64eac51461067857806395d89b411461068057806395ed620a146106885780639dc29fac146106ae578063a457c2d7146106da578063a9059cbb1461070657610269565b806364ca0ac3146105d257806370a08231146105fe5780637f4ab1dd146106245780638456cb59146106445780638d56cc9c1461064c57610269565b806333a581d2116101ea57806340c10f19116101ae57806340c10f19146104c657806340dc95c5146104f257806343c8fc6f1461052057806345d11299146105465780634723778c14610586578063587c9571146105ac57610269565b806333a581d21461044157806339509351146104495780633b1f927f146104755780633c637d741461049b5780633f4ba83a146104be57610269565b806318160ddd1161023157806318160ddd146103b157806323b872dd146103b95780632ab4d052146103ef57806330e15818146103f7578063313ce5671461042357610269565b8063025cb46b1461026e57806306fdde03146102a8578063079ade0114610325578063095ea7b31461035d5780631309d2e514610389575b600080fd5b6102946004803603602081101561028457600080fd5b50356001600160a01b03166108dd565b604080519115158252519081900360200190f35b6102b06108f6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ea5781810151838201526020016102d2565b50505050905090810190601f1680156103175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61034b6004803603602081101561033b57600080fd5b50356001600160a01b0316610984565b60408051918252519081900360200190f35b6102946004803603604081101561037357600080fd5b506001600160a01b03813516906020013561099f565b6103af6004803603602081101561039f57600080fd5b50356001600160a01b03166109b5565b005b61034b610aaf565b610294600480360360608110156103cf57600080fd5b506001600160a01b03813581169160208101359091169060400135610ab5565b61034b610c08565b6103af6004803603604081101561040d57600080fd5b506001600160a01b038135169060200135610c0e565b61042b610cef565b6040805160ff9092168252519081900360200190f35b61034b610cf8565b6102946004803603604081101561045f57600080fd5b506001600160a01b038135169060200135610cfe565b6103af6004803603602081101561048b57600080fd5b50356001600160a01b0316610d3f565b61034b600480360360408110156104b157600080fd5b5080359060200135610e20565b6103af610e3d565b6103af600480360360408110156104dc57600080fd5b506001600160a01b038135169060200135610ed0565b61034b6004803603604081101561050857600080fd5b506001600160a01b0381358116916020013516610fc6565b6103af6004803603602081101561053657600080fd5b50356001600160a01b0316611004565b6103af600480360360a081101561055c57600080fd5b506001600160a01b03813516906020810135906040810135906060810135906080013515156110fe565b6103af6004803603602081101561059c57600080fd5b50356001600160a01b03166111c4565b6103af600480360360208110156105c257600080fd5b50356001600160a01b03166112d5565b6103af600480360360408110156105e857600080fd5b506001600160a01b038135169060200135611427565b61034b6004803603602081101561061457600080fd5b50356001600160a01b0316611508565b6102b06004803603602081101561063a57600080fd5b503560ff16611523565b6103af61166a565b6103af6004803603604081101561066257600080fd5b506001600160a01b038135169060200135611703565b61034b6117e4565b6102b06117ea565b6102946004803603602081101561069e57600080fd5b50356001600160a01b0316611845565b6103af600480360360408110156106c457600080fd5b506001600160a01b038135169060200135611858565b610294600480360360408110156106f057600080fd5b506001600160a01b038135169060200135611955565b6102946004803603604081101561071c57600080fd5b506001600160a01b038135169060200135611991565b610294611a4f565b6103af6004803603604081101561075057600080fd5b506001600160a01b0381351690602001351515611a58565b61034b6004803603602081101561077e57600080fd5b50356001600160a01b0316611b5d565b610796611b78565b604080516001600160a01b039092168252519081900360200190f35b61042b600480360360608110156107c857600080fd5b506001600160a01b03813581169160208101359091169060400135611b8c565b61034b600480360360208110156107fe57600080fd5b50356001600160a01b0316611c2a565b61034b6004803603604081101561082457600080fd5b506001600160a01b0381358116916020013516611c45565b6103af6004803603602081101561085257600080fd5b50356001600160a01b0316611c70565b6103af6004803603606081101561087857600080fd5b5080359060208101359060400135611d7a565b6103af600480360360408110156108a157600080fd5b506001600160a01b038135169060200135611e1f565b610294600480360360208110156108cd57600080fd5b50356001600160a01b0316611e78565b60006108f060068363ffffffff611e9616565b92915050565b6004805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561097c5780601f106109515761010080835404028352916020019161097c565b820191906000526020600020905b81548152906001019060200180831161095f57829003601f168201915b505050505081565b6001600160a01b03166000908152600b602052604090205490565b60006109ac338484611efd565b50600192915050565b806001600160a01b0381166109ff576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610a1060063363ffffffff611e9616565b610a4b5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b610a5c60078363ffffffff611fe916565b604080516020808252600d908201526c2a3930b739b332b920b236b4b760991b8183015290516000916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b60025490565b6000836001600160a01b038116610b01576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b836001600160a01b038116610b4b576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610b558686611c45565b841115610b935760405162461bcd60e51b815260040180806020018281038252603881526020018061281b6038913960400191505060405180910390fd5b610b9c86611508565b841115610be5576040805162461bcd60e51b8152602060048201526012602482015271496e737566666963656e7420746f6b656e7360701b604482015290519081900360640190fd5b610bf0868686612050565b610bfb868686612177565b5060019695505050505050565b60085481565b816001600160a01b038116610c58576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610c6960073363ffffffff611e9616565b610ca45760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0383166000818152600b60205260408082208590555184929133917fb52d7c619ff55f3f330a200dfb412b8dae21bbabf8fecf8d1b6626e47560c8dc9190a4505050565b60055460ff1681565b60001981565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109ac918590610d3a908663ffffffff6121c916565b611efd565b806001600160a01b038116610d89576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610d9a60073363ffffffff611e9616565b610dd55760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0382166000818152600b60205260408082208290555190919033907fb52d7c619ff55f3f330a200dfb412b8dae21bbabf8fecf8d1b6626e47560c8dc908490a45050565b6000918252600d6020908152604080842092845291905290205490565b610e4e60063363ffffffff611e9616565b610e895760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b600f805460ff19169055604080513381526000602082015281517f0d7fd1e314b29407db3d79c46ecf1fa3d2108961fab8d20584277358cac41e89929181900390910190a1565b816001600160a01b038116610f1a576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610f2b60063363ffffffff611e9616565b610f665760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b600854610f7a610f74610aaf565b846121c9565b1115610fb75760405162461bcd60e51b815260040180806020018281038252602a815260200180612853602a913960400191505060405180910390fd5b610fc1838361222a565b505050565b6001600160a01b039182166000908152600c60208181526040808420548452600d825280842094909516835290815283822054825291909152205490565b806001600160a01b03811661104e576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61105f60063363ffffffff611e9616565b61109a5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6110ab60078363ffffffff61231a16565b604080516020808252600d908201526c2a3930b739b332b920b236b4b760991b8183015290516001916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b846001600160a01b038116611148576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61115960073363ffffffff611e9616565b6111945760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b61119e8686611427565b6111a88685610c0e565b6111b28684611703565b6111bc8683611a58565b505050505050565b806001600160a01b03811661120e576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61121f60063363ffffffff611e9616565b61125a5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b61126b60068363ffffffff61231a16565b60095461127f90600163ffffffff6121c916565b600955604080516020808252600d908201526c21b7b73a3930b1ba20b236b4b760991b8183015290516001916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b806001600160a01b03811661131f576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61133060063363ffffffff611e9616565b61136b5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6001600954116113ac5760405162461bcd60e51b81526004018080602001828103825260258152602001806126d56025913960400191505060405180910390fd5b6113bd60068363ffffffff611fe916565b6009546113d190600163ffffffff61239b16565b600955604080516020808252600d908201526c21b7b73a3930b1ba20b236b4b760991b8183015290516000916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b816001600160a01b038116611471576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61148260073363ffffffff611e9616565b6114bd5760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0383166000818152600c60205260408082208590555184929133917ff213aa445739b8d5bb514c5e3142fe13baacfa991314172ceaf756996259b8b39190a4505050565b6001600160a01b031660009081526020819052604090205490565b60055460408051637f4ab1dd60e01b815260ff84166004820152905160609261010090046001600160a01b031691637f4ab1dd916024808301926000929190829003018186803b15801561157657600080fd5b505afa15801561158a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156115b357600080fd5b81019080805160405193929190846401000000008211156115d357600080fd5b9083019060208201858111156115e857600080fd5b825164010000000081118282018810171561160257600080fd5b82525081516020918201929091019080838360005b8381101561162f578181015183820152602001611617565b50505050905090810190601f16801561165c5780820380516001836020036101000a031916815260200191505b506040525050509050919050565b61167b60063363ffffffff611e9616565b6116b65760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b600f805460ff1916600190811790915560408051338152602081019290925280517f0d7fd1e314b29407db3d79c46ecf1fa3d2108961fab8d20584277358cac41e899281900390910190a1565b816001600160a01b03811661174d576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61175e60073363ffffffff611e9616565b6117995760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0383166000818152600a60205260408082208590555184929133917f0765aaf231b09368f07b83425559b145d7d386b1ff8f16c157a2ff2c7b9896fe9190a4505050565b60095481565b6003805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561097c5780601f106109515761010080835404028352916020019161097c565b60006108f060078363ffffffff611e9616565b816001600160a01b0381166118a2576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b6118b360063363ffffffff611e9616565b6118ee5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6118f783611508565b82111561194b576040805162461bcd60e51b815260206004820152601a60248201527f496e737566666963656e7420746f6b656e7320746f206275726e000000000000604482015290519081900360640190fd5b610fc183836123f8565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109ac918590610d3a908663ffffffff61239b16565b6000826001600160a01b0381166119dd576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b6119e633611508565b831115611a2f576040805162461bcd60e51b8152602060048201526012602482015271496e737566666963656e7420746f6b656e7360701b604482015290519081900360640190fd5b611a3a338585612050565b611a4484846124d1565b506001949350505050565b600f5460ff1681565b816001600160a01b038116611aa2576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b611ab360063363ffffffff611e9616565b80611aca5750611aca60073363ffffffff611e9616565b611b055760405162461bcd60e51b81526004018080602001828103825260338152602001806126fa6033913960400191505060405180910390fd5b6001600160a01b0383166000818152600e6020526040808220805460ff1916861515908117909155905190929133917f17ec2643977f0865dd45350e9efdcdfead258c9220974e67d1a37ca1447722939190a4505050565b6001600160a01b03166000908152600a602052604090205490565b60055461010090046001600160a01b031681565b6005546040805163cfdb31a960e01b81523060048201526001600160a01b038681166024830152858116604483015260648201859052915160009361010090049092169163cfdb31a991608480820192602092909190829003018186803b158015611bf657600080fd5b505afa158015611c0a573d6000803e3d6000fd5b505050506040513d6020811015611c2057600080fd5b5051949350505050565b6001600160a01b03166000908152600c602052604090205490565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611c8160063363ffffffff611e9616565b611cbc5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6001600160a01b038116611d05576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b600580546001600160a01b03838116610100818102610100600160a81b03198516179094556040805133815294909304919091166020840181905283830191909152905190917f8c78349fc44add47ae711ddc6e926b7845597c57473e587420693d8d0547845a919081900360600190a15050565b611d8b60073363ffffffff611e9616565b611dc65760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6000838152600d60209081526040808320858452825291829020839055815183815291518492869233927f5845e315015ee03f0d4ab1d198172b4f733609dc3de8b957ae1d86c8740301899281900390910190a4505050565b801580611e335750611e313383611c45565b155b611e6e5760405162461bcd60e51b815260040180806020018281038252603281526020018061261d6032913960400191505060405180910390fd5b610fc1828261099f565b6001600160a01b03166000908152600e602052604090205460ff1690565b60006001600160a01b038216611edd5760405162461bcd60e51b815260040180806020018281038252602281526020018061274e6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b038316611f425760405162461bcd60e51b81526004018080602001828103825260248152602001806127f76024913960400191505060405180910390fd5b6001600160a01b038216611f875760405162461bcd60e51b81526004018080602001828103825260228152602001806126926022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b611ff38282611e96565b61202e5760405162461bcd60e51b815260040180806020018281038252602181526020018061272d6021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b600061205d848484611b8c565b60055460408051637d8e7d1b60e01b815260ff8416600482015290519293506101009091046001600160a01b031691637d8e7d1b91602480820192602092909190829003018186803b1580156120b257600080fd5b505afa1580156120c6573d6000803e3d6000fd5b505050506040513d60208110156120dc57600080fd5b50516120e782611523565b906121705760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561213557818101518382015260200161211d565b50505050905090810190601f1680156121625780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505050565b60006121848484846124da565b6001600160a01b0384166000908152600160209081526040808320338085529252909120546121bf918691610d3a908663ffffffff61239b16565b5060019392505050565b600082820183811015612223576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216612285576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254612298908263ffffffff6121c916565b6002556001600160a01b0382166000908152602081905260409020546122c4908263ffffffff6121c916565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6123248282611e96565b15612376576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000828211156123f2576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03821661243d5760405162461bcd60e51b81526004018080602001828103825260218152602001806127916021913960400191505060405180910390fd5b600254612450908263ffffffff61239b16565b6002556001600160a01b03821660009081526020819052604090205461247c908263ffffffff61239b16565b6001600160a01b038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b60006109ac3384845b6001600160a01b03831661251f5760405162461bcd60e51b81526004018080602001828103825260258152602001806127d26025913960400191505060405180910390fd5b6001600160a01b0382166125645760405162461bcd60e51b815260040180806020018281038252602381526020018061264f6023913960400191505060405180910390fd5b6001600160a01b03831660009081526020819052604090205461258d908263ffffffff61239b16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546125c2908263ffffffff6121c916565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a350505056fe43616e6e6f7420617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a207472616e7366657220746f20746865207a65726f2061646472657373416464726573732063616e6e6f7420626520307830000000000000000000000045524332303a20617070726f766520746f20746865207a65726f2061646472657373444f4553204e4f54204841564520434f4e5452414354204f574e455220524f4c454d7573742068617665206174206c65617374206f6e6520636f6e74726163742061646d696e444f4553204e4f542048415645205452414e534645522041444d494e204f5220434f4e54524143542041444d494e20524f4c45526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373444f4553204e4f542048415645205452414e534645522041444d494e20524f4c4545524332303a206275726e2066726f6d20746865207a65726f2061646472657373b8d6abb0a3f68d78d33d9d0a174f38ab8806c36318ade20e0eff6b585c8d413b45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737354686520617070726f76656420616c6c6f77616e6365206973206c6f776572207468616e20746865207472616e7366657220616d6f756e7443616e6e6f74206d696e74206d6f7265207468616e20746865206d617820746f74616c20737570706c79a265627a7a72315820ccfbc6e4dd4827747e21570ea618016582b01d4b9bb253a408ff0135733064a964736f6c634300050c0032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005b097a5f2d5579912494dbbeef8c0c1c8e1fe170000000000000000000000000fb87c53b7770b451a5f193fe9e954d87d2872855000000000000000000000000a153dd6e4725c94066a7aa3425a3a737cfaf7c1200000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000052b7d2dcc80cd2e400000000000000000000000000000000000000000000000052b7d2dcc80cd2e4000000000000000000000000000000000000000000000000000000000000000000000758595a546573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000155265737472696374656420546f6b656e20546573740000000000000000000000
-----Decoded View---------------
Arg [0] : transferRules_ (address): 0x5B097a5F2d5579912494DBBeEf8C0c1C8e1fe170
Arg [1] : contractAdmin_ (address): 0xFB87c53b7770b451A5F193fe9E954d87d2872855
Arg [2] : tokenReserveAdmin_ (address): 0xA153Dd6e4725C94066A7AA3425a3A737CFaf7c12
Arg [3] : symbol_ (string): XYZTest
Arg [4] : name_ (string): Restricted Token Test
Arg [5] : decimals_ (uint8): 18
Arg [6] : totalSupply_ (uint256): 100000000000000000000000000
Arg [7] : maxTotalSupply_ (uint256): 100000000000000000000000000
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000005b097a5f2d5579912494dbbeef8c0c1c8e1fe170
Arg [1] : 000000000000000000000000fb87c53b7770b451a5f193fe9e954d87d2872855
Arg [2] : 000000000000000000000000a153dd6e4725c94066a7aa3425a3a737cfaf7c12
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [6] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [7] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [9] : 58595a5465737400000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [11] : 5265737472696374656420546f6b656e20546573740000000000000000000000
Deployed Bytecode Sourcemap
16913:17347:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16913:17347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22787:129;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22787:129:0;-1:-1:-1;;;;;22787:129:0;;:::i;:::-;;;;;;;;;;;;;;;;;;17010:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;17010:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26543:113;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26543:113:0;-1:-1:-1;;;;;26543:113:0;;:::i;:::-;;;;;;;;;;;;;;;;11171:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11171:148:0;;;;;;;;:::i;20907:195::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20907:195:0;-1:-1:-1;;;;;20907:195:0;;:::i;:::-;;10194:91;;;:::i;33389:411::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;33389:411:0;;;;;;;;;;;;;;;;;:::i;17212:29::-;;;:::i;25637:197::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25637:197:0;;;;;;;;:::i;17033:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17980:62;;;:::i;12455:206::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12455:206:0;;;;;;;;:::i;26094:166::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26094:166:0;-1:-1:-1;;;;;26094:166:0;;:::i;31038:143::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31038:143:0;;;;;;;:::i;32376:113::-;;;:::i;31908:229::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31908:229:0;;;;;;;;:::i;30457:178::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30457:178:0;;;;;;;;;;:::i;20577:189::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20577:189:0;-1:-1:-1;;;;;20577:189:0;;:::i;28855:316::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;28855:316:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21727:242::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21727:242:0;-1:-1:-1;;;;;21727:242:0;;:::i;22213:326::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22213:326:0;-1:-1:-1;;;;;22213:326:0;;:::i;26869:204::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26869:204:0;;;;;;;;:::i;10348:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10348:110:0;-1:-1:-1;;;;;10348:110:0;;:::i;24426:177::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24426:177:0;;;;:::i;32201:109::-;;;:::i;24858:210::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24858:210:0;;;;;;;;:::i;17246:33::-;;;:::i;16985:20::-;;;:::i;21350:129::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21350:129:0;-1:-1:-1;;;;;21350:129:0;;:::i;31445:190::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31445:190:0;;;;;;;;:::i;13164:216::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13164:216:0;;;;;;;;:::i;33111:272::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;33111:272:0;;;;;;;;:::i;17945:28::-;;;:::i;27668:198::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27668:198:0;;;;;;;;;;:::i;25207:106::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25207:106:0;-1:-1:-1;;;;;25207:106:0;;:::i;17059:35::-;;;:::i;:::-;;;;-1:-1:-1;;;;;17059:35:0;;;;;;;;;;;;;;24048:194;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24048:194:0;;;;;;;;;;;;;;;;;:::i;27256:120::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27256:120:0;-1:-1:-1;;;;;27256:120:0;;:::i;10890:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10890:134:0;;;;;;;;;;:::i;32772:333::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32772:333:0;-1:-1:-1;;;;;32772:333:0;;:::i;29826:227::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29826:227:0;;;;;;;;;;;;:::i;33806:451::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;33806:451:0;;;;;;;;:::i;28066:116::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28066:116:0;-1:-1:-1;;;;;28066:116:0;;:::i;22787:129::-;22851:18;22885:25;:15;22905:4;22885:25;:19;:25;:::i;:::-;22878:32;22787:129;-1:-1:-1;;22787:129:0:o;17010:18::-;;;;;;;;;;;;;;;-1:-1:-1;;17010:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26543:113::-;-1:-1:-1;;;;;26634:16:0;26601:17;26634:16;;;:10;:16;;;;;;;26543:113::o;11171:148::-;11236:4;11253:36;11262:10;11274:7;11283:5;11253:8;:36::i;:::-;-1:-1:-1;11307:4:0;11171:148;;;;:::o;20907:195::-;20972:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21004:28;:15;21027:4;21004:28;:22;:28;:::i;:::-;21044:52;;;;;;;;;;;;-1:-1:-1;;;21044:52:0;;;;;;21090:5;;-1:-1:-1;;;;;21044:52:0;;;21055:10;;-1:-1:-1;;;;;;;;;;;21044:52:0;;;;;;;;;20907:195;;:::o;10194:91::-;10265:12;;10194:91;:::o;33389:411::-;33503:12;33472:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;33491:2;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;33541:19;33551:4;33557:2;33541:9;:19::i;:::-;33532:5;:28;;33524:97;;;;-1:-1:-1;;;33524:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33645:15;33655:4;33645:9;:15::i;:::-;33636:5;:24;;33628:55;;;;;-1:-1:-1;;;33628:55:0;;;;;;;;;;;;-1:-1:-1;;;33628:55:0;;;;;;;;;;;;;;;33690:44;33718:4;33724:2;33728:5;33690:27;:44::i;:::-;33741:35;33760:4;33766:2;33770:5;33741:18;:35::i;:::-;-1:-1:-1;33790:4:0;;33389:411;-1:-1:-1;;;;;;33389:411:0:o;17212:29::-;;;;:::o;25637:197::-;25712:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;20023:31;:15;20043:10;20023:31;:19;:31;:::i;:::-;20015:77;;;;-1:-1:-1;;;20015:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25744:16:0;;;;;;:10;:16;;;;;;:28;;;25784:44;25763:9;;25744:16;25800:10;;25784:44;;25744:16;25784:44;25637:197;;;:::o;17033:21::-;;;;;;:::o;17980:62::-;-1:-1:-1;;17980:62:0;:::o;12455:206::-;12561:10;12535:4;12582:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;12582:32:0;;;;;;;;;;12535:4;;12552:79;;12573:7;;12582:48;;12619:10;12582:48;:36;:48;:::i;:::-;12552:8;:79::i;26094:166::-;26155:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;20023:31;:15;20043:10;20023:31;:19;:31;:::i;:::-;20015:77;;;;-1:-1:-1;;;20015:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26186:16:0;;26205:1;26186:16;;;:10;:16;;;;;;:20;;;26218:36;26205:1;;26186:16;26234:10;;26218:36;;26205:1;;26218:36;26094:166;;:::o;31038:143::-;31115:14;31145:26;;;:20;:26;;;;;;;;:30;;;;;;;;;;31038:143::o;32376:113::-;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32431:8;:16;;-1:-1:-1;;32431:16:0;;;32459:24;;;32465:10;32459:24;;32442:5;32459:24;;;;;;;;;;;;;;;;;32376:113::o;31908:229::-;31971:2;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32047:14;;32009:34;32022:13;:11;:13::i;:::-;32037:5;32009:12;:34::i;:::-;:52;;32001:107;;;;-1:-1:-1;;;32001:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32115:16;32121:2;32125:5;32115;:16::i;:::-;31908:229;;;:::o;30457:178::-;-1:-1:-1;;;;;30586:21:0;;;30535:14;30586:21;;;:15;:21;;;;;;;;;30565:43;;:20;:43;;;;;30609:19;;;;;;;;;;;;;30565:64;;;;;;;;;30457:178::o;20577:189::-;20641:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20672:25;:15;20692:4;20672:25;:19;:25;:::i;:::-;20709:51;;;;;;;;;;;;-1:-1:-1;;;20709:51:0;;;;;;20755:4;;-1:-1:-1;;;;;20709:51:0;;;20720:10;;-1:-1:-1;;;;;;;;;;;20709:51:0;;;;;;;;;20577:189;;:::o;28855:316::-;28998:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;20023:31;:15;20043:10;20023:31;:19;:31;:::i;:::-;20015:77;;;;-1:-1:-1;;;20015:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29029:31;29046:4;29052:7;29029:16;:31::i;:::-;29067:33;29080:4;29086:13;29067:12;:33::i;:::-;29107:31;29121:4;29127:10;29107:13;:31::i;:::-;29145:20;29152:4;29158:6;29145;:20::i;:::-;28855:316;;;;;;:::o;21727:242::-;21791:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21822:25;:15;21842:4;21822:25;:19;:25;:::i;:::-;21875:18;;:25;;21898:1;21875:25;:22;:25;:::i;:::-;21854:18;:46;21912:51;;;;;;;;;;;;-1:-1:-1;;;21912:51:0;;;;;;21958:4;;-1:-1:-1;;;;;21912:51:0;;;21923:10;;-1:-1:-1;;;;;;;;;;;21912:51:0;;;;;;;;;21727:242;;:::o;22213:326::-;22278:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22338:1;22317:18;;:22;22309:72;;;;-1:-1:-1;;;22309:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22388:28;:15;22411:4;22388:28;:22;:28;:::i;:::-;22444:18;;:25;;22467:1;22444:25;:22;:25;:::i;:::-;22423:18;:46;22481:52;;;;;;;;;;;;-1:-1:-1;;;22481:52:0;;;;;;22527:5;;-1:-1:-1;;;;;22481:52:0;;;22492:10;;-1:-1:-1;;;;;;;;;;;22481:52:0;;;;;;;;;22213:326;;:::o;26869:204::-;26946:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;20023:31;:15;20043:10;20023:31;:19;:31;:::i;:::-;20015:77;;;;-1:-1:-1;;;20015:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26977:21:0;;;;;;:15;:21;;;;;;:31;;;27020:47;27001:7;;26977:21;27041:10;;27020:47;;26977:21;27020:47;26869:204;;;:::o;10348:110::-;-1:-1:-1;;;;;10432:18:0;10405:7;10432:18;;;;;;;;;;;;10348:110::o;24426:177::-;24537:13;;:60;;;-1:-1:-1;;;24537:60:0;;;;;;;;;;;24508:13;;24537;;;-1:-1:-1;;;;;24537:13:0;;:43;;:60;;;;;-1:-1:-1;;24537:60:0;;;;;;;:13;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;24537:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24537:60:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;24537:60:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;24537:60:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;24537:60:0;;420:4:-1;411:14;;;;24537:60:0;;;;;411:14:-1;24537:60:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24537:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24530:67;;24426:177;;;:::o;32201:109::-;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32254:8;:15;;-1:-1:-1;;32254:15:0;32265:4;32254:15;;;;;;32281:23;;;32287:10;32281:23;;;;;;;;;;;;;;;;;;;;;32201:109::o;24858:210::-;24937:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;20023:31;:15;20043:10;20023:31;:19;:31;:::i;:::-;20015:77;;;;-1:-1:-1;;;20015:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24968:18:0;;;;;;:12;:18;;;;;;:33;;;25013:49;24989:12;;24968:18;25031:10;;25013:49;;24968:18;25013:49;24858:210;;;:::o;17246:33::-;;;;:::o;16985:20::-;;;;;;;;;;;;;;;-1:-1:-1;;16985:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21350:129;21414:18;21448:25;:15;21468:4;21448:25;:19;:25;:::i;31445:190::-;31510:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31558:15;31568:4;31558:9;:15::i;:::-;31549:5;:24;;31541:63;;;;;-1:-1:-1;;;31541:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31611:18;31617:4;31623:5;31611;:18::i;13164:216::-;13275:10;13249:4;13296:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;13296:32:0;;;;;;;;;;13249:4;;13266:84;;13287:7;;13296:53;;13333:15;13296:53;:36;:53;:::i;33111:272::-;33188:12;33176:2;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;33226:21;33236:10;33226:9;:21::i;:::-;33217:5;:30;;33209:61;;;;;-1:-1:-1;;;33209:61:0;;;;;;;;;;;;-1:-1:-1;;;33209:61:0;;;;;;;;;;;;;;;33277:50;33305:10;33317:2;33321:5;33277:27;:50::i;:::-;33334:25;33349:2;33353:5;33334:14;:25::i;:::-;-1:-1:-1;33373:4:0;;33111:272;-1:-1:-1;;;;33111:272:0:o;17945:28::-;;;;;;:::o;27668:198::-;27731:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;20172:31;:15;20192:10;20172:31;:19;:31;:::i;:::-;:66;;;-1:-1:-1;20207:31:0;:15;20227:10;20207:31;:19;:31;:::i;:::-;20163:137;;;;-1:-1:-1;;;20163:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27778:22:0;;;;;;:16;:22;;;;;;:31;;-1:-1:-1;;27778:31:0;;;;;;;;;;27821:39;;27778:31;;:22;27835:10;;27821:39;;27778:22;27821:39;27668:198;;;:::o;25207:106::-;-1:-1:-1;;;;;25289:18:0;25266:7;25289:18;;;:12;:18;;;;;;;25207:106::o;17059:35::-;;;;;;-1:-1:-1;;;;;17059:35:0;;:::o;24048:194::-;24165:13;;:71;;;-1:-1:-1;;;24165:71:0;;24213:4;24165:71;;;;-1:-1:-1;;;;;24165:71:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24165:13:0;;;;;;;:39;;:71;;;;;;;;;;;;;;;:13;:71;;;5:2:-1;;;;30:1;27;20:12;5:2;24165:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24165:71:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24165:71:0;;24048:194;-1:-1:-1;;;;24048:194:0:o;27256:120::-;-1:-1:-1;;;;;27349:21:0;27318:15;27349:21;;;:15;:21;;;;;;;27256:120::o;10890:134::-;-1:-1:-1;;;;;10989:18:0;;;10962:7;10989:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10890:134::o;32772:333::-;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32877:41:0;;32869:75;;;;;-1:-1:-1;;;32869:75:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32869:75:0;;;;;;;;;;;;;;;32978:13;;;-1:-1:-1;;;;;32999:32:0;;;32978:13;32999:32;;;-1:-1:-1;;;;;;32999:32:0;;;;;;33043:56;;;33051:10;33043:56;;32978:13;;;;;;;;33043:56;;;;;;;;;;;;;;;32978:13;;33043:56;;;;;;;;;;19965:1;32772:333;:::o;29826:227::-;20023:31;:15;20043:10;20023:31;:19;:31;:::i;:::-;20015:77;;;;-1:-1:-1;;;20015:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29938:26;;;;:20;:26;;;;;;;;:30;;;;;;;;;:44;;;29994:53;;;;;;;29965:2;;29959:4;;30013:10;;29994:53;;;;;;;;;;29826:227;;;:::o;33806:451::-;34090:10;;;34089:62;;;34106:39;34124:10;34137:7;34106:9;:39::i;:::-;:44;34089:62;34081:140;;;;-1:-1:-1;;;34081:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34228:23;34236:7;34245:5;34228:7;:23::i;28066:116::-;-1:-1:-1;;;;;28154:22:0;28127:11;28154:22;;;:16;:22;;;;;;;;;28066:116::o;1866:203::-;1938:4;-1:-1:-1;;;;;1963:21:0;;1955:68;;;;-1:-1:-1;;;1955:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2041:20:0;:11;:20;;;;;;;;;;;;;;;1866:203::o;15966:335::-;-1:-1:-1;;;;;16059:19:0;;16051:68;;;;-1:-1:-1;;;16051:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16138:21:0;;16130:68;;;;-1:-1:-1;;;16130:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16211:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;16262:31;;;;;;;;;;;;;;;;;15966:335;;;:::o;1588:183::-;1668:18;1672:4;1678:7;1668:3;:18::i;:::-;1660:64;;;;-1:-1:-1;;;1660:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1735:20:0;1758:5;1735:20;;;;;;;;;;;:28;;-1:-1:-1;;1735:28:0;;;1588:183::o;23408:277::-;23506:21;23530:42;23556:4;23562:2;23566:5;23530:25;:42::i;:::-;23587:13;;:43;;;-1:-1:-1;;;23587:43:0;;;;;;;;;;;;;-1:-1:-1;23587:13:0;;;;-1:-1:-1;;;;;23587:13:0;;:26;;:43;;;;;;;;;;;;;;;:13;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;23587:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23587:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23587:43:0;23632:46;23662:15;23632:29;:46::i;:::-;23579:100;;;;;-1:-1:-1;;;23579:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;23579:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23408:277;;;;:::o;11790:256::-;11879:4;11896:36;11906:6;11914:9;11925:6;11896:9;:36::i;:::-;-1:-1:-1;;;;;11972:19:0;;;;;;:11;:19;;;;;;;;11960:10;11972:31;;;;;;;;;11943:73;;11952:6;;11972:43;;12008:6;11972:43;:35;:43;:::i;11943:73::-;-1:-1:-1;12034:4:0;11790:256;;;;;:::o;5860:181::-;5918:7;5950:5;;;5974:6;;;;5966:46;;;;;-1:-1:-1;;;5966:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6032:1;5860:181;-1:-1:-1;;;5860:181:0:o;14580:308::-;-1:-1:-1;;;;;14656:21:0;;14648:65;;;;;-1:-1:-1;;;14648:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14741:12;;:24;;14758:6;14741:24;:16;:24;:::i;:::-;14726:12;:39;-1:-1:-1;;;;;14797:18:0;;:9;:18;;;;;;;;;;;:30;;14820:6;14797:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;14776:18:0;;:9;:18;;;;;;;;;;;:51;;;;14843:37;;;;;;;14776:18;;:9;;14843:37;;;;;;;;;;14580:308;;:::o;1330:178::-;1408:18;1412:4;1418:7;1408:3;:18::i;:::-;1407:19;1399:63;;;;;-1:-1:-1;;;1399:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1473:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;1473:27:0;1496:4;1473:27;;;1330:178::o;6316:184::-;6374:7;6407:1;6402;:6;;6394:49;;;;;-1:-1:-1;;;6394:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6466:5:0;;;6316:184::o;15220:306::-;-1:-1:-1;;;;;15295:21:0;;15287:67;;;;-1:-1:-1;;;15287:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15382:12;;:23;;15399:5;15382:23;:16;:23;:::i;:::-;15367:12;:38;-1:-1:-1;;;;;15437:18:0;;:9;:18;;;;;;;;;;;:29;;15460:5;15437:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;15416:18:0;;:9;:18;;;;;;;;;;;:50;;;;15482:36;;;;;;;15416:9;;15482:36;;;;;;;;;;;15220:306;;:::o;10671:156::-;10740:4;10757:40;10767:10;10779:9;10790:6;13870:429;-1:-1:-1;;;;;13968:20:0;;13960:70;;;;-1:-1:-1;;;13960:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14049:23:0;;14041:71;;;;-1:-1:-1;;;14041:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14145:17:0;;:9;:17;;;;;;;;;;;:29;;14167:6;14145:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;14125:17:0;;;:9;:17;;;;;;;;;;;:49;;;;14208:20;;;;;;;:32;;14233:6;14208:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;14185:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;14256:35;;;;;;;14185:20;;14256:35;;;;;;;;;;;;;13870:429;;;:::o
Swarm Source
bzzr://ccfbc6e4dd4827747e21570ea618016582b01d4b9bb253a408ff0135733064a9
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.