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:
- AccountFactory
- Optimization enabled
- true
- Compiler version
- v0.4.24+commit.e67f0147
- Optimization runs
- 200
- EVM Version
- byzantium
- Verified at
- 2026-04-18T17:26:22.496787Z
Constructor Arguments
000000000000000000000000431f429035a1e3059d5c6a9a83208c6d3143d92500000000000000000000000035175824b39f936cc9e5498947d9b4029f55d192
Arg [0] (address) : 0x431f429035a1e3059d5c6a9a83208c6d3143d925
Arg [1] (address) : 0x35175824b39f936cc9e5498947d9b4029f55d192
AccountFactory.sol
pragma solidity 0.4.24;
contract DSMath {
function add(uint x, uint y) internal pure returns (uint z) {
require((z = x + y) >= x);
}
function sub(uint x, uint y) internal pure returns (uint z) {
require((z = x - y) <= x);
}
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x);
}
// custom : not in original DSMath, putting it here for consistency, copied from SafeMath
function div(uint x, uint y) internal pure returns (uint z) {
z = x / y;
}
function min(uint x, uint y) internal pure returns (uint z) {
return x <= y ? x : y;
}
function max(uint x, uint y) internal pure returns (uint z) {
return x >= y ? x : y;
}
function imin(int x, int y) internal pure returns (int z) {
return x <= y ? x : y;
}
function imax(int x, int y) internal pure returns (int z) {
return x >= y ? x : y;
}
uint constant WAD = 10 ** 18;
uint constant RAY = 10 ** 27;
function wmul(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, y), WAD / 2) / WAD;
}
function rmul(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, y), RAY / 2) / RAY;
}
function wdiv(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, WAD), y / 2) / y;
}
function rdiv(uint x, uint y) internal pure returns (uint z) {
z = add(mul(x, RAY), y / 2) / y;
}
// This famous algorithm is called "exponentiation by squaring"
// and calculates x^n with x as fixed-point and n as regular unsigned.
//
// It's O(log n), instead of O(n) for naive repeated multiplication.
//
// These facts are why it works:
//
// If n is even, then x^n = (x^2)^(n/2).
// If n is odd, then x^n = x * x^(n-1),
// and applying the equation for even x gives
// x^n = x * (x^2)^((n-1) / 2).
//
// Also, EVM division is flooring and
// floor[(n-1) / 2] = floor[n / 2].
//
function rpow(uint x, uint n) internal pure returns (uint z) {
z = n % 2 != 0 ? x : RAY;
for (n /= 2; n != 0; n /= 2) {
x = rmul(x, x);
if (n % 2 != 0) {
z = rmul(z, x);
}
}
}
}
contract ErrorUtils {
event LogError(string methodSig, string errMsg);
event LogErrorWithHintBytes32(bytes32 indexed bytes32Value, string methodSig, string errMsg);
event LogErrorWithHintAddress(address indexed addressValue, string methodSig, string errMsg);
}
contract Proxy {
address masterCopy;
constructor(address _masterCopy)
public
{
require(_masterCopy != 0, "Invalid master copy address provided");
masterCopy = _masterCopy;
}
function ()
external
payable
{
// solium-disable-next-line security/no-inline-assembly
assembly {
let masterCopy := and(sload(0), 0xffffffffffffffffffffffffffffffffffffffff)
calldatacopy(0, 0, calldatasize())
let success := delegatecall(gas, masterCopy, 0, calldatasize(), 0, 0)
returndatacopy(0, 0, returndatasize())
if eq(success, 0) { revert(0, returndatasize()) }
return(0, returndatasize())
}
}
function implementation()
public
view
returns (address)
{
return masterCopy;
}
function proxyType()
public
pure
returns (uint256)
{
return 2;
}
}
contract DSAuthority {
function canCall(address src, address dst, bytes4 sig) public view returns (bool);
}
contract DSAuthEvents {
event LogSetAuthority (address indexed authority);
event LogSetOwner (address indexed owner);
}
contract DSAuth is DSAuthEvents {
DSAuthority public authority;
address public owner;
constructor() public {
owner = msg.sender;
emit LogSetOwner(msg.sender);
}
function setOwner(address owner_)
public
auth
{
owner = owner_;
emit LogSetOwner(owner);
}
function setAuthority(DSAuthority authority_)
public
auth
{
authority = authority_;
emit LogSetAuthority(authority);
}
modifier auth {
require(isAuthorized(msg.sender, msg.sig), "DSAuth::_ SENDER_NOT_AUTHORIZED");
_;
}
function isAuthorized(address src, bytes4 sig) internal view returns (bool) {
if (src == address(this)) {
return true;
} else if (src == owner) {
return true;
} else if (authority == DSAuthority(0)) {
return false;
} else {
return authority.canCall(src, this, sig);
}
}
}
contract DSNote {
event LogNote(
bytes4 indexed sig,
address indexed guy,
bytes32 indexed foo,
bytes32 indexed bar,
uint wad,
bytes fax
) anonymous;
modifier note {
bytes32 foo;
bytes32 bar;
assembly {
foo := calldataload(4)
bar := calldataload(36)
}
emit LogNote(msg.sig, msg.sender, foo, bar, msg.value, msg.data);
_;
}
}
interface ERC20 {
function name() public view returns(string);
function symbol() public view returns(string);
function decimals() public view returns(uint8);
function totalSupply() public view returns (uint);
function balanceOf(address tokenOwner) public view returns (uint balance);
function allowance(address tokenOwner, address spender) public view returns (uint remaining);
function transfer(address to, uint tokens) public returns (bool success);
function approve(address spender, uint tokens) public returns (bool success);
function transferFrom(address from, address to, uint tokens) public returns (bool success);
event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
contract MasterCopy {
address masterCopy;
function changeMasterCopy(address _masterCopy)
public
{
require(_masterCopy != 0, "Invalid master copy address provided");
masterCopy = _masterCopy;
}
}
contract Utils {
modifier addressValid(address _address) {
require(_address != address(0), "Utils::_ INVALID_ADDRESS");
_;
}
}
contract WETH9 {
string public name = "Wrapped Ether";
string public symbol = "WETH";
uint8 public decimals = 18;
event Approval(address indexed _owner, address indexed _spender, uint _value);
event Transfer(address indexed _from, address indexed _to, uint _value);
event Deposit(address indexed _owner, uint _value);
event Withdrawal(address indexed _owner, uint _value);
mapping (address => uint) public balanceOf;
mapping (address => mapping (address => uint)) public allowance;
function() public payable {
deposit();
}
function deposit() public payable {
balanceOf[msg.sender] += msg.value;
Deposit(msg.sender, msg.value);
}
function withdraw(uint wad) public {
require(balanceOf[msg.sender] >= wad);
balanceOf[msg.sender] -= wad;
msg.sender.transfer(wad);
Withdrawal(msg.sender, wad);
}
function totalSupply() public view returns (uint) {
return this.balance;
}
function approve(address guy, uint wad) public returns (bool) {
allowance[msg.sender][guy] = wad;
Approval(msg.sender, guy, wad);
return true;
}
function transfer(address dst, uint wad) public returns (bool) {
return transferFrom(msg.sender, dst, wad);
}
function transferFrom(address src, address dst, uint wad)
public
returns (bool)
{
require(balanceOf[src] >= wad);
if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {
require(allowance[src][msg.sender] >= wad);
allowance[src][msg.sender] -= wad;
}
balanceOf[src] -= wad;
balanceOf[dst] += wad;
Transfer(src, dst, wad);
return true;
}
}
contract DSThing is DSNote, DSAuth, DSMath {
function S(string s) internal pure returns (bytes4) {
return bytes4(keccak256(s));
}
}
library ECRecovery {
function recover(bytes32 _hash, bytes _sig)
internal
pure
returns (address)
{
bytes32 r;
bytes32 s;
uint8 v;
if (_sig.length != 65) {
return (address(0));
}
assembly {
r := mload(add(_sig, 32))
s := mload(add(_sig, 64))
v := byte(0, mload(add(_sig, 96)))
}
if (v < 27) {
v += 27;
}
if (v != 27 && v != 28) {
return (address(0));
} else {
return ecrecover(_hash, v, r, s);
}
}
function toEthSignedMessageHash(bytes32 _hash)
internal
pure
returns (bytes32)
{
return keccak256(
abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash)
);
}
}
contract Utils2 {
using ECRecovery for bytes32;
function _recoverSigner(bytes32 _hash, bytes _signature)
internal
pure
returns(address _signer)
{
return _hash.toEthSignedMessageHash().recover(_signature);
}
}
contract Config is DSNote, DSAuth, Utils {
WETH9 public weth9;
mapping (address => bool) public isAccountHandler;
mapping (address => bool) public isAdmin;
address[] public admins;
bool public disableAdminControl = false;
event LogAdminAdded(address indexed _admin, address _by);
event LogAdminRemoved(address indexed _admin, address _by);
constructor() public {
admins.push(msg.sender);
isAdmin[msg.sender] = true;
}
modifier onlyAdmin(){
require(isAdmin[msg.sender], "Config::_ SENDER_NOT_AUTHORIZED");
_;
}
function setWETH9
(
address _weth9
)
public
auth
note
addressValid(_weth9)
{
weth9 = WETH9(_weth9);
}
function setAccountHandler
(
address _accountHandler,
bool _isAccountHandler
)
public
auth
note
addressValid(_accountHandler)
{
isAccountHandler[_accountHandler] = _isAccountHandler;
}
function toggleAdminsControl()
public
auth
note
{
disableAdminControl = !disableAdminControl;
}
function isAdminValid(address _admin)
public
view
returns (bool)
{
if(disableAdminControl) {
return true;
} else {
return isAdmin[_admin];
}
}
function getAllAdmins()
public
view
returns(address[])
{
return admins;
}
function addAdmin
(
address _admin
)
external
note
onlyAdmin
addressValid(_admin)
{
require(!isAdmin[_admin], "Config::addAdmin ADMIN_ALREADY_EXISTS");
admins.push(_admin);
isAdmin[_admin] = true;
emit LogAdminAdded(_admin, msg.sender);
}
function removeAdmin
(
address _admin
)
external
note
onlyAdmin
addressValid(_admin)
{
require(isAdmin[_admin], "Config::removeAdmin ADMIN_DOES_NOT_EXIST");
require(msg.sender != _admin, "Config::removeAdmin ADMIN_NOT_AUTHORIZED");
isAdmin[_admin] = false;
for (uint i = 0; i < admins.length - 1; i++) {
if (admins[i] == _admin) {
admins[i] = admins[admins.length - 1];
admins.length -= 1;
break;
}
}
emit LogAdminRemoved(_admin, msg.sender);
}
}
contract DSStop is DSNote, DSAuth {
bool public stopped = false;
modifier whenNotStopped {
require(!stopped, "DSStop::_ FEATURE_STOPPED");
_;
}
modifier whenStopped {
require(stopped, "DSStop::_ FEATURE_NOT_STOPPED");
_;
}
function stop() public auth note {
stopped = true;
}
function start() public auth note {
stopped = false;
}
}
contract Account is MasterCopy, DSNote, Utils, Utils2, ErrorUtils {
address[] public users;
mapping (address => bool) public isUser;
mapping (bytes32 => bool) public actionCompleted;
WETH9 public weth9;
Config public config;
bool public isInitialized = false;
event LogTransferBySystem(address indexed token, address indexed to, uint value, address by);
event LogTransferByUser(address indexed token, address indexed to, uint value, address by);
event LogUserAdded(address indexed user, address by);
event LogUserRemoved(address indexed user, address by);
modifier initialized() {
require(isInitialized, "Account::_ ACCOUNT_NOT_INITIALIZED");
_;
}
modifier userExists(address _user) {
require(isUser[_user], "Account::_ INVALID_USER");
_;
}
modifier userDoesNotExist(address _user) {
require(!isUser[_user], "Account::_ USER_DOES_NOT_EXISTS");
_;
}
modifier onlyHandler(){
require(config.isAccountHandler(msg.sender), "Account::_ INVALID_ACC_HANDLER");
_;
}
function init(address _user, address _config) public {
users.push(_user);
isUser[_user] = true;
config = Config(_config);
weth9 = config.weth9();
isInitialized = true;
}
function getAllUsers() public view returns (address[]) {
return users;
}
function balanceFor(address _token) public view returns (uint _balance){
_balance = ERC20(_token).balanceOf(this);
}
function transferBySystem
(
address _token,
address _to,
uint _value
)
external
onlyHandler
note
initialized
{
require(ERC20(_token).balanceOf(this) >= _value, "Account::transferBySystem INSUFFICIENT_BALANCE_IN_ACCOUNT");
require(ERC20(_token).transfer(_to, _value), "Account::transferBySystem TOKEN_TRANSFER_FAILED");
emit LogTransferBySystem(_token, _to, _value, msg.sender);
}
function transferByUser
(
address _token,
address _to,
uint _value,
uint _salt,
bytes _signature
)
external
addressValid(_to)
note
initialized
{
bytes32 actionHash = _getTransferActionHash(_token, _to, _value, _salt);
if(actionCompleted[actionHash]) {
emit LogError("Account::transferByUser", "ACTION_ALREADY_PERFORMED");
return;
}
if(ERC20(_token).balanceOf(this) < _value){
emit LogError("Account::transferByUser", "INSUFFICIENT_BALANCE_IN_ACCOUNT");
return;
}
address signer = _recoverSigner(actionHash, _signature);
if(!isUser[signer]) {
emit LogError("Account::transferByUser", "SIGNER_NOT_AUTHORIZED_WITH_ACCOUNT");
return;
}
actionCompleted[actionHash] = true;
if (_token == address(weth9)) {
weth9.withdraw(_value);
_to.transfer(_value);
} else {
require(ERC20(_token).transfer(_to, _value), "Account::transferByUser TOKEN_TRANSFER_FAILED");
}
emit LogTransferByUser(_token, _to, _value, signer);
}
function addUser
(
address _user,
uint _salt,
bytes _signature
)
external
note
addressValid(_user)
userDoesNotExist(_user)
initialized
{
bytes32 actionHash = _getUserActionHash(_user, "ADD_USER", _salt);
if(actionCompleted[actionHash])
{
emit LogError("Account::addUser", "ACTION_ALREADY_PERFORMED");
return;
}
address signer = _recoverSigner(actionHash, _signature);
if(!isUser[signer]) {
emit LogError("Account::addUser", "SIGNER_NOT_AUTHORIZED_WITH_ACCOUNT");
return;
}
actionCompleted[actionHash] = true;
users.push(_user);
isUser[_user] = true;
emit LogUserAdded(_user, signer);
}
function removeUser
(
address _user,
uint _salt,
bytes _signature
)
external
note
userExists(_user)
initialized
{
bytes32 actionHash = _getUserActionHash(_user, "REMOVE_USER", _salt);
if(actionCompleted[actionHash]) {
emit LogError("Account::removeUser", "ACTION_ALREADY_PERFORMED");
return;
}
address signer = _recoverSigner(actionHash, _signature);
// require(signer != _user, "Account::removeUser SIGNER_NOT_AUTHORIZED_WITH_ACCOUNT");
if(!isUser[signer]){
emit LogError("Account::removeUser", "SIGNER_NOT_AUTHORIZED_WITH_ACCOUNT");
return;
}
actionCompleted[actionHash] = true;
isUser[_user] = false;
for (uint i = 0; i < users.length - 1; i++) {
if (users[i] == _user) {
users[i] = users[users.length - 1];
users.length -= 1;
break;
}
}
emit LogUserRemoved(_user, signer);
}
function _getTransferActionHash
(
address _token,
address _to,
uint _value,
uint _salt
)
internal
view
returns (bytes32)
{
return keccak256(
abi.encodePacked(
address(this),
_token,
_to,
_value,
_salt
)
);
}
function _getUserActionHash
(
address _user,
string _action,
uint _salt
)
internal
view
returns (bytes32)
{
return keccak256(
abi.encodePacked(
address(this),
_user,
_action,
_salt
)
);
}
// to directly send ether to contract
function() external payable {
require(msg.data.length == 0 && msg.value > 0, "Account::fallback INVALID_ETHER_TRANSFER");
if(msg.sender != address(weth9)){
weth9.deposit.value(msg.value)();
}
}
}
contract AccountFactory is DSStop, Utils {
Config public config;
mapping (address => bool) public isAccount;
mapping (address => address[]) public userToAccounts;
address[] public accounts;
address public accountMaster;
constructor
(
Config _config,
address _accountMaster
)
public
{
config = _config;
accountMaster = _accountMaster;
}
event LogAccountCreated(address indexed user, address indexed account, address by);
modifier onlyAdmin() {
require(config.isAdminValid(msg.sender), "AccountFactory::_ INVALID_ADMIN_ACCOUNT");
_;
}
function setConfig(Config _config) external note auth addressValid(_config) {
config = _config;
}
function setAccountMaster(address _accountMaster) external note auth addressValid(_accountMaster) {
accountMaster = _accountMaster;
}
function newAccount(address _user)
public
note
onlyAdmin
addressValid(config)
addressValid(accountMaster)
whenNotStopped
returns
(
Account _account
)
{
address proxy = new Proxy(accountMaster);
_account = Account(proxy);
_account.init(_user, config);
accounts.push(_account);
userToAccounts[_user].push(_account);
isAccount[_account] = true;
emit LogAccountCreated(_user, _account, msg.sender);
}
function batchNewAccount(address[] _users) public note onlyAdmin {
for (uint i = 0; i < _users.length; i++) {
newAccount(_users[i]);
}
}
function getAllAccounts() public view returns (address[]) {
return accounts;
}
function getAccountsForUser(address _user) public view returns (address[]) {
return userToAccounts[_user];
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"byzantium","compilationTarget":{"AccountFactory.sol":"AccountFactory"}}
Contract ABI
[{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"address","name":"_account"}],"name":"newAccount","inputs":[{"type":"address","name":"_user"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"stop","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address[]","name":""}],"name":"getAllAccounts","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setOwner","inputs":[{"type":"address","name":"owner_"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"userToAccounts","inputs":[{"type":"address","name":""},{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address[]","name":""}],"name":"getAccountsForUser","inputs":[{"type":"address","name":"_user"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setConfig","inputs":[{"type":"address","name":"_config"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"isAccount","inputs":[{"type":"address","name":""}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setAccountMaster","inputs":[{"type":"address","name":"_accountMaster"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"stopped","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"config","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setAuthority","inputs":[{"type":"address","name":"authority_"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"batchNewAccount","inputs":[{"type":"address[]","name":"_users"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"start","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"authority","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"accountMaster","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"accounts","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"constructor","stateMutability":"nonpayable","payable":false,"inputs":[{"type":"address","name":"_config"},{"type":"address","name":"_accountMaster"}]},{"type":"event","name":"LogAccountCreated","inputs":[{"type":"address","name":"user","indexed":true},{"type":"address","name":"account","indexed":true},{"type":"address","name":"by","indexed":false}],"anonymous":false},{"type":"event","name":"LogSetAuthority","inputs":[{"type":"address","name":"authority","indexed":true}],"anonymous":false},{"type":"event","name":"LogSetOwner","inputs":[{"type":"address","name":"owner","indexed":true}],"anonymous":false},{"type":"event","name":"LogNote","inputs":[{"type":"bytes4","name":"sig","indexed":true},{"type":"address","name":"guy","indexed":true},{"type":"bytes32","name":"foo","indexed":true},{"type":"bytes32","name":"bar","indexed":true},{"type":"uint256","name":"wad","indexed":false},{"type":"bytes","name":"fax","indexed":false}],"anonymous":true}]
Contract Creation Code
0x60806040526001805460a060020a60ff021916905534801561002057600080fd5b506040516040806114e4833981016040819052815160209092015160018054600160a060020a0319163390811790915590917fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a260028054600160a060020a03938416600160a060020a03199182161790915560068054929093169116179055611431806100b36000396000f3006080604052600436106100fb5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166303152429811461010057806307da68f51461013d57806308e93d0a1461015457806313af4035146101b9578063169b7012146101da5780631eb9ef91146101fe57806320e3dbd41461021f57806325ca4c9c146102405780633e0bd52e1461027557806375f12b211461029657806379502c55146102ab5780637a9e5e4b146102c05780638da5cb5b146102e15780639996eb64146102f6578063be9a65551461034b578063bf7e214f14610360578063f0a72a8414610375578063f2a40db81461038a575b600080fd5b34801561010c57600080fd5b50610121600160a060020a03600435166103a2565b60408051600160a060020a039092168252519081900360200190f35b34801561014957600080fd5b506101526107c3565b005b34801561016057600080fd5b506101696108a7565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156101a557818101518382015260200161018d565b505050509050019250505060405180910390f35b3480156101c557600080fd5b50610152600160a060020a0360043516610909565b3480156101e657600080fd5b50610121600160a060020a03600435166024356109c0565b34801561020a57600080fd5b50610169600160a060020a03600435166109f7565b34801561022b57600080fd5b50610152600160a060020a0360043516610a6d565b34801561024c57600080fd5b50610261600160a060020a0360043516610b9a565b604080519115158252519081900360200190f35b34801561028157600080fd5b50610152600160a060020a0360043516610baf565b3480156102a257600080fd5b50610261610cdc565b3480156102b757600080fd5b50610121610cfd565b3480156102cc57600080fd5b50610152600160a060020a0360043516610d0c565b3480156102ed57600080fd5b50610121610dbf565b34801561030257600080fd5b506040805160206004803580820135838102808601850190965280855261015295369593946024949385019291829185019084908082843750949750610dce9650505050505050565b34801561035757600080fd5b50610152610f71565b34801561036c57600080fd5b5061012161103e565b34801561038157600080fd5b5061012161104d565b34801561039657600080fd5b5061012160043561105c565b6040805134808252602082018381523693830184905260009384936004359360243593849386933393600160e060020a03198a35169390928a929091606082018484808284376040519201829003965090945050505050a4600254604080517f9c14ee290000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0390921691639c14ee29916024808201926020929091908290030181600087803b15801561046057600080fd5b505af1158015610474573d6000803e3d6000fd5b505050506040513d602081101561048a57600080fd5b50511515610508576040805160e560020a62461bcd02815260206004820152602760248201527f4163636f756e74466163746f72793a3a5f20494e56414c49445f41444d494e5f60448201527f4143434f554e5400000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600254600160a060020a0316801515610559576040805160e560020a62461bcd02815260206004820152601860248201526000805160206113e6833981519152604482015290519081900360640190fd5b600654600160a060020a03168015156105aa576040805160e560020a62461bcd02815260206004820152601860248201526000805160206113e6833981519152604482015290519081900360640190fd5b60015474010000000000000000000000000000000000000000900460ff161561061d576040805160e560020a62461bcd02815260206004820152601960248201527f445353746f703a3a5f20464541545552455f53544f5050454400000000000000604482015290519081900360640190fd5b600654600160a060020a031661063161118d565b600160a060020a03909116815260405190819003602001906000f08015801561065e573d6000803e3d6000fd5b50600254604080517ff09a4016000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152928316602482015290519298508897509087169163f09a40169160448082019260009290919082900301818387803b1580156106d457600080fd5b505af11580156106e8573d6000803e3d6000fd5b50506005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0018054600160a060020a03808c1673ffffffffffffffffffffffffffffffffffffffff1992831681179093558c1660008181526004602090815260408083208054808901825590845282842001805490951686179094558482526003815290839020805460ff19169095179094558151338152915192955093507eef0c4d7ce8d09e55441711e41dc8f1a6abbe3313f4369ea8094dbf0b7b182092908290030190a35050505050919050565b6107d933600035600160e060020a031916611084565b151561081d576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206113c6833981519152604482015290519081900360640190fd5b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a450506001805474ff0000000000000000000000000000000000000000191674010000000000000000000000000000000000000000179055565b606060058054806020026020016040519081016040528092919081815260200182805480156108ff57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116108e1575b5050505050905090565b61091f33600035600160e060020a031916611084565b1515610963576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206113c6833981519152604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b6004602052816000526040600020818154811015156109db57fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260046020908152604091829020805483518184028101840190945280845260609392830182828015610a6157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610a43575b50505050509050919050565b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610ad433600035600160e060020a031916611084565b1515610b18576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206113c6833981519152604482015290519081900360640190fd5b82600160a060020a0381161515610b67576040805160e560020a62461bcd02815260206004820152601860248201526000805160206113e6833981519152604482015290519081900360640190fd5b50506002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03939093169290921790915550565b60036020526000908152604090205460ff1681565b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610c1633600035600160e060020a031916611084565b1515610c5a576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206113c6833981519152604482015290519081900360640190fd5b82600160a060020a0381161515610ca9576040805160e560020a62461bcd02815260206004820152601860248201526000805160206113e6833981519152604482015290519081900360640190fd5b50506006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03939093169290921790915550565b60015474010000000000000000000000000000000000000000900460ff1681565b600254600160a060020a031681565b610d2233600035600160e060020a031916611084565b1515610d66576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206113c6833981519152604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091178083556040519116917f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada491a250565b600154600160a060020a031681565b604080513480825260208201838152369383018490526000936004359360243593849386933393600160e060020a03198a351693928a929190606082018484808284376040519201829003965090945050505050a4600254604080517f9c14ee290000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0390921691639c14ee29916024808201926020929091908290030181600087803b158015610e8957600080fd5b505af1158015610e9d573d6000803e3d6000fd5b505050506040513d6020811015610eb357600080fd5b50511515610f31576040805160e560020a62461bcd02815260206004820152602760248201527f4163636f756e74466163746f72793a3a5f20494e56414c49445f41444d494e5f60448201527f4143434f554e5400000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600092505b8351831015610f6b57610f5f8484815181101515610f5057fe5b906020019060200201516103a2565b50600190920191610f36565b50505050565b610f8733600035600160e060020a031916611084565b1515610fcb576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206113c6833981519152604482015290519081900360640190fd5b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a450506001805474ff000000000000000000000000000000000000000019169055565b600054600160a060020a031681565b600654600160a060020a031681565b600580548290811061106a57fe5b600091825260209091200154600160a060020a0316905081565b6000600160a060020a03831630141561109f57506001611187565b600154600160a060020a03848116911614156110bd57506001611187565b600054600160a060020a031615156110d757506000611187565b60008054604080517fb7009613000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152306024830152600160e060020a0319871660448301529151919092169263b700961392606480820193602093909283900390910190829087803b15801561115857600080fd5b505af115801561116c573d6000803e3d6000fd5b505050506040513d602081101561118257600080fd5b505190505b92915050565b6040516102288061119e833901905600608060405234801561001057600080fd5b506040516020806102288339810160405251600160a060020a03811615156100be57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f496e76616c6964206d617374657220636f707920616464726573732070726f7660448201527f6964656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008054600160a060020a03909216600160a060020a031990921691909117905561013a806100ee6000396000f30060806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416634555d5c981146100885780635c60da1b146100af575b73ffffffffffffffffffffffffffffffffffffffff600054163660008037600080366000845af43d6000803e801515610083573d6000fd5b3d6000f35b34801561009457600080fd5b5061009d6100ed565b60408051918252519081900360200190f35b3480156100bb57600080fd5b506100c46100f2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b600290565b60005473ffffffffffffffffffffffffffffffffffffffff16905600a165627a7a7230582000e8963a53396a420e260d6762a2b264be1db09b89fce92475fadd0600ddeffb00294453417574683a3a5f2053454e4445525f4e4f545f415554484f52495a4544005574696c733a3a5f20494e56414c49445f414444524553530000000000000000a165627a7a723058209fe86b6dbc0e1c96205965761ce3bd59967c1099aefabcfab84953b455d281f30029000000000000000000000000431f429035a1e3059d5c6a9a83208c6d3143d92500000000000000000000000035175824b39f936cc9e5498947d9b4029f55d192
Deployed ByteCode
0x6080604052600436106100fb5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166303152429811461010057806307da68f51461013d57806308e93d0a1461015457806313af4035146101b9578063169b7012146101da5780631eb9ef91146101fe57806320e3dbd41461021f57806325ca4c9c146102405780633e0bd52e1461027557806375f12b211461029657806379502c55146102ab5780637a9e5e4b146102c05780638da5cb5b146102e15780639996eb64146102f6578063be9a65551461034b578063bf7e214f14610360578063f0a72a8414610375578063f2a40db81461038a575b600080fd5b34801561010c57600080fd5b50610121600160a060020a03600435166103a2565b60408051600160a060020a039092168252519081900360200190f35b34801561014957600080fd5b506101526107c3565b005b34801561016057600080fd5b506101696108a7565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156101a557818101518382015260200161018d565b505050509050019250505060405180910390f35b3480156101c557600080fd5b50610152600160a060020a0360043516610909565b3480156101e657600080fd5b50610121600160a060020a03600435166024356109c0565b34801561020a57600080fd5b50610169600160a060020a03600435166109f7565b34801561022b57600080fd5b50610152600160a060020a0360043516610a6d565b34801561024c57600080fd5b50610261600160a060020a0360043516610b9a565b604080519115158252519081900360200190f35b34801561028157600080fd5b50610152600160a060020a0360043516610baf565b3480156102a257600080fd5b50610261610cdc565b3480156102b757600080fd5b50610121610cfd565b3480156102cc57600080fd5b50610152600160a060020a0360043516610d0c565b3480156102ed57600080fd5b50610121610dbf565b34801561030257600080fd5b506040805160206004803580820135838102808601850190965280855261015295369593946024949385019291829185019084908082843750949750610dce9650505050505050565b34801561035757600080fd5b50610152610f71565b34801561036c57600080fd5b5061012161103e565b34801561038157600080fd5b5061012161104d565b34801561039657600080fd5b5061012160043561105c565b6040805134808252602082018381523693830184905260009384936004359360243593849386933393600160e060020a03198a35169390928a929091606082018484808284376040519201829003965090945050505050a4600254604080517f9c14ee290000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0390921691639c14ee29916024808201926020929091908290030181600087803b15801561046057600080fd5b505af1158015610474573d6000803e3d6000fd5b505050506040513d602081101561048a57600080fd5b50511515610508576040805160e560020a62461bcd02815260206004820152602760248201527f4163636f756e74466163746f72793a3a5f20494e56414c49445f41444d494e5f60448201527f4143434f554e5400000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600254600160a060020a0316801515610559576040805160e560020a62461bcd02815260206004820152601860248201526000805160206113e6833981519152604482015290519081900360640190fd5b600654600160a060020a03168015156105aa576040805160e560020a62461bcd02815260206004820152601860248201526000805160206113e6833981519152604482015290519081900360640190fd5b60015474010000000000000000000000000000000000000000900460ff161561061d576040805160e560020a62461bcd02815260206004820152601960248201527f445353746f703a3a5f20464541545552455f53544f5050454400000000000000604482015290519081900360640190fd5b600654600160a060020a031661063161118d565b600160a060020a03909116815260405190819003602001906000f08015801561065e573d6000803e3d6000fd5b50600254604080517ff09a4016000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152928316602482015290519298508897509087169163f09a40169160448082019260009290919082900301818387803b1580156106d457600080fd5b505af11580156106e8573d6000803e3d6000fd5b50506005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0018054600160a060020a03808c1673ffffffffffffffffffffffffffffffffffffffff1992831681179093558c1660008181526004602090815260408083208054808901825590845282842001805490951686179094558482526003815290839020805460ff19169095179094558151338152915192955093507eef0c4d7ce8d09e55441711e41dc8f1a6abbe3313f4369ea8094dbf0b7b182092908290030190a35050505050919050565b6107d933600035600160e060020a031916611084565b151561081d576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206113c6833981519152604482015290519081900360640190fd5b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a450506001805474ff0000000000000000000000000000000000000000191674010000000000000000000000000000000000000000179055565b606060058054806020026020016040519081016040528092919081815260200182805480156108ff57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116108e1575b5050505050905090565b61091f33600035600160e060020a031916611084565b1515610963576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206113c6833981519152604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b6004602052816000526040600020818154811015156109db57fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a038116600090815260046020908152604091829020805483518184028101840190945280845260609392830182828015610a6157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610a43575b50505050509050919050565b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610ad433600035600160e060020a031916611084565b1515610b18576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206113c6833981519152604482015290519081900360640190fd5b82600160a060020a0381161515610b67576040805160e560020a62461bcd02815260206004820152601860248201526000805160206113e6833981519152604482015290519081900360640190fd5b50506002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03939093169290921790915550565b60036020526000908152604090205460ff1681565b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610c1633600035600160e060020a031916611084565b1515610c5a576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206113c6833981519152604482015290519081900360640190fd5b82600160a060020a0381161515610ca9576040805160e560020a62461bcd02815260206004820152601860248201526000805160206113e6833981519152604482015290519081900360640190fd5b50506006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03939093169290921790915550565b60015474010000000000000000000000000000000000000000900460ff1681565b600254600160a060020a031681565b610d2233600035600160e060020a031916611084565b1515610d66576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206113c6833981519152604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091178083556040519116917f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada491a250565b600154600160a060020a031681565b604080513480825260208201838152369383018490526000936004359360243593849386933393600160e060020a03198a351693928a929190606082018484808284376040519201829003965090945050505050a4600254604080517f9c14ee290000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0390921691639c14ee29916024808201926020929091908290030181600087803b158015610e8957600080fd5b505af1158015610e9d573d6000803e3d6000fd5b505050506040513d6020811015610eb357600080fd5b50511515610f31576040805160e560020a62461bcd02815260206004820152602760248201527f4163636f756e74466163746f72793a3a5f20494e56414c49445f41444d494e5f60448201527f4143434f554e5400000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600092505b8351831015610f6b57610f5f8484815181101515610f5057fe5b906020019060200201516103a2565b50600190920191610f36565b50505050565b610f8733600035600160e060020a031916611084565b1515610fcb576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206113c6833981519152604482015290519081900360640190fd5b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a450506001805474ff000000000000000000000000000000000000000019169055565b600054600160a060020a031681565b600654600160a060020a031681565b600580548290811061106a57fe5b600091825260209091200154600160a060020a0316905081565b6000600160a060020a03831630141561109f57506001611187565b600154600160a060020a03848116911614156110bd57506001611187565b600054600160a060020a031615156110d757506000611187565b60008054604080517fb7009613000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152306024830152600160e060020a0319871660448301529151919092169263b700961392606480820193602093909283900390910190829087803b15801561115857600080fd5b505af115801561116c573d6000803e3d6000fd5b505050506040513d602081101561118257600080fd5b505190505b92915050565b6040516102288061119e833901905600608060405234801561001057600080fd5b506040516020806102288339810160405251600160a060020a03811615156100be57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f496e76616c6964206d617374657220636f707920616464726573732070726f7660448201527f6964656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008054600160a060020a03909216600160a060020a031990921691909117905561013a806100ee6000396000f30060806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416634555d5c981146100885780635c60da1b146100af575b73ffffffffffffffffffffffffffffffffffffffff600054163660008037600080366000845af43d6000803e801515610083573d6000fd5b3d6000f35b34801561009457600080fd5b5061009d6100ed565b60408051918252519081900360200190f35b3480156100bb57600080fd5b506100c46100f2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b600290565b60005473ffffffffffffffffffffffffffffffffffffffff16905600a165627a7a7230582000e8963a53396a420e260d6762a2b264be1db09b89fce92475fadd0600ddeffb00294453417574683a3a5f2053454e4445525f4e4f545f415554484f52495a4544005574696c733a3a5f20494e56414c49445f414444524553530000000000000000a165627a7a723058209fe86b6dbc0e1c96205965761ce3bd59967c1099aefabcfab84953b455d281f30029