Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- USDN
- Optimization enabled
- true
- Compiler version
- v0.6.8+commit.0bbfe453
- Optimization runs
- 200
- EVM Version
- istanbul
- Verified at
- 2026-02-20T14:53:22.913977Z
USDN.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.8;
interface Staking {
function deposit(address account, uint256 amount) external returns (bool);
function withdraw(address account) external returns (bool);
function stake(uint256 reward) external returns (bool);
event Reward(uint256 id, uint256 amount);
}
interface ERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);
function transfer(address recipient, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
abstract contract Ownable {
address private _owner;
address private _admin;
constructor () public {
_owner = msg.sender;
_admin = msg.sender;
}
modifier onlyOwner() {
require(_owner == msg.sender || _admin == msg.sender, "Ownable: caller is not the owner or admin");
_;
}
function transferOwnership(address newOwner) external virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_owner = newOwner;
}
}
abstract contract Deprecateble is Ownable {
bool internal deprecated;
modifier onlyNotDeprecated() {
require(!deprecated, "Deprecateble: contract is deprecated");
_;
}
function deprecate() external onlyOwner {
deprecated = true;
emit Deprecate(msg.sender);
}
event Deprecate(address indexed account);
}
abstract contract StandartToken is Staking, ERC20, Ownable, Deprecateble {
uint256[] private _percents;
uint256 private _liquidTotalSupply;
uint256 private _liquidDeposit;
uint256 constant private PERCENT_FACTOR = 10 ** 12;
mapping(address => uint256) private _balances;
mapping(address => uint256) private _deposits;
mapping(address => uint256) private _rewardIndexForAccount;
mapping(address => mapping(address => uint256)) private _allowances;
constructor () public {
_percents.push(PERCENT_FACTOR);
}
function deposit(address account, uint256 amount) external onlyOwner onlyNotDeprecated override virtual returns (bool) {
require(amount > 0, "amount should be > 0");
require(account != address(0), "deposit to the zero address");
uint256 liquidDeposit = _liquidDeposit;
require(liquidDeposit + amount >= liquidDeposit, "addition overflow for deposit");
_liquidDeposit = liquidDeposit + amount;
uint256 oldDeposit = _deposits[account];
if (oldDeposit == 0) {
_balances[account] = balanceOf(account);
_rewardIndexForAccount[account] = _percents.length - 1;
_deposits[account] = amount;
} else {
uint256 rewardIndex = _rewardIndexForAccount[account];
if (rewardIndex == _percents.length - 1) {
require(oldDeposit + amount >= oldDeposit, "addition overflow for deposit");
_deposits[account] = oldDeposit + amount;
} else {
_balances[account] = balanceOf(account);
_rewardIndexForAccount[account] = _percents.length - 1;
_deposits[account] = amount;
}
}
emit Transfer(address(0), account, amount);
return true;
}
function stake(uint256 reward) external onlyOwner onlyNotDeprecated override virtual returns (bool) {
require(reward > 0, "reward should be > 0");
uint256 liquidTotalSupply = _liquidTotalSupply;
uint256 liquidDeposit = _liquidDeposit;
if (liquidTotalSupply == 0) {
_percents.push(PERCENT_FACTOR);
} else {
uint256 oldPercent = _percents[_percents.length - 1];
uint256 percent = reward * PERCENT_FACTOR / liquidTotalSupply;
require(percent + PERCENT_FACTOR >= percent, "addition overflow for percent");
uint256 newPercent = percent + PERCENT_FACTOR;
_percents.push(newPercent * oldPercent / PERCENT_FACTOR);
require(liquidTotalSupply + reward >= liquidTotalSupply, "addition overflow for total supply + reward");
liquidTotalSupply = liquidTotalSupply + reward;
}
require(liquidTotalSupply + liquidDeposit >= liquidTotalSupply, "addition overflow for total supply");
_liquidTotalSupply = liquidTotalSupply + liquidDeposit;
_liquidDeposit = 0;
emit Reward(_percents.length, reward);
return true;
}
function withdraw(address account) external onlyOwner onlyNotDeprecated override virtual returns (bool) {
uint256 oldDeposit = _deposits[account];
uint256 rewardIndex = _rewardIndexForAccount[account];
if (rewardIndex == _percents.length - 1) {
uint256 balance = _balances[account];
require(balance <= _liquidTotalSupply, "subtraction overflow for total supply");
_liquidTotalSupply = _liquidTotalSupply - balance;
require(oldDeposit <= _liquidDeposit, "subtraction overflow for liquid deposit");
_liquidDeposit = _liquidDeposit - oldDeposit;
require(balance + oldDeposit >= balance, "addition overflow for total balance + oldDeposit");
emit Transfer(account, address(0), balance + oldDeposit);
} else {
uint256 balance = balanceOf(account);
uint256 liquidTotalSupply = _liquidTotalSupply;
require(balance <= liquidTotalSupply, "subtraction overflow for total supply");
_liquidTotalSupply = liquidTotalSupply - balance;
emit Transfer(account, address(0), balance);
}
_balances[account] = 0;
_deposits[account] = 0;
return true;
}
// ERC20
function totalSupply() external view override virtual returns (uint256) {
uint256 liquidTotalSupply = _liquidTotalSupply;
uint256 liquidDeposit = _liquidDeposit;
require(liquidTotalSupply + liquidDeposit >= liquidTotalSupply, "addition overflow for total supply");
return liquidTotalSupply + liquidDeposit;
}
function balanceOf(address account) public view override virtual returns (uint256) {
uint256 balance = _balances[account];
uint256 oldDeposit = _deposits[account];
if (balance == 0 && oldDeposit == 0) {
return 0;
}
uint256 rewardIndex = _rewardIndexForAccount[account];
if (rewardIndex == _percents.length - 1) {
require(balance + oldDeposit >= balance, "addition overflow for balance");
return balance + oldDeposit;
}
if (oldDeposit == 0) {
uint256 profit = _percents[_percents.length - 1];
return profit * balance / _percents[rewardIndex];
} else {
uint256 newBalance = balance * _percents[_percents.length - 1] / _percents[rewardIndex];
uint256 profit = oldDeposit * _percents[_percents.length - 1] / _percents[rewardIndex + 1];
require(profit + newBalance >= newBalance, "addition overflow for balance");
return profit + newBalance;
}
}
function allowance(address owner, address spender) external view override virtual returns (uint256) {
return _allowances[owner][spender];
}
function _approve(address owner, address spender, uint256 amount) internal onlyNotDeprecated virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function approve(address spender, uint256 amount) external override virtual returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) external override virtual returns (bool) {
uint256 temp = _allowances[msg.sender][spender];
require(temp + addedValue >= temp, "addition overflow");
_approve(msg.sender, spender, temp + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) external override virtual returns (bool) {
uint256 temp = _allowances[msg.sender][spender];
require(subtractedValue <= temp, "ERC20: decreased allowance below zero");
_approve(msg.sender, spender, temp - subtractedValue);
return true;
}
function transfer(address recipient, uint256 amount) external override virtual returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) external override virtual returns (bool) {
_transfer(sender, recipient, amount);
uint256 temp = _allowances[sender][msg.sender];
require(amount <= temp, "ERC20: transfer amount exceeds allowance");
_approve(sender, msg.sender, temp - amount);
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal onlyNotDeprecated virtual {
require(amount > 0, "amount should be > 0");
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
uint256 oldDeposit = _deposits[sender];
uint256 rewardIndex = _rewardIndexForAccount[sender];
uint256 depositDiff = 0;
if (oldDeposit == 0 || rewardIndex != _percents.length - 1) {
uint256 senderBalance = balanceOf(sender);
require(amount <= senderBalance, "ERC20: transfer amount exceeds balance");
_balances[sender] = senderBalance - amount;
_deposits[sender] = 0;
_rewardIndexForAccount[sender] = _percents.length - 1;
} else {
if (amount <= oldDeposit) {
_deposits[sender] = oldDeposit - amount;
depositDiff = amount;
} else {
uint256 senderBalance = _balances[sender];
require(amount - oldDeposit <= senderBalance, "ERC20: transfer amount exceeds balance");
_balances[sender] = senderBalance - (amount - oldDeposit);
_deposits[sender] = 0;
depositDiff = oldDeposit;
}
}
oldDeposit = _deposits[recipient];
rewardIndex = _rewardIndexForAccount[recipient];
if (oldDeposit == 0 || rewardIndex != _percents.length - 1) {
uint256 recipientBalance = balanceOf(recipient);
require((amount - depositDiff) + recipientBalance >= recipientBalance, "ERC20: addition overflow for recipient balance");
_balances[recipient] = recipientBalance + (amount - depositDiff);
_rewardIndexForAccount[recipient] = _percents.length - 1;
_deposits[recipient] = depositDiff;
} else {
uint256 recipientBalance = _balances[recipient];
_balances[recipient] = recipientBalance + (amount - depositDiff);
_deposits[recipient] = oldDeposit + depositDiff;
}
emit Transfer(sender, recipient, amount);
}
}
contract USDN is StandartToken {
function name() external pure returns (string memory) {
return "Neutrino USD";
}
function symbol() external pure returns (string memory) {
return "USDN";
}
function decimals() external pure returns (uint8) {
return 18;
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"istanbul","compilationTarget":{"USDN.sol":"USDN"}}
Contract ABI
[{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Deprecate","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Reward","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"deposit","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deprecate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"stake","inputs":[{"type":"uint256","name":"reward","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"withdraw","inputs":[{"type":"address","name":"account","internalType":"address"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50600080546001600160a01b03199081163390811783556001805490921617815560028054918201815590915264e8d4a510007f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910155611a26806100776000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806351cff8d911610097578063a694fc3a11610066578063a694fc3a14610312578063a9059cbb1461032f578063dd62ed3e1461035b578063f2fde38b1461038957610100565b806351cff8d91461029257806370a08231146102b857806395d89b41146102de578063a457c2d7146102e657610100565b806323b872dd116100d357806323b872dd146101e6578063313ce5671461021c578063395093511461023a57806347e7ef241461026657610100565b806306fdde0314610105578063095ea7b3146101825780630fcc0c28146101c257806318160ddd146101cc575b600080fd5b61010d6103af565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561014757818101518382015260200161012f565b50505050905090810190601f1680156101745780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101ae6004803603604081101561019857600080fd5b506001600160a01b0381351690602001356103d5565b604080519115158252519081900360200190f35b6101ca6103eb565b005b6101d4610489565b60408051918252519081900360200190f35b6101ae600480360360608110156101fc57600080fd5b506001600160a01b038135811691602081013590911690604001356104da565b610224610562565b6040805160ff9092168252519081900360200190f35b6101ae6004803603604081101561025057600080fd5b506001600160a01b038135169060200135610567565b6101ae6004803603604081101561027c57600080fd5b506001600160a01b0381351690602001356105ed565b6101ae600480360360208110156102a857600080fd5b50356001600160a01b0316610920565b6101d4600480360360208110156102ce57600080fd5b50356001600160a01b0316610bdb565b61010d610de6565b6101ae600480360360408110156102fc57600080fd5b506001600160a01b038135169060200135610e04565b6101ae6004803603602081101561032857600080fd5b5035610e74565b6101ae6004803603604081101561034557600080fd5b506001600160a01b03813516906020013561114b565b6101d46004803603604081101561037157600080fd5b506001600160a01b0381358116916020013516611158565b6101ca6004803603602081101561039f57600080fd5b50356001600160a01b0316611183565b60408051808201909152600c81526b13995d5d1c9a5b9bc81554d160a21b602082015290565b60006103e2338484611248565b50600192915050565b6000546001600160a01b031633148061040e57506001546001600160a01b031633145b6104495760405162461bcd60e51b81526004018080602001828103825260298152602001806118806029913960400191505060405180910390fd5b6001805460ff60a01b1916600160a01b17905560405133907fcc358699805e9a8b7f77b522628c7cb9abd07d9efb86b6fb616af1609036a99e90600090a2565b600354600454600091908082018211156104d45760405162461bcd60e51b81526004018080602001828103825260228152602001806118f66022913960400191505060405180910390fd5b01905090565b60006104e784848461137d565b6001600160a01b03841660009081526008602090815260408083203384529091529020548083111561054a5760405162461bcd60e51b81526004018080602001828103825260288152602001806118a96028913960400191505060405180910390fd5b6105578533858403611248565b506001949350505050565b601290565b3360009081526008602090815260408083206001600160a01b03861684529091528120548281018111156105d6576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b6105e33385858401611248565b5060019392505050565b600080546001600160a01b031633148061061157506001546001600160a01b031633145b61064c5760405162461bcd60e51b81526004018080602001828103825260298152602001806118806029913960400191505060405180910390fd5b600154600160a01b900460ff16156106955760405162461bcd60e51b81526004018080602001828103825260248152602001806119cd6024913960400191505060405180910390fd5b600082116106e1576040805162461bcd60e51b81526020600482015260146024820152730616d6f756e742073686f756c64206265203e20360641b604482015290519081900360640190fd5b6001600160a01b03831661073c576040805162461bcd60e51b815260206004820152601b60248201527f6465706f73697420746f20746865207a65726f20616464726573730000000000604482015290519081900360640190fd5b600454828101811115610796576040805162461bcd60e51b815260206004820152601d60248201527f6164646974696f6e206f766572666c6f7720666f72206465706f736974000000604482015290519081900360640190fd5b8083016004556001600160a01b03841660009081526006602052604090205480610801576107c385610bdb565b6001600160a01b03861660009081526005602090815260408083209390935560025460078252838320600019909101905560069052208490556108e6565b6001600160a01b038516600090815260076020526040902054600254600019018114156108a15781858301101561087f576040805162461bcd60e51b815260206004820152601d60248201527f6164646974696f6e206f766572666c6f7720666f72206465706f736974000000604482015290519081900360640190fd5b6001600160a01b038616600090815260066020526040902082860190556108e4565b6108aa86610bdb565b6001600160a01b03871660009081526005602090815260408083209390935560025460078252838320600019909101905560069052208590555b505b6040805185815290516001600160a01b0387169160009160008051602061193f8339815191529181900360200190a3506001949350505050565b600080546001600160a01b031633148061094457506001546001600160a01b031633145b61097f5760405162461bcd60e51b81526004018080602001828103825260298152602001806118806029913960400191505060405180910390fd5b600154600160a01b900460ff16156109c85760405162461bcd60e51b81526004018080602001828103825260248152602001806119cd6024913960400191505060405180910390fd5b6001600160a01b03821660009081526006602090815260408083205460079092529091205460025460001901811415610b22576001600160a01b038416600090815260056020526040902054600354811115610a555760405162461bcd60e51b81526004018080602001828103825260258152602001806118d16025913960400191505060405180910390fd5b600380548290039055600454831115610a9f5760405162461bcd60e51b81526004018080602001828103825260278152602001806119186027913960400191505060405180910390fd5b8260045403600481905550808382011015610aeb5760405162461bcd60e51b81526004018080602001828103825260308152602001806117896030913960400191505060405180910390fd5b60408051828501815290516000916001600160a01b0388169160008051602061193f8339815191529181900360200190a350610baa565b6000610b2d85610bdb565b60035490915080821115610b725760405162461bcd60e51b81526004018080602001828103825260258152602001806118d16025913960400191505060405180910390fd5b8181036003556040805183815290516000916001600160a01b0389169160008051602061193f8339815191529181900360200190a350505b5050506001600160a01b0381166000908152600560209081526040808320839055600690915281205560015b919050565b6001600160a01b038116600090815260056020908152604080832054600690925282205481158015610c0b575080155b15610c1b57600092505050610bd6565b6001600160a01b03841660009081526007602052604090205460025460001901811415610ca257828284011015610c99576040805162461bcd60e51b815260206004820152601d60248201527f6164646974696f6e206f766572666c6f7720666f722062616c616e6365000000604482015290519081900360640190fd5b50019050610bd6565b81610cf85760028054600091906000198101908110610cbd57fe5b9060005260206000200154905060028281548110610cd757fe5b906000526020600020015484820281610cec57fe5b04945050505050610bd6565b600060028281548110610d0757fe5b600091825260209091200154600280546000198101908110610d2557fe5b9060005260206000200154850281610d3957fe5b049050600060028360010181548110610d4e57fe5b600091825260209091200154600280546000198101908110610d6c57fe5b9060005260206000200154850281610d8057fe5b049050818282011015610dda576040805162461bcd60e51b815260206004820152601d60248201527f6164646974696f6e206f766572666c6f7720666f722062616c616e6365000000604482015290519081900360640190fd5b019350610bd692505050565b6040805180820190915260048152632aa9a22760e11b602082015290565b3360009081526008602090815260408083206001600160a01b038616845290915281205480831115610e675760405162461bcd60e51b81526004018080602001828103825260258152602001806119a86025913960400191505060405180910390fd5b6105e33385858403611248565b600080546001600160a01b0316331480610e9857506001546001600160a01b031633145b610ed35760405162461bcd60e51b81526004018080602001828103825260298152602001806118806029913960400191505060405180910390fd5b600154600160a01b900460ff1615610f1c5760405162461bcd60e51b81526004018080602001828103825260248152602001806119cd6024913960400191505060405180910390fd5b60008211610f68576040805162461bcd60e51b815260206004820152601460248201527307265776172642073686f756c64206265203e20360641b604482015290519081900360640190fd5b60035460045481610fb3576002805460018101825560009190915264e8d4a510007f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101556110b8565b60028054600091906000198101908110610fc957fe5b9060005260206000200154905060008364e8d4a51000870281610fe857fe5b0490508064e8d4a5100082011015611047576040805162461bcd60e51b815260206004820152601d60248201527f6164646974696f6e206f766572666c6f7720666f722070657263656e74000000604482015290519081900360640190fd5b64e8d4a51000818101906002908483028254600181018455600093845260209093209190049101558685018511156110b05760405162461bcd60e51b815260040180806020018281038252602b815260200180611855602b913960400191505060405180910390fd5b505050908301905b8181830110156110f95760405162461bcd60e51b81526004018080602001828103825260228152602001806118f66022913960400191505060405180910390fd5b8181016003556000600455600254604080519182526020820186905280517f45cad8c10023de80f4c0672ff6c283b671e11aa93c92b9380cdf060d2790da529281900390910190a15060019392505050565b60006103e233848461137d565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6000546001600160a01b03163314806111a657506001546001600160a01b031633145b6111e15760405162461bcd60e51b81526004018080602001828103825260298152602001806118806029913960400191505060405180910390fd5b6001600160a01b0381166112265760405162461bcd60e51b81526004018080602001828103825260268152602001806117b96026913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600154600160a01b900460ff16156112915760405162461bcd60e51b81526004018080602001828103825260248152602001806119cd6024913960400191505060405180910390fd5b6001600160a01b0383166112d65760405162461bcd60e51b81526004018080602001828103825260248152602001806119846024913960400191505060405180910390fd5b6001600160a01b03821661131b5760405162461bcd60e51b81526004018080602001828103825260228152602001806117df6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260086020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600154600160a01b900460ff16156113c65760405162461bcd60e51b81526004018080602001828103825260248152602001806119cd6024913960400191505060405180910390fd5b60008111611412576040805162461bcd60e51b81526020600482015260146024820152730616d6f756e742073686f756c64206265203e20360641b604482015290519081900360640190fd5b6001600160a01b0383166114575760405162461bcd60e51b815260040180806020018281038252602581526020018061195f6025913960400191505060405180910390fd5b6001600160a01b03821661149c5760405162461bcd60e51b81526004018080602001828103825260238152602001806117666023913960400191505060405180910390fd5b6001600160a01b038316600090815260066020908152604080832054600790925282205490918215806114d55750600254600019018214155b1561156a5760006114e587610bdb565b9050808511156115265760405162461bcd60e51b81526004018080602001828103825260268152602001806118016026913960400191505060405180910390fd5b6001600160a01b038716600090815260056020908152604080832093889003909355600681528282208290556002546007909152919020600019909101905561161e565b82841161159557506001600160a01b038516600090815260066020526040902083830390558261161e565b6001600160a01b0386166000908152600560205260409020548385038110156115ef5760405162461bcd60e51b81526004018080602001828103825260268152602001806118016026913960400191505060405180910390fd5b6001600160a01b0387166000908152600560209081526040808320878903909403909355600690529081205550815b6001600160a01b038516600090815260066020908152604080832054600790925290912054909350915082158061165b5750600254600019018214155b156116f457600061166b86610bdb565b905080818387030110156116b05760405162461bcd60e51b815260040180806020018281038252602e815260200180611827602e913960400191505060405180910390fd5b6001600160a01b0386166000908152600560209081526040808320858903949094019093556002546007825283832060001990910190556006905220819055611724565b6001600160a01b038516600090815260056020908152604080832080548589030190556006909152902083820190555b846001600160a01b0316866001600160a01b031660008051602061193f833981519152866040518082815260200191505060405180910390a350505050505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573736164646974696f6e206f766572666c6f7720666f7220746f74616c2062616c616e6365202b206f6c644465706f7369744f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a206164646974696f6e206f766572666c6f7720666f7220726563697069656e742062616c616e63656164646974696f6e206f766572666c6f7720666f7220746f74616c20737570706c79202b207265776172644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572206f722061646d696e45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63657375627472616374696f6e206f766572666c6f7720666f7220746f74616c20737570706c796164646974696f6e206f766572666c6f7720666f7220746f74616c20737570706c797375627472616374696f6e206f766572666c6f7720666f72206c6971756964206465706f736974ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f446570726563617465626c653a20636f6e74726163742069732064657072656361746564a26469706673582212209257874fed3a071998833d8e81f6f0ea91a9d98817e402b507e08b74760e499864736f6c63430006080033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c806351cff8d911610097578063a694fc3a11610066578063a694fc3a14610312578063a9059cbb1461032f578063dd62ed3e1461035b578063f2fde38b1461038957610100565b806351cff8d91461029257806370a08231146102b857806395d89b41146102de578063a457c2d7146102e657610100565b806323b872dd116100d357806323b872dd146101e6578063313ce5671461021c578063395093511461023a57806347e7ef241461026657610100565b806306fdde0314610105578063095ea7b3146101825780630fcc0c28146101c257806318160ddd146101cc575b600080fd5b61010d6103af565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561014757818101518382015260200161012f565b50505050905090810190601f1680156101745780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101ae6004803603604081101561019857600080fd5b506001600160a01b0381351690602001356103d5565b604080519115158252519081900360200190f35b6101ca6103eb565b005b6101d4610489565b60408051918252519081900360200190f35b6101ae600480360360608110156101fc57600080fd5b506001600160a01b038135811691602081013590911690604001356104da565b610224610562565b6040805160ff9092168252519081900360200190f35b6101ae6004803603604081101561025057600080fd5b506001600160a01b038135169060200135610567565b6101ae6004803603604081101561027c57600080fd5b506001600160a01b0381351690602001356105ed565b6101ae600480360360208110156102a857600080fd5b50356001600160a01b0316610920565b6101d4600480360360208110156102ce57600080fd5b50356001600160a01b0316610bdb565b61010d610de6565b6101ae600480360360408110156102fc57600080fd5b506001600160a01b038135169060200135610e04565b6101ae6004803603602081101561032857600080fd5b5035610e74565b6101ae6004803603604081101561034557600080fd5b506001600160a01b03813516906020013561114b565b6101d46004803603604081101561037157600080fd5b506001600160a01b0381358116916020013516611158565b6101ca6004803603602081101561039f57600080fd5b50356001600160a01b0316611183565b60408051808201909152600c81526b13995d5d1c9a5b9bc81554d160a21b602082015290565b60006103e2338484611248565b50600192915050565b6000546001600160a01b031633148061040e57506001546001600160a01b031633145b6104495760405162461bcd60e51b81526004018080602001828103825260298152602001806118806029913960400191505060405180910390fd5b6001805460ff60a01b1916600160a01b17905560405133907fcc358699805e9a8b7f77b522628c7cb9abd07d9efb86b6fb616af1609036a99e90600090a2565b600354600454600091908082018211156104d45760405162461bcd60e51b81526004018080602001828103825260228152602001806118f66022913960400191505060405180910390fd5b01905090565b60006104e784848461137d565b6001600160a01b03841660009081526008602090815260408083203384529091529020548083111561054a5760405162461bcd60e51b81526004018080602001828103825260288152602001806118a96028913960400191505060405180910390fd5b6105578533858403611248565b506001949350505050565b601290565b3360009081526008602090815260408083206001600160a01b03861684529091528120548281018111156105d6576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b6105e33385858401611248565b5060019392505050565b600080546001600160a01b031633148061061157506001546001600160a01b031633145b61064c5760405162461bcd60e51b81526004018080602001828103825260298152602001806118806029913960400191505060405180910390fd5b600154600160a01b900460ff16156106955760405162461bcd60e51b81526004018080602001828103825260248152602001806119cd6024913960400191505060405180910390fd5b600082116106e1576040805162461bcd60e51b81526020600482015260146024820152730616d6f756e742073686f756c64206265203e20360641b604482015290519081900360640190fd5b6001600160a01b03831661073c576040805162461bcd60e51b815260206004820152601b60248201527f6465706f73697420746f20746865207a65726f20616464726573730000000000604482015290519081900360640190fd5b600454828101811115610796576040805162461bcd60e51b815260206004820152601d60248201527f6164646974696f6e206f766572666c6f7720666f72206465706f736974000000604482015290519081900360640190fd5b8083016004556001600160a01b03841660009081526006602052604090205480610801576107c385610bdb565b6001600160a01b03861660009081526005602090815260408083209390935560025460078252838320600019909101905560069052208490556108e6565b6001600160a01b038516600090815260076020526040902054600254600019018114156108a15781858301101561087f576040805162461bcd60e51b815260206004820152601d60248201527f6164646974696f6e206f766572666c6f7720666f72206465706f736974000000604482015290519081900360640190fd5b6001600160a01b038616600090815260066020526040902082860190556108e4565b6108aa86610bdb565b6001600160a01b03871660009081526005602090815260408083209390935560025460078252838320600019909101905560069052208590555b505b6040805185815290516001600160a01b0387169160009160008051602061193f8339815191529181900360200190a3506001949350505050565b600080546001600160a01b031633148061094457506001546001600160a01b031633145b61097f5760405162461bcd60e51b81526004018080602001828103825260298152602001806118806029913960400191505060405180910390fd5b600154600160a01b900460ff16156109c85760405162461bcd60e51b81526004018080602001828103825260248152602001806119cd6024913960400191505060405180910390fd5b6001600160a01b03821660009081526006602090815260408083205460079092529091205460025460001901811415610b22576001600160a01b038416600090815260056020526040902054600354811115610a555760405162461bcd60e51b81526004018080602001828103825260258152602001806118d16025913960400191505060405180910390fd5b600380548290039055600454831115610a9f5760405162461bcd60e51b81526004018080602001828103825260278152602001806119186027913960400191505060405180910390fd5b8260045403600481905550808382011015610aeb5760405162461bcd60e51b81526004018080602001828103825260308152602001806117896030913960400191505060405180910390fd5b60408051828501815290516000916001600160a01b0388169160008051602061193f8339815191529181900360200190a350610baa565b6000610b2d85610bdb565b60035490915080821115610b725760405162461bcd60e51b81526004018080602001828103825260258152602001806118d16025913960400191505060405180910390fd5b8181036003556040805183815290516000916001600160a01b0389169160008051602061193f8339815191529181900360200190a350505b5050506001600160a01b0381166000908152600560209081526040808320839055600690915281205560015b919050565b6001600160a01b038116600090815260056020908152604080832054600690925282205481158015610c0b575080155b15610c1b57600092505050610bd6565b6001600160a01b03841660009081526007602052604090205460025460001901811415610ca257828284011015610c99576040805162461bcd60e51b815260206004820152601d60248201527f6164646974696f6e206f766572666c6f7720666f722062616c616e6365000000604482015290519081900360640190fd5b50019050610bd6565b81610cf85760028054600091906000198101908110610cbd57fe5b9060005260206000200154905060028281548110610cd757fe5b906000526020600020015484820281610cec57fe5b04945050505050610bd6565b600060028281548110610d0757fe5b600091825260209091200154600280546000198101908110610d2557fe5b9060005260206000200154850281610d3957fe5b049050600060028360010181548110610d4e57fe5b600091825260209091200154600280546000198101908110610d6c57fe5b9060005260206000200154850281610d8057fe5b049050818282011015610dda576040805162461bcd60e51b815260206004820152601d60248201527f6164646974696f6e206f766572666c6f7720666f722062616c616e6365000000604482015290519081900360640190fd5b019350610bd692505050565b6040805180820190915260048152632aa9a22760e11b602082015290565b3360009081526008602090815260408083206001600160a01b038616845290915281205480831115610e675760405162461bcd60e51b81526004018080602001828103825260258152602001806119a86025913960400191505060405180910390fd5b6105e33385858403611248565b600080546001600160a01b0316331480610e9857506001546001600160a01b031633145b610ed35760405162461bcd60e51b81526004018080602001828103825260298152602001806118806029913960400191505060405180910390fd5b600154600160a01b900460ff1615610f1c5760405162461bcd60e51b81526004018080602001828103825260248152602001806119cd6024913960400191505060405180910390fd5b60008211610f68576040805162461bcd60e51b815260206004820152601460248201527307265776172642073686f756c64206265203e20360641b604482015290519081900360640190fd5b60035460045481610fb3576002805460018101825560009190915264e8d4a510007f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101556110b8565b60028054600091906000198101908110610fc957fe5b9060005260206000200154905060008364e8d4a51000870281610fe857fe5b0490508064e8d4a5100082011015611047576040805162461bcd60e51b815260206004820152601d60248201527f6164646974696f6e206f766572666c6f7720666f722070657263656e74000000604482015290519081900360640190fd5b64e8d4a51000818101906002908483028254600181018455600093845260209093209190049101558685018511156110b05760405162461bcd60e51b815260040180806020018281038252602b815260200180611855602b913960400191505060405180910390fd5b505050908301905b8181830110156110f95760405162461bcd60e51b81526004018080602001828103825260228152602001806118f66022913960400191505060405180910390fd5b8181016003556000600455600254604080519182526020820186905280517f45cad8c10023de80f4c0672ff6c283b671e11aa93c92b9380cdf060d2790da529281900390910190a15060019392505050565b60006103e233848461137d565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6000546001600160a01b03163314806111a657506001546001600160a01b031633145b6111e15760405162461bcd60e51b81526004018080602001828103825260298152602001806118806029913960400191505060405180910390fd5b6001600160a01b0381166112265760405162461bcd60e51b81526004018080602001828103825260268152602001806117b96026913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600154600160a01b900460ff16156112915760405162461bcd60e51b81526004018080602001828103825260248152602001806119cd6024913960400191505060405180910390fd5b6001600160a01b0383166112d65760405162461bcd60e51b81526004018080602001828103825260248152602001806119846024913960400191505060405180910390fd5b6001600160a01b03821661131b5760405162461bcd60e51b81526004018080602001828103825260228152602001806117df6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260086020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600154600160a01b900460ff16156113c65760405162461bcd60e51b81526004018080602001828103825260248152602001806119cd6024913960400191505060405180910390fd5b60008111611412576040805162461bcd60e51b81526020600482015260146024820152730616d6f756e742073686f756c64206265203e20360641b604482015290519081900360640190fd5b6001600160a01b0383166114575760405162461bcd60e51b815260040180806020018281038252602581526020018061195f6025913960400191505060405180910390fd5b6001600160a01b03821661149c5760405162461bcd60e51b81526004018080602001828103825260238152602001806117666023913960400191505060405180910390fd5b6001600160a01b038316600090815260066020908152604080832054600790925282205490918215806114d55750600254600019018214155b1561156a5760006114e587610bdb565b9050808511156115265760405162461bcd60e51b81526004018080602001828103825260268152602001806118016026913960400191505060405180910390fd5b6001600160a01b038716600090815260056020908152604080832093889003909355600681528282208290556002546007909152919020600019909101905561161e565b82841161159557506001600160a01b038516600090815260066020526040902083830390558261161e565b6001600160a01b0386166000908152600560205260409020548385038110156115ef5760405162461bcd60e51b81526004018080602001828103825260268152602001806118016026913960400191505060405180910390fd5b6001600160a01b0387166000908152600560209081526040808320878903909403909355600690529081205550815b6001600160a01b038516600090815260066020908152604080832054600790925290912054909350915082158061165b5750600254600019018214155b156116f457600061166b86610bdb565b905080818387030110156116b05760405162461bcd60e51b815260040180806020018281038252602e815260200180611827602e913960400191505060405180910390fd5b6001600160a01b0386166000908152600560209081526040808320858903949094019093556002546007825283832060001990910190556006905220819055611724565b6001600160a01b038516600090815260056020908152604080832080548589030190556006909152902083820190555b846001600160a01b0316866001600160a01b031660008051602061193f833981519152866040518082815260200191505060405180910390a350505050505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573736164646974696f6e206f766572666c6f7720666f7220746f74616c2062616c616e6365202b206f6c644465706f7369744f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a206164646974696f6e206f766572666c6f7720666f7220726563697069656e742062616c616e63656164646974696f6e206f766572666c6f7720666f7220746f74616c20737570706c79202b207265776172644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572206f722061646d696e45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63657375627472616374696f6e206f766572666c6f7720666f7220746f74616c20737570706c796164646974696f6e206f766572666c6f7720666f7220746f74616c20737570706c797375627472616374696f6e206f766572666c6f7720666f72206c6971756964206465706f736974ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f446570726563617465626c653a20636f6e74726163742069732064657072656361746564a26469706673582212209257874fed3a071998833d8e81f6f0ea91a9d98817e402b507e08b74760e499864736f6c63430006080033