Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BTTSLib
Compiler Version
v0.4.19+commit.c4cbbb05
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-02-11 */ pragma solidity ^0.4.18; // ---------------------------------------------------------------------------- // BokkyPooBah's Token Teleportation Service v1.10 // // https://github.com/bokkypoobah/BokkyPooBahsTokenTeleportationServiceSmartContract // // Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018. The MIT Licence. // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // ERC Token Standard #20 Interface // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md // ---------------------------------------------------------------------------- contract ERC20Interface { 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); } // ---------------------------------------------------------------------------- // Contracts that can have tokens approved, and then a function executed // ---------------------------------------------------------------------------- contract ApproveAndCallFallBack { function receiveApproval(address from, uint256 tokens, address token, bytes data) public; } // ---------------------------------------------------------------------------- // BokkyPooBah's Token Teleportation Service Interface v1.10 // // Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018. The MIT Licence. // ---------------------------------------------------------------------------- contract BTTSTokenInterface is ERC20Interface { uint public constant bttsVersion = 110; bytes public constant signingPrefix = "\x19Ethereum Signed Message:\n32"; bytes4 public constant signedTransferSig = "\x75\x32\xea\xac"; bytes4 public constant signedApproveSig = "\xe9\xaf\xa7\xa1"; bytes4 public constant signedTransferFromSig = "\x34\x4b\xcc\x7d"; bytes4 public constant signedApproveAndCallSig = "\xf1\x6f\x9b\x53"; event OwnershipTransferred(address indexed from, address indexed to); event MinterUpdated(address from, address to); event Mint(address indexed tokenOwner, uint tokens, bool lockAccount); event MintingDisabled(); event TransfersEnabled(); event AccountUnlocked(address indexed tokenOwner); function approveAndCall(address spender, uint tokens, bytes data) public returns (bool success); // ------------------------------------------------------------------------ // signed{X} functions // ------------------------------------------------------------------------ function signedTransferHash(address tokenOwner, address to, uint tokens, uint fee, uint nonce) public view returns (bytes32 hash); function signedTransferCheck(address tokenOwner, address to, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public view returns (CheckResult result); function signedTransfer(address tokenOwner, address to, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public returns (bool success); function signedApproveHash(address tokenOwner, address spender, uint tokens, uint fee, uint nonce) public view returns (bytes32 hash); function signedApproveCheck(address tokenOwner, address spender, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public view returns (CheckResult result); function signedApprove(address tokenOwner, address spender, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public returns (bool success); function signedTransferFromHash(address spender, address from, address to, uint tokens, uint fee, uint nonce) public view returns (bytes32 hash); function signedTransferFromCheck(address spender, address from, address to, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public view returns (CheckResult result); function signedTransferFrom(address spender, address from, address to, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public returns (bool success); function signedApproveAndCallHash(address tokenOwner, address spender, uint tokens, bytes _data, uint fee, uint nonce) public view returns (bytes32 hash); function signedApproveAndCallCheck(address tokenOwner, address spender, uint tokens, bytes _data, uint fee, uint nonce, bytes sig, address feeAccount) public view returns (CheckResult result); function signedApproveAndCall(address tokenOwner, address spender, uint tokens, bytes _data, uint fee, uint nonce, bytes sig, address feeAccount) public returns (bool success); function mint(address tokenOwner, uint tokens, bool lockAccount) public returns (bool success); function unlockAccount(address tokenOwner) public; function disableMinting() public; function enableTransfers() public; // ------------------------------------------------------------------------ // signed{X}Check return status // ------------------------------------------------------------------------ enum CheckResult { Success, // 0 Success NotTransferable, // 1 Tokens not transferable yet AccountLocked, // 2 Account locked SignerMismatch, // 3 Mismatch in signing account InvalidNonce, // 4 Invalid nonce InsufficientApprovedTokens, // 5 Insufficient approved tokens InsufficientApprovedTokensForFees, // 6 Insufficient approved tokens for fees InsufficientTokens, // 7 Insufficient tokens InsufficientTokensForFees, // 8 Insufficient tokens for fees OverflowError // 9 Overflow error } } // ---------------------------------------------------------------------------- // BokkyPooBah's Token Teleportation Service Library v1.00 // // Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018. The MIT Licence. // ---------------------------------------------------------------------------- library BTTSLib { struct Data { bool initialised; // Ownership address owner; address newOwner; // Minting and management address minter; bool mintable; bool transferable; mapping(address => bool) accountLocked; // Token string symbol; string name; uint8 decimals; uint totalSupply; mapping(address => uint) balances; mapping(address => mapping(address => uint)) allowed; mapping(address => uint) nextNonce; } // ------------------------------------------------------------------------ // Constants // ------------------------------------------------------------------------ uint public constant bttsVersion = 110; bytes public constant signingPrefix = "\x19Ethereum Signed Message:\n32"; bytes4 public constant signedTransferSig = "\x75\x32\xea\xac"; bytes4 public constant signedApproveSig = "\xe9\xaf\xa7\xa1"; bytes4 public constant signedTransferFromSig = "\x34\x4b\xcc\x7d"; bytes4 public constant signedApproveAndCallSig = "\xf1\x6f\x9b\x53"; // ------------------------------------------------------------------------ // Event // ------------------------------------------------------------------------ event OwnershipTransferred(address indexed from, address indexed to); event MinterUpdated(address from, address to); event Mint(address indexed tokenOwner, uint tokens, bool lockAccount); event MintingDisabled(); event TransfersEnabled(); event AccountUnlocked(address indexed tokenOwner); event Transfer(address indexed from, address indexed to, uint tokens); event Approval(address indexed tokenOwner, address indexed spender, uint tokens); // ------------------------------------------------------------------------ // Initialisation // ------------------------------------------------------------------------ function init(Data storage self, address owner, string symbol, string name, uint8 decimals, uint initialSupply, bool mintable, bool transferable) public { require(!self.initialised); self.initialised = true; self.owner = owner; self.symbol = symbol; self.name = name; self.decimals = decimals; if (initialSupply > 0) { self.balances[owner] = initialSupply; self.totalSupply = initialSupply; Mint(self.owner, initialSupply, false); Transfer(address(0), self.owner, initialSupply); } self.mintable = mintable; self.transferable = transferable; } // ------------------------------------------------------------------------ // Safe maths, inspired by OpenZeppelin // ------------------------------------------------------------------------ function safeAdd(uint a, uint b) internal pure returns (uint c) { c = a + b; require(c >= a); } function safeSub(uint a, uint b) internal pure returns (uint c) { require(b <= a); c = a - b; } function safeMul(uint a, uint b) internal pure returns (uint c) { c = a * b; require(a == 0 || c / a == b); } function safeDiv(uint a, uint b) internal pure returns (uint c) { require(b > 0); c = a / b; } // ------------------------------------------------------------------------ // Ownership // ------------------------------------------------------------------------ function transferOwnership(Data storage self, address newOwner) public { require(msg.sender == self.owner); self.newOwner = newOwner; } function acceptOwnership(Data storage self) public { require(msg.sender == self.newOwner); OwnershipTransferred(self.owner, self.newOwner); self.owner = self.newOwner; self.newOwner = address(0); } function transferOwnershipImmediately(Data storage self, address newOwner) public { require(msg.sender == self.owner); OwnershipTransferred(self.owner, newOwner); self.owner = newOwner; self.newOwner = address(0); } // ------------------------------------------------------------------------ // Minting and management // ------------------------------------------------------------------------ function setMinter(Data storage self, address minter) public { require(msg.sender == self.owner); require(self.mintable); MinterUpdated(self.minter, minter); self.minter = minter; } function mint(Data storage self, address tokenOwner, uint tokens, bool lockAccount) public returns (bool success) { require(self.mintable); require(msg.sender == self.minter || msg.sender == self.owner); if (lockAccount) { self.accountLocked[tokenOwner] = true; } self.balances[tokenOwner] = safeAdd(self.balances[tokenOwner], tokens); self.totalSupply = safeAdd(self.totalSupply, tokens); Mint(tokenOwner, tokens, lockAccount); Transfer(address(0), tokenOwner, tokens); return true; } function unlockAccount(Data storage self, address tokenOwner) public { require(msg.sender == self.owner); require(self.accountLocked[tokenOwner]); self.accountLocked[tokenOwner] = false; AccountUnlocked(tokenOwner); } function disableMinting(Data storage self) public { require(self.mintable); require(msg.sender == self.minter || msg.sender == self.owner); self.mintable = false; if (self.minter != address(0)) { MinterUpdated(self.minter, address(0)); self.minter = address(0); } MintingDisabled(); } function enableTransfers(Data storage self) public { require(msg.sender == self.owner); require(!self.transferable); self.transferable = true; TransfersEnabled(); } // ------------------------------------------------------------------------ // Other functions // ------------------------------------------------------------------------ function transferAnyERC20Token(Data storage self, address tokenAddress, uint tokens) public returns (bool success) { require(msg.sender == self.owner); return ERC20Interface(tokenAddress).transfer(self.owner, tokens); } // ------------------------------------------------------------------------ // ecrecover from a signature rather than the signature in parts [v, r, s] // The signature format is a compact form {bytes32 r}{bytes32 s}{uint8 v}. // Compact means, uint8 is not padded to 32 bytes. // // An invalid signature results in the address(0) being returned, make // sure that the returned result is checked to be non-zero for validity // // Parts from https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d // ------------------------------------------------------------------------ function ecrecoverFromSig(bytes32 hash, bytes sig) public pure returns (address recoveredAddress) { bytes32 r; bytes32 s; uint8 v; if (sig.length != 65) return address(0); assembly { r := mload(add(sig, 32)) s := mload(add(sig, 64)) // Here we are loading the last 32 bytes. We exploit the fact that 'mload' will pad with zeroes if we overread. // There is no 'mload8' to do this, but that would be nicer. v := byte(0, mload(add(sig, 96))) } // Albeit non-transactional signatures are not specified by the YP, one would expect it to match the YP range of [27, 28] // geth uses [0, 1] and some clients have followed. This might change, see https://github.com/ethereum/go-ethereum/issues/2053 if (v < 27) { v += 27; } if (v != 27 && v != 28) return address(0); return ecrecover(hash, v, r, s); } // ------------------------------------------------------------------------ // Get CheckResult message // ------------------------------------------------------------------------ function getCheckResultMessage(Data storage /*self*/, BTTSTokenInterface.CheckResult result) public pure returns (string) { if (result == BTTSTokenInterface.CheckResult.Success) { return "Success"; } else if (result == BTTSTokenInterface.CheckResult.NotTransferable) { return "Tokens not transferable yet"; } else if (result == BTTSTokenInterface.CheckResult.AccountLocked) { return "Account locked"; } else if (result == BTTSTokenInterface.CheckResult.SignerMismatch) { return "Mismatch in signing account"; } else if (result == BTTSTokenInterface.CheckResult.InvalidNonce) { return "Invalid nonce"; } else if (result == BTTSTokenInterface.CheckResult.InsufficientApprovedTokens) { return "Insufficient approved tokens"; } else if (result == BTTSTokenInterface.CheckResult.InsufficientApprovedTokensForFees) { return "Insufficient approved tokens for fees"; } else if (result == BTTSTokenInterface.CheckResult.InsufficientTokens) { return "Insufficient tokens"; } else if (result == BTTSTokenInterface.CheckResult.InsufficientTokensForFees) { return "Insufficient tokens for fees"; } else if (result == BTTSTokenInterface.CheckResult.OverflowError) { return "Overflow error"; } else { return "Unknown error"; } } // ------------------------------------------------------------------------ // Token functions // ------------------------------------------------------------------------ function transfer(Data storage self, address to, uint tokens) public returns (bool success) { // Owner and minter can move tokens before the tokens are transferable require(self.transferable || (self.mintable && (msg.sender == self.owner || msg.sender == self.minter))); require(!self.accountLocked[msg.sender]); self.balances[msg.sender] = safeSub(self.balances[msg.sender], tokens); self.balances[to] = safeAdd(self.balances[to], tokens); Transfer(msg.sender, to, tokens); return true; } function approve(Data storage self, address spender, uint tokens) public returns (bool success) { require(!self.accountLocked[msg.sender]); self.allowed[msg.sender][spender] = tokens; Approval(msg.sender, spender, tokens); return true; } function transferFrom(Data storage self, address from, address to, uint tokens) public returns (bool success) { require(self.transferable); require(!self.accountLocked[from]); self.balances[from] = safeSub(self.balances[from], tokens); self.allowed[from][msg.sender] = safeSub(self.allowed[from][msg.sender], tokens); self.balances[to] = safeAdd(self.balances[to], tokens); Transfer(from, to, tokens); return true; } function approveAndCall(Data storage self, address spender, uint tokens, bytes data) public returns (bool success) { require(!self.accountLocked[msg.sender]); self.allowed[msg.sender][spender] = tokens; Approval(msg.sender, spender, tokens); ApproveAndCallFallBack(spender).receiveApproval(msg.sender, tokens, address(this), data); return true; } // ------------------------------------------------------------------------ // Signed function // ------------------------------------------------------------------------ function signedTransferHash(Data storage /*self*/, address tokenOwner, address to, uint tokens, uint fee, uint nonce) public view returns (bytes32 hash) { hash = keccak256(signedTransferSig, address(this), tokenOwner, to, tokens, fee, nonce); } function signedTransferCheck(Data storage self, address tokenOwner, address to, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public view returns (BTTSTokenInterface.CheckResult result) { if (!self.transferable) return BTTSTokenInterface.CheckResult.NotTransferable; bytes32 hash = signedTransferHash(self, tokenOwner, to, tokens, fee, nonce); if (tokenOwner == address(0) || tokenOwner != ecrecoverFromSig(keccak256(signingPrefix, hash), sig)) return BTTSTokenInterface.CheckResult.SignerMismatch; if (self.accountLocked[tokenOwner]) return BTTSTokenInterface.CheckResult.AccountLocked; if (self.nextNonce[tokenOwner] != nonce) return BTTSTokenInterface.CheckResult.InvalidNonce; uint total = safeAdd(tokens, fee); if (self.balances[tokenOwner] < tokens) return BTTSTokenInterface.CheckResult.InsufficientTokens; if (self.balances[tokenOwner] < total) return BTTSTokenInterface.CheckResult.InsufficientTokensForFees; if (self.balances[to] + tokens < self.balances[to]) return BTTSTokenInterface.CheckResult.OverflowError; if (self.balances[feeAccount] + fee < self.balances[feeAccount]) return BTTSTokenInterface.CheckResult.OverflowError; return BTTSTokenInterface.CheckResult.Success; } function signedTransfer(Data storage self, address tokenOwner, address to, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public returns (bool success) { require(self.transferable); bytes32 hash = signedTransferHash(self, tokenOwner, to, tokens, fee, nonce); require(tokenOwner != address(0) && tokenOwner == ecrecoverFromSig(keccak256(signingPrefix, hash), sig)); require(!self.accountLocked[tokenOwner]); require(self.nextNonce[tokenOwner] == nonce); self.nextNonce[tokenOwner] = nonce + 1; self.balances[tokenOwner] = safeSub(self.balances[tokenOwner], tokens); self.balances[to] = safeAdd(self.balances[to], tokens); Transfer(tokenOwner, to, tokens); self.balances[tokenOwner] = safeSub(self.balances[tokenOwner], fee); self.balances[feeAccount] = safeAdd(self.balances[feeAccount], fee); Transfer(tokenOwner, feeAccount, fee); return true; } function signedApproveHash(Data storage /*self*/, address tokenOwner, address spender, uint tokens, uint fee, uint nonce) public view returns (bytes32 hash) { hash = keccak256(signedApproveSig, address(this), tokenOwner, spender, tokens, fee, nonce); } function signedApproveCheck(Data storage self, address tokenOwner, address spender, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public view returns (BTTSTokenInterface.CheckResult result) { if (!self.transferable) return BTTSTokenInterface.CheckResult.NotTransferable; bytes32 hash = signedApproveHash(self, tokenOwner, spender, tokens, fee, nonce); if (tokenOwner == address(0) || tokenOwner != ecrecoverFromSig(keccak256(signingPrefix, hash), sig)) return BTTSTokenInterface.CheckResult.SignerMismatch; if (self.accountLocked[tokenOwner]) return BTTSTokenInterface.CheckResult.AccountLocked; if (self.nextNonce[tokenOwner] != nonce) return BTTSTokenInterface.CheckResult.InvalidNonce; if (self.balances[tokenOwner] < fee) return BTTSTokenInterface.CheckResult.InsufficientTokensForFees; if (self.balances[feeAccount] + fee < self.balances[feeAccount]) return BTTSTokenInterface.CheckResult.OverflowError; return BTTSTokenInterface.CheckResult.Success; } function signedApprove(Data storage self, address tokenOwner, address spender, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public returns (bool success) { require(self.transferable); bytes32 hash = signedApproveHash(self, tokenOwner, spender, tokens, fee, nonce); require(tokenOwner != address(0) && tokenOwner == ecrecoverFromSig(keccak256(signingPrefix, hash), sig)); require(!self.accountLocked[tokenOwner]); require(self.nextNonce[tokenOwner] == nonce); self.nextNonce[tokenOwner] = nonce + 1; self.allowed[tokenOwner][spender] = tokens; Approval(tokenOwner, spender, tokens); self.balances[tokenOwner] = safeSub(self.balances[tokenOwner], fee); self.balances[feeAccount] = safeAdd(self.balances[feeAccount], fee); Transfer(tokenOwner, feeAccount, fee); return true; } function signedTransferFromHash(Data storage /*self*/, address spender, address from, address to, uint tokens, uint fee, uint nonce) public view returns (bytes32 hash) { hash = keccak256(signedTransferFromSig, address(this), spender, from, to, tokens, fee, nonce); } function signedTransferFromCheck(Data storage self, address spender, address from, address to, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public view returns (BTTSTokenInterface.CheckResult result) { if (!self.transferable) return BTTSTokenInterface.CheckResult.NotTransferable; bytes32 hash = signedTransferFromHash(self, spender, from, to, tokens, fee, nonce); if (spender == address(0) || spender != ecrecoverFromSig(keccak256(signingPrefix, hash), sig)) return BTTSTokenInterface.CheckResult.SignerMismatch; if (self.accountLocked[from]) return BTTSTokenInterface.CheckResult.AccountLocked; if (self.nextNonce[spender] != nonce) return BTTSTokenInterface.CheckResult.InvalidNonce; uint total = safeAdd(tokens, fee); if (self.allowed[from][spender] < tokens) return BTTSTokenInterface.CheckResult.InsufficientApprovedTokens; if (self.allowed[from][spender] < total) return BTTSTokenInterface.CheckResult.InsufficientApprovedTokensForFees; if (self.balances[from] < tokens) return BTTSTokenInterface.CheckResult.InsufficientTokens; if (self.balances[from] < total) return BTTSTokenInterface.CheckResult.InsufficientTokensForFees; if (self.balances[to] + tokens < self.balances[to]) return BTTSTokenInterface.CheckResult.OverflowError; if (self.balances[feeAccount] + fee < self.balances[feeAccount]) return BTTSTokenInterface.CheckResult.OverflowError; return BTTSTokenInterface.CheckResult.Success; } function signedTransferFrom(Data storage self, address spender, address from, address to, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public returns (bool success) { require(self.transferable); bytes32 hash = signedTransferFromHash(self, spender, from, to, tokens, fee, nonce); require(spender != address(0) && spender == ecrecoverFromSig(keccak256(signingPrefix, hash), sig)); require(!self.accountLocked[from]); require(self.nextNonce[spender] == nonce); self.nextNonce[spender] = nonce + 1; self.balances[from] = safeSub(self.balances[from], tokens); self.allowed[from][spender] = safeSub(self.allowed[from][spender], tokens); self.balances[to] = safeAdd(self.balances[to], tokens); Transfer(from, to, tokens); self.balances[from] = safeSub(self.balances[from], fee); self.allowed[from][spender] = safeSub(self.allowed[from][spender], fee); self.balances[feeAccount] = safeAdd(self.balances[feeAccount], fee); Transfer(from, feeAccount, fee); return true; } function signedApproveAndCallHash(Data storage /*self*/, address tokenOwner, address spender, uint tokens, bytes data, uint fee, uint nonce) public view returns (bytes32 hash) { hash = keccak256(signedApproveAndCallSig, address(this), tokenOwner, spender, tokens, data, fee, nonce); } function signedApproveAndCallCheck(Data storage self, address tokenOwner, address spender, uint tokens, bytes data, uint fee, uint nonce, bytes sig, address feeAccount) public view returns (BTTSTokenInterface.CheckResult result) { if (!self.transferable) return BTTSTokenInterface.CheckResult.NotTransferable; bytes32 hash = signedApproveAndCallHash(self, tokenOwner, spender, tokens, data, fee, nonce); if (tokenOwner == address(0) || tokenOwner != ecrecoverFromSig(keccak256(signingPrefix, hash), sig)) return BTTSTokenInterface.CheckResult.SignerMismatch; if (self.accountLocked[tokenOwner]) return BTTSTokenInterface.CheckResult.AccountLocked; if (self.nextNonce[tokenOwner] != nonce) return BTTSTokenInterface.CheckResult.InvalidNonce; if (self.balances[tokenOwner] < fee) return BTTSTokenInterface.CheckResult.InsufficientTokensForFees; if (self.balances[feeAccount] + fee < self.balances[feeAccount]) return BTTSTokenInterface.CheckResult.OverflowError; return BTTSTokenInterface.CheckResult.Success; } function signedApproveAndCall(Data storage self, address tokenOwner, address spender, uint tokens, bytes data, uint fee, uint nonce, bytes sig, address feeAccount) public returns (bool success) { require(self.transferable); bytes32 hash = signedApproveAndCallHash(self, tokenOwner, spender, tokens, data, fee, nonce); require(tokenOwner != address(0) && tokenOwner == ecrecoverFromSig(keccak256(signingPrefix, hash), sig)); require(!self.accountLocked[tokenOwner]); require(self.nextNonce[tokenOwner] == nonce); self.nextNonce[tokenOwner] = nonce + 1; self.allowed[tokenOwner][spender] = tokens; Approval(tokenOwner, spender, tokens); self.balances[tokenOwner] = safeSub(self.balances[tokenOwner], fee); self.balances[feeAccount] = safeAdd(self.balances[feeAccount], fee); Transfer(tokenOwner, feeAccount, fee); ApproveAndCallFallBack(spender).receiveApproval(tokenOwner, tokens, address(this), data); return true; } } // ---------------------------------------------------------------------------- // BokkyPooBah's Token Teleportation Service Token v1.10 // // Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018. The MIT Licence. // ---------------------------------------------------------------------------- contract BTTSToken is BTTSTokenInterface { using BTTSLib for BTTSLib.Data; BTTSLib.Data data; // ------------------------------------------------------------------------ // Constructor // ------------------------------------------------------------------------ function BTTSToken(address owner, string symbol, string name, uint8 decimals, uint initialSupply, bool mintable, bool transferable) public { data.init(owner, symbol, name, decimals, initialSupply, mintable, transferable); } // ------------------------------------------------------------------------ // Ownership // ------------------------------------------------------------------------ function owner() public view returns (address) { return data.owner; } function newOwner() public view returns (address) { return data.newOwner; } function transferOwnership(address _newOwner) public { data.transferOwnership(_newOwner); } function acceptOwnership() public { data.acceptOwnership(); } function transferOwnershipImmediately(address _newOwner) public { data.transferOwnershipImmediately(_newOwner); } // ------------------------------------------------------------------------ // Token // ------------------------------------------------------------------------ function symbol() public view returns (string) { return data.symbol; } function name() public view returns (string) { return data.name; } function decimals() public view returns (uint8) { return data.decimals; } // ------------------------------------------------------------------------ // Minting and management // ------------------------------------------------------------------------ function minter() public view returns (address) { return data.minter; } function setMinter(address _minter) public { data.setMinter(_minter); } function mint(address tokenOwner, uint tokens, bool lockAccount) public returns (bool success) { return data.mint(tokenOwner, tokens, lockAccount); } function accountLocked(address tokenOwner) public view returns (bool) { return data.accountLocked[tokenOwner]; } function unlockAccount(address tokenOwner) public { data.unlockAccount(tokenOwner); } function mintable() public view returns (bool) { return data.mintable; } function transferable() public view returns (bool) { return data.transferable; } function disableMinting() public { data.disableMinting(); } function enableTransfers() public { data.enableTransfers(); } function nextNonce(address spender) public view returns (uint) { return data.nextNonce[spender]; } // ------------------------------------------------------------------------ // Other functions // ------------------------------------------------------------------------ function transferAnyERC20Token(address tokenAddress, uint tokens) public returns (bool success) { return data.transferAnyERC20Token(tokenAddress, tokens); } // ------------------------------------------------------------------------ // Don't accept ethers // ------------------------------------------------------------------------ function () public payable { revert(); } // ------------------------------------------------------------------------ // Token functions // ------------------------------------------------------------------------ function totalSupply() public view returns (uint) { return data.totalSupply - data.balances[address(0)]; } function balanceOf(address tokenOwner) public view returns (uint balance) { return data.balances[tokenOwner]; } function allowance(address tokenOwner, address spender) public view returns (uint remaining) { return data.allowed[tokenOwner][spender]; } function transfer(address to, uint tokens) public returns (bool success) { return data.transfer(to, tokens); } function approve(address spender, uint tokens) public returns (bool success) { return data.approve(spender, tokens); } function transferFrom(address from, address to, uint tokens) public returns (bool success) { return data.transferFrom(from, to, tokens); } function approveAndCall(address spender, uint tokens, bytes _data) public returns (bool success) { return data.approveAndCall(spender, tokens, _data); } // ------------------------------------------------------------------------ // Signed function // ------------------------------------------------------------------------ function signedTransferHash(address tokenOwner, address to, uint tokens, uint fee, uint nonce) public view returns (bytes32 hash) { return data.signedTransferHash(tokenOwner, to, tokens, fee, nonce); } function signedTransferCheck(address tokenOwner, address to, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public view returns (CheckResult result) { return data.signedTransferCheck(tokenOwner, to, tokens, fee, nonce, sig, feeAccount); } function signedTransfer(address tokenOwner, address to, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public returns (bool success) { return data.signedTransfer(tokenOwner, to, tokens, fee, nonce, sig, feeAccount); } function signedApproveHash(address tokenOwner, address spender, uint tokens, uint fee, uint nonce) public view returns (bytes32 hash) { return data.signedApproveHash(tokenOwner, spender, tokens, fee, nonce); } function signedApproveCheck(address tokenOwner, address spender, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public view returns (CheckResult result) { return data.signedApproveCheck(tokenOwner, spender, tokens, fee, nonce, sig, feeAccount); } function signedApprove(address tokenOwner, address spender, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public returns (bool success) { return data.signedApprove(tokenOwner, spender, tokens, fee, nonce, sig, feeAccount); } function signedTransferFromHash(address spender, address from, address to, uint tokens, uint fee, uint nonce) public view returns (bytes32 hash) { return data.signedTransferFromHash(spender, from, to, tokens, fee, nonce); } function signedTransferFromCheck(address spender, address from, address to, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public view returns (CheckResult result) { return data.signedTransferFromCheck(spender, from, to, tokens, fee, nonce, sig, feeAccount); } function signedTransferFrom(address spender, address from, address to, uint tokens, uint fee, uint nonce, bytes sig, address feeAccount) public returns (bool success) { return data.signedTransferFrom(spender, from, to, tokens, fee, nonce, sig, feeAccount); } function signedApproveAndCallHash(address tokenOwner, address spender, uint tokens, bytes _data, uint fee, uint nonce) public view returns (bytes32 hash) { return data.signedApproveAndCallHash(tokenOwner, spender, tokens, _data, fee, nonce); } function signedApproveAndCallCheck(address tokenOwner, address spender, uint tokens, bytes _data, uint fee, uint nonce, bytes sig, address feeAccount) public view returns (CheckResult result) { return data.signedApproveAndCallCheck(tokenOwner, spender, tokens, _data, fee, nonce, sig, feeAccount); } function signedApproveAndCall(address tokenOwner, address spender, uint tokens, bytes _data, uint fee, uint nonce, bytes sig, address feeAccount) public returns (bool success) { return data.signedApproveAndCall(tokenOwner, spender, tokens, _data, fee, nonce, sig, feeAccount); } } // ---------------------------------------------------------------------------- // Owned contract // ---------------------------------------------------------------------------- contract Owned { address public owner; address public newOwner; event OwnershipTransferred(address indexed _from, address indexed _to); function Owned() public { owner = msg.sender; } modifier onlyOwner { require(msg.sender == owner); _; } function transferOwnership(address _newOwner) public onlyOwner { newOwner = _newOwner; } function acceptOwnership() public { require(msg.sender == newOwner); OwnershipTransferred(owner, newOwner); owner = newOwner; newOwner = address(0); } function transferOwnershipImmediately(address _newOwner) public onlyOwner { OwnershipTransferred(owner, _newOwner); owner = _newOwner; newOwner = address(0); } } // ---------------------------------------------------------------------------- // BokkyPooBah's Token Teleportation Service Token Factory v1.10 // // Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018. The MIT Licence. // ---------------------------------------------------------------------------- contract BTTSTokenFactory is Owned { // ------------------------------------------------------------------------ // Internal data // ------------------------------------------------------------------------ mapping(address => bool) _verify; address[] public deployedTokens; // ------------------------------------------------------------------------ // Event // ------------------------------------------------------------------------ event BTTSTokenListing(address indexed ownerAddress, address indexed bttsTokenAddress, string symbol, string name, uint8 decimals, uint initialSupply, bool mintable, bool transferable); // ------------------------------------------------------------------------ // Anyone can call this method to verify whether the bttsToken contract at // the specified address was deployed using this factory // // Parameters: // tokenContract the bttsToken contract address // // Return values: // valid did this BTTSTokenFactory create the BTTSToken contract? // decimals number of decimal places for the token contract // initialSupply the token initial supply // mintable is the token mintable after deployment? // transferable are the tokens transferable after deployment? // ------------------------------------------------------------------------ function verify(address tokenContract) public view returns ( bool valid, address owner, uint decimals, bool mintable, bool transferable ) { valid = _verify[tokenContract]; if (valid) { BTTSToken t = BTTSToken(tokenContract); owner = t.owner(); decimals = t.decimals(); mintable = t.mintable(); transferable = t.transferable(); } } // ------------------------------------------------------------------------ // Any account can call this method to deploy a new BTTSToken contract. // The owner of the BTTSToken contract will be the calling account // // Parameters: // symbol symbol // name name // decimals number of decimal places for the token contract // initialSupply the token initial supply // mintable is the token mintable after deployment? // transferable are the tokens transferable after deployment? // // For example, deploying a BTTSToken contract with `initialSupply` of // 1,000.000000000000000000 tokens: // symbol "ME" // name "My Token" // decimals 18 // initialSupply 10000000000000000000000 = 1,000.000000000000000000 // tokens // mintable can tokens be minted after deployment? // transferable are the tokens transferable after deployment? // // The BTTSTokenListing() event is logged with the following parameters // owner the account that execute this transaction // symbol symbol // name name // decimals number of decimal places for the token contract // initialSupply the token initial supply // mintable can tokens be minted after deployment? // transferable are the tokens transferable after deployment? // ------------------------------------------------------------------------ function deployBTTSTokenContract( string symbol, string name, uint8 decimals, uint initialSupply, bool mintable, bool transferable ) public returns (address bttsTokenAddress) { bttsTokenAddress = new BTTSToken( msg.sender, symbol, name, decimals, initialSupply, mintable, transferable); // Record that this factory created the trader _verify[bttsTokenAddress] = true; deployedTokens.push(bttsTokenAddress); BTTSTokenListing(msg.sender, bttsTokenAddress, symbol, name, decimals, initialSupply, mintable, transferable); } // ------------------------------------------------------------------------ // Number of deployed tokens // ------------------------------------------------------------------------ function numberOfDeployedTokens() public view returns (uint) { return deployedTokens.length; } // ------------------------------------------------------------------------ // Factory owner can transfer out any accidentally sent ERC20 tokens // // Parameters: // tokenAddress contract address of the token contract being withdrawn // from // tokens number of tokens // ------------------------------------------------------------------------ function transferAnyERC20Token(address tokenAddress, uint tokens) public onlyOwner returns (bool success) { return ERC20Interface(tokenAddress).transfer(owner, tokens); } // ------------------------------------------------------------------------ // Don't accept ethers // ------------------------------------------------------------------------ function () public payable { revert(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"to","type":"address"},{"name":"tokens","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"tokenOwner","type":"address"},{"name":"spender","type":"address"},{"name":"tokens","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"sig","type":"bytes"},{"name":"feeAccount","type":"address"}],"name":"signedApprove","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"spender","type":"address"},{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokens","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"sig","type":"bytes"},{"name":"feeAccount","type":"address"}],"name":"signedTransferFromCheck","outputs":[{"name":"result","type":"BTTSTokenInterface.CheckResult"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"signedApproveAndCallSig","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"owner","type":"address"},{"name":"symbol","type":"string"},{"name":"name","type":"string"},{"name":"decimals","type":"uint8"},{"name":"initialSupply","type":"uint256"},{"name":"mintable","type":"bool"},{"name":"transferable","type":"bool"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"BTTSLib.Data storage"},{"name":"tokenOwner","type":"address"},{"name":"spender","type":"address"},{"name":"tokens","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"nonce","type":"uint256"}],"name":"signedApproveHash","outputs":[{"name":"hash","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"tokenOwner","type":"address"},{"name":"to","type":"address"},{"name":"tokens","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"sig","type":"bytes"},{"name":"feeAccount","type":"address"}],"name":"signedTransfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"minter","type":"address"}],"name":"setMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"spender","type":"address"},{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokens","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"sig","type":"bytes"},{"name":"feeAccount","type":"address"}],"name":"signedTransferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"signedTransferSig","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokens","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"tokenAddress","type":"address"},{"name":"tokens","type":"uint256"}],"name":"transferAnyERC20Token","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"spender","type":"address"},{"name":"tokens","type":"uint256"},{"name":"data","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"BTTSLib.Data storage"},{"name":"spender","type":"address"},{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokens","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"nonce","type":"uint256"}],"name":"signedTransferFromHash","outputs":[{"name":"hash","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"BTTSLib.Data storage"},{"name":"tokenOwner","type":"address"},{"name":"to","type":"address"},{"name":"tokens","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"nonce","type":"uint256"}],"name":"signedTransferHash","outputs":[{"name":"hash","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bttsVersion","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"newOwner","type":"address"}],"name":"transferOwnershipImmediately","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"}],"name":"enableTransfers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"tokenOwner","type":"address"},{"name":"tokens","type":"uint256"},{"name":"lockAccount","type":"bool"}],"name":"mint","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"signedApproveSig","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"tokenOwner","type":"address"}],"name":"unlockAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"tokenOwner","type":"address"},{"name":"spender","type":"address"},{"name":"tokens","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"sig","type":"bytes"},{"name":"feeAccount","type":"address"}],"name":"signedApproveCheck","outputs":[{"name":"result","type":"BTTSTokenInterface.CheckResult"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"spender","type":"address"},{"name":"tokens","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"signedTransferFromSig","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"BTTSLib.Data storage"},{"name":"result","type":"BTTSTokenInterface.CheckResult"}],"name":"getCheckResultMessage","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"hash","type":"bytes32"},{"name":"sig","type":"bytes"}],"name":"ecrecoverFromSig","outputs":[{"name":"recoveredAddress","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"tokenOwner","type":"address"},{"name":"spender","type":"address"},{"name":"tokens","type":"uint256"},{"name":"data","type":"bytes"},{"name":"fee","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"sig","type":"bytes"},{"name":"feeAccount","type":"address"}],"name":"signedApproveAndCallCheck","outputs":[{"name":"result","type":"BTTSTokenInterface.CheckResult"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"signingPrefix","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"}],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"BTTSLib.Data storage"},{"name":"tokenOwner","type":"address"},{"name":"spender","type":"address"},{"name":"tokens","type":"uint256"},{"name":"data","type":"bytes"},{"name":"fee","type":"uint256"},{"name":"nonce","type":"uint256"}],"name":"signedApproveAndCallHash","outputs":[{"name":"hash","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"tokenOwner","type":"address"},{"name":"to","type":"address"},{"name":"tokens","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"sig","type":"bytes"},{"name":"feeAccount","type":"address"}],"name":"signedTransferCheck","outputs":[{"name":"result","type":"BTTSTokenInterface.CheckResult"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"},{"name":"tokenOwner","type":"address"},{"name":"spender","type":"address"},{"name":"tokens","type":"uint256"},{"name":"data","type":"bytes"},{"name":"fee","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"sig","type":"bytes"},{"name":"feeAccount","type":"address"}],"name":"signedApproveAndCall","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"self","type":"BTTSLib.Data storage"}],"name":"disableMinting","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"}],"name":"MinterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenOwner","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"},{"indexed":false,"name":"lockAccount","type":"bool"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintingDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"TransfersEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenOwner","type":"address"}],"name":"AccountUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenOwner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"Approval","type":"event"}]
Contract Creation Code
6060604052341561000f57600080fd5b6132c38061001e6000396000f3006060604052600436106101925763ffffffff60e060020a60003504166306ad0e7b811461019757806306fc8397146101c557806311a44a6b1461023d578063233907a3146102df57806335659df9146103045780633c0734a3146103bb57806340c3e55b146103f35780635250afa11461046b5780635b08c4d8146104825780635b1ea8581461050057806364850de51461050857806367b996541461051f5780637512eb851461053f5780637f3f30bf146105595780638099f6cb146105b6578063836be758146105e257806389443aac146106085780638fedeca614610610578063976f56a5146106275780639fb6f52614610632578063a3fc136a14610651578063b39d0e0914610659578063b457c85f14610670578063bed568f7146106e8578063c14a932f14610702578063c3af8bcb1461070a578063d4acaf6c14610792578063e0ccb749146107f9578063e2cc7a51146108b4578063ea300bda146108bc578063ed3b174b146108c7578063f12d346e14610933578063f134977b146109ab578063f72cb00a14610a66575b600080fd5b6101b1600435600160a060020a0360243516604435610a71565b604051901515815260200160405180910390f35b6101b16004803590600160a060020a036024803582169260443590921691606435916084359160a4359160e49060c43590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a03169250610bab915050565b6102bb6004803590600160a060020a036024803582169260443583169260643516916084359160a4359160c43591906101049060e43590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a03169250610df7915050565b604051808260098111156102cb57fe5b60ff16815260200191505060405180910390f35b6102e76110ad565b604051600160e060020a0319909116815260200160405180910390f35b6103b9600480359060248035600160a060020a0316919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496505050833560ff16936020810135935060408101351515925060600135151590506110d1565b005b6103e1600435600160a060020a036024358116906044351660643560843560a43561125b565b60405190815260200160405180910390f35b6101b16004803590600160a060020a036024803582169260443590921691606435916084359160a4359160e49060c43590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a031692506112fc915050565b6103b9600435600160a060020a03602435166114d6565b6101b16004803590600160a060020a036024803582169260443583169260643516916084359160a4359160c43591906101049060e43590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a03169250611595915050565b6102e76118a5565b6103b9600435600160a060020a03602435166118c9565b6101b1600435600160a060020a036024358116906044351660643561191a565b6101b1600435600160a060020a0360243516604435611a5b565b6101b1600480359060248035600160a060020a0316916044359160849060643590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650611b0795505050505050565b6103e1600435600160a060020a036024358116906044358116906064351660843560a43560c435611c84565b6103e1600435600160a060020a036024358116906044351660643560843560a435611d31565b6103e1611dd2565b6103b9600435600160a060020a0360243516611dd7565b6103b9600435611e84565b6101b1600435600160a060020a03602435166044356064351515611f12565b6102e7612069565b6103b9600435600160a060020a036024351661208d565b6102bb6004803590600160a060020a036024803582169260443590921691606435916084359160a4359160e49060c43590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a03169250612128915050565b6101b1600435600160a060020a03602435166044356122a5565b6102e7612327565b61071b60043560ff6024351661234b565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561075757808201518382015260200161073f565b50505050905090810190601f1680156107845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6107dd600480359060446024803590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506126cf95505050505050565b604051600160a060020a03909116815260200160405180910390f35b6102bb6004803590600160a060020a0360248035821692604435909216916064359160a49060843590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094968635966020808201359750919550606081019450604090810135860180830194503592508291601f83018190048102019051908101604052818152929190602084018383808284375094965050509235600160a060020a031692506127af915050565b61071b61292e565b6103b9600435612953565b6103e16004803590600160a060020a0360248035821692604435909216916064359160a49060843590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050843594602001359350612a0592505050565b6102bb6004803590600160a060020a036024803582169260443590921691606435916084359160a4359160e49060c43590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a03169250612af0915050565b6101b16004803590600160a060020a0360248035821692604435909216916064359160a49060843590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094968635966020808201359750919550606081019450604090810135860180830194503592508291601f83018190048102019051908101604052818152929190602084018383808284375094965050509235600160a060020a03169250612cd9915050565b6103b960043561303b565b600283015460009060a860020a900460ff1680610ad05750600284015460a060020a900460ff168015610ad05750835433600160a060020a03908116610100909204161480610ad05750600284015433600160a060020a039081169116145b1515610adb57600080fd5b600160a060020a033316600090815260038501602052604090205460ff1615610b0357600080fd5b600160a060020a0333166000908152600885016020526040902054610b289083613165565b600160a060020a0333811660009081526008870160205260408082209390935590851681522054610b59908361317a565b600160a060020a03808516600081815260088801602052604090819020939093559133909116906000805160206132588339815191529085905190815260200160405180910390a35060019392505050565b6002880154600090819060a860020a900460ff161515610bca57600080fd5b610bd88a8a8a8a8a8a61125b565b9050600160a060020a03891615801590610c905750610c7b6040805190810160405280601c8152602001600080516020613238833981519152815250826040518083805190602001908083835b60208310610c445780518252601f199092019160209182019101610c25565b6001836020036101000a038019825116818451161790925250505091909101928352505060200190506040518091039020856126cf565b600160a060020a031689600160a060020a0316145b1515610c9b57600080fd5b600160a060020a038916600090815260038b01602052604090205460ff1615610cc357600080fd5b600160a060020a0389166000908152600a8b0160205260409020548514610ce957600080fd5b600160a060020a03808a166000818152600a8d016020908152604080832060018b01905560098f018252808320948d1680845294909152908190208a9055600080516020613278833981519152908a905190815260200160405180910390a3600160a060020a038916600090815260088b016020526040902054610d6d9087613165565b600160a060020a03808b16600090815260088d0160205260408082209390935590851681522054610d9e908761317a565b600160a060020a03808516600081815260088e016020526040908190209390935591908b16906000805160206132588339815191529089905190815260200160405180910390a3600191505b5098975050505050505050565b60008060008b60020160159054906101000a900460ff161515610e1d576001925061109e565b610e2c8c8c8c8c8c8c8c611c84565b9150600160a060020a038b161580610ee35750610ecd6040805190810160405280601c8152602001600080516020613238833981519152815250836040518083805190602001908083835b60208310610e965780518252601f199092019160209182019101610e77565b6001836020036101000a038019825116818451161790925250505091909101928352505060200190506040518091039020866126cf565b600160a060020a03168b600160a060020a031614155b15610ef1576003925061109e565b600160a060020a038a16600090815260038d01602052604090205460ff1615610f1d576002925061109e565b600160a060020a038b166000908152600a8d0160205260409020548614610f47576004925061109e565b610f51888861317a565b9050878c60090160008c600160a060020a0316600160a060020a0316815260200190815260200160002060008d600160a060020a0316600160a060020a03168152602001908152602001600020541015610fae576005925061109e565b600160a060020a03808b16600090815260098e0160209081526040808320938f168352929052205481901015610fe7576006925061109e565b600160a060020a038a16600090815260088d01602052604090205488901015611013576007925061109e565b600160a060020a038a16600090815260088d0160205260409020548190101561103f576008925061109e565b600160a060020a038916600090815260088d016020526040902054888101101561106c576009925061109e565b600160a060020a038416600090815260088d0160205260409020548781011015611099576009925061109e565b600092505b50509998505050505050505050565b7ff16f9b530000000000000000000000000000000000000000000000000000000081565b875460ff16156110e057600080fd5b8754600160ff199091161774ffffffffffffffffffffffffffffffffffffffff001916610100600160a060020a038916021788556004880186805161112992916020019061318a565b506005880185805161113f92916020019061318a565b5060068801805460ff191660ff861617905560008311156111fa57600160a060020a03808816600090815260088a01602052604080822086905560078b018690558a546101009004909216917ff9288aa3c16d157f87dbf24b824f702d4c76887d38e8fd6ef8212ad19a712aee91869151918252151560208201526040908101905180910390a287546101009004600160a060020a031660006000805160206132588339815191528560405190815260200160405180910390a35b6002909701805497151560a860020a0275ff0000000000000000000000000000000000000000001992151560a060020a0274ff0000000000000000000000000000000000000000199099169890981791909116969096179095555050505050565b60007fe9afa7a100000000000000000000000000000000000000000000000000000000308787878787604051600160e060020a031990971687526c01000000000000000000000000600160a060020a03968716810260048901529486168502601888015292909416909202602c8501526040808501929092526060840192909252608083019190915260a09091019051809103902090509695505050505050565b6002880154600090819060a860020a900460ff16151561131b57600080fd5b6113298a8a8a8a8a8a611d31565b9050600160a060020a038916158015906113a957506113946040805190810160405280601c81526020016000805160206132388339815191528152508260405180838051906020019080838360208310610c445780518252601f199092019160209182019101610c25565b600160a060020a031689600160a060020a0316145b15156113b457600080fd5b600160a060020a038916600090815260038b01602052604090205460ff16156113dc57600080fd5b600160a060020a0389166000908152600a8b016020526040902054851461140257600080fd5b600160a060020a0389166000908152600a8b016020908152604080832060018901905560088d019091529020546114399088613165565b600160a060020a03808b16600090815260088d01602052604080822093909355908a168152205461146a908861317a565b600160a060020a03808a16600081815260088e016020526040908190209390935591908b1690600080516020613258833981519152908a905190815260200160405180910390a3600160a060020a038916600090815260088b016020526040902054610d6d9087613165565b815433600160a060020a0390811661010090920416146114f557600080fd5b600282015460a060020a900460ff16151561150f57600080fd5b60028201547f1cf2de25c5bf439ac0287061c3a0fa69b3b02867d0ccfd2ded34e42577050b7390600160a060020a031682604051600160a060020a039283168152911660208201526040908101905180910390a1600291909101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b6002890154600090819060a860020a900460ff1615156115b457600080fd5b6115c38b8b8b8b8b8b8b611c84565b9050600160a060020a038a1615801590611643575061162e6040805190810160405280601c81526020016000805160206132388339815191528152508260405180838051906020019080838360208310610c445780518252601f199092019160209182019101610c25565b600160a060020a03168a600160a060020a0316145b151561164e57600080fd5b600160a060020a038916600090815260038c01602052604090205460ff161561167657600080fd5b600160a060020a038a166000908152600a8c016020526040902054851461169c57600080fd5b600160a060020a03808b166000908152600a8d016020908152604080832060018a019055928c16825260088e01905220546116d79088613165565b600160a060020a03808b16600090815260088e01602090815260408083209490945560098f018152838220928e1682529190915220546117179088613165565b600160a060020a03808b16600090815260098e01602090815260408083208f85168452825280832094909455918b16815260088e01909152205461175b908861317a565b600160a060020a03808a16600081815260088f016020526040908190209390935591908b1690600080516020613258833981519152908a905190815260200160405180910390a3600160a060020a038916600090815260088c0160205260409020546117c79087613165565b600160a060020a03808b16600090815260088e01602090815260408083209490945560098f018152838220928e1682529190915220546118079087613165565b600160a060020a03808b16600090815260098e01602090815260408083208f85168452825280832094909455918616815260088e01909152205461184b908761317a565b600160a060020a03808516600081815260088f016020526040908190209390935591908b16906000805160206132588339815191529089905190815260200160405180910390a3600191505b509998505050505050505050565b7f7532eaac0000000000000000000000000000000000000000000000000000000081565b815433600160a060020a0390811661010090920416146118e857600080fd5b600191909101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600284015460009060a860020a900460ff16151561193757600080fd5b600160a060020a038416600090815260038601602052604090205460ff161561195f57600080fd5b600160a060020a03841660009081526008860160205260409020546119849083613165565b600160a060020a0380861660009081526008880160209081526040808320949094556009890181528382203390931682529190915220546119c59083613165565b600160a060020a038086166000908152600988016020908152604080832033851684528252808320949094559186168152600888019091522054611a09908361317a565b600160a060020a038085166000818152600889016020526040908190209390935591908616906000805160206132588339815191529085905190815260200160405180910390a3506001949350505050565b825460009033600160a060020a039081166101009092041614611a7d57600080fd5b8354600160a060020a038085169163a9059cbb91610100909104168460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611ae557600080fd5b6102c65a03f11515611af657600080fd5b505050604051805195945050505050565b600160a060020a033316600090815260038501602052604081205460ff1615611b2f57600080fd5b600160a060020a033381166000818152600988016020908152604080832094891680845294909152908190208690556000805160206132788339815191529086905190815260200160405180910390a383600160a060020a0316638f4ffcb1338530866040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611c17578082015183820152602001611bff565b50505050905090810190601f168015611c445780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1515611c6557600080fd5b6102c65a03f11515611c7657600080fd5b506001979650505050505050565b60007f344bcc7d0000000000000000000000000000000000000000000000000000000030888888888888604051600160e060020a031990981688526c01000000000000000000000000600160a060020a03978816810260048a0152958716860260188901529386168502602c8801529190941690920260408086019190915260548501939093526074840191909152609483015260b4909101905180910390209050979650505050505050565b60007f7532eaac00000000000000000000000000000000000000000000000000000000308787878787604051600160e060020a031990971687526c01000000000000000000000000600160a060020a03968716810260048901529486168502601888015292909416909202602c8501526040808501929092526060840192909252608083019190915260a09091019051809103902090509695505050505050565b606e81565b815433600160a060020a039081166101009092041614611df657600080fd5b8154600160a060020a03808316916101009004167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38154600160a060020a039091166101000274ffffffffffffffffffffffffffffffffffffffff0019909116178155600101805473ffffffffffffffffffffffffffffffffffffffff19169055565b805433600160a060020a039081166101009092041614611ea357600080fd5b600281015460a860020a900460ff1615611ebc57600080fd5b60028101805475ff000000000000000000000000000000000000000000191660a860020a1790557feadb24812ab3c9a55c774958184293ebdb6c7f6a2dbab11f397d80c86feb65d360405160405180910390a150565b600284015460009060a060020a900460ff161515611f2f57600080fd5b600285015433600160a060020a0390811691161480611f605750845433600160a060020a0390811661010090920416145b1515611f6b57600080fd5b8115611f9757600160a060020a03841660009081526003860160205260409020805460ff191660011790555b600160a060020a0384166000908152600886016020526040902054611fbc908461317a565b600160a060020a03851660009081526008870160205260409020556007850154611fe6908461317a565b6007860155600160a060020a0384167ff9288aa3c16d157f87dbf24b824f702d4c76887d38e8fd6ef8212ad19a712aee8484604051918252151560208201526040908101905180910390a2600160a060020a03841660006000805160206132588339815191528560405190815260200160405180910390a3506001949350505050565b7fe9afa7a10000000000000000000000000000000000000000000000000000000081565b815433600160a060020a0390811661010090920416146120ac57600080fd5b600160a060020a038116600090815260038301602052604090205460ff1615156120d557600080fd5b600160a060020a038116600081815260038401602052604090819020805460ff191690557fb7df7ef889418eecc895118f0d863c3074abf7769bfe39ba852192114c725dfc905160405180910390a25050565b6002880154600090819060a860020a900460ff16151561214b5760019150610dea565b6121598a8a8a8a8a8a61125b565b9050600160a060020a03891615806121d857506121c26040805190810160405280601c81526020016000805160206132388339815191528152508260405180838051906020019080838360208310610c445780518252601f199092019160209182019101610c25565b600160a060020a031689600160a060020a031614155b156121e65760039150610dea565b600160a060020a038916600090815260038b01602052604090205460ff16156122125760029150610dea565b600160a060020a0389166000908152600a8b016020526040902054851461223c5760049150610dea565b600160a060020a038916600090815260088b016020526040902054869010156122685760089150610dea565b600160a060020a038316600090815260088b01602052604090205486810110156122955760099150610dea565b5060009998505050505050505050565b600160a060020a033316600090815260038401602052604081205460ff16156122cd57600080fd5b600160a060020a033381166000818152600987016020908152604080832094881680845294909152908190208590556000805160206132788339815191529085905190815260200160405180910390a35060019392505050565b7f344bcc7d0000000000000000000000000000000000000000000000000000000081565b612353613208565b600082600981111561236157fe5b14156123a25760408051908101604052600781527f5375636365737300000000000000000000000000000000000000000000000000602082015290506126c9565b60018260098111156123b057fe5b14156123f15760408051908101604052601b81527f546f6b656e73206e6f74207472616e7366657261626c65207965740000000000602082015290506126c9565b60028260098111156123ff57fe5b14156124405760408051908101604052600e81527f4163636f756e74206c6f636b6564000000000000000000000000000000000000602082015290506126c9565b600382600981111561244e57fe5b141561248f5760408051908101604052601b81527f4d69736d6174636820696e207369676e696e67206163636f756e740000000000602082015290506126c9565b600482600981111561249d57fe5b14156124de5760408051908101604052600d81527f496e76616c6964206e6f6e636500000000000000000000000000000000000000602082015290506126c9565b60058260098111156124ec57fe5b141561252d5760408051908101604052601c81527f496e73756666696369656e7420617070726f76656420746f6b656e7300000000602082015290506126c9565b600682600981111561253b57fe5b14156125a557606060405190810160405280602581526020017f496e73756666696369656e7420617070726f76656420746f6b656e7320666f7281526020017f206665657300000000000000000000000000000000000000000000000000000081525090506126c9565b60078260098111156125b357fe5b14156125f45760408051908101604052601381527f496e73756666696369656e7420746f6b656e7300000000000000000000000000602082015290506126c9565b600882600981111561260257fe5b14156126435760408051908101604052601c81527f496e73756666696369656e7420746f6b656e7320666f72206665657300000000602082015290506126c9565b600982600981111561265157fe5b14156126925760408051908101604052600e81527f4f766572666c6f77206572726f72000000000000000000000000000000000000602082015290506126c9565b60408051908101604052600d81527f556e6b6e6f776e206572726f7200000000000000000000000000000000000000602082015290505b92915050565b60008060008084516041146126e757600093506127a6565b6020850151925060408501519150606085015160001a9050601b8160ff16101561270f57601b015b8060ff16601b1415801561272757508060ff16601c14155b1561273557600093506127a6565b6001868285856040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f1151561279a57600080fd5b50506020604051035193505b50505092915050565b6002890154600090819060a860020a900460ff1615156127d25760019150611897565b6127e18b8b8b8b8b8b8b612a05565b9050600160a060020a038a161580612860575061284a6040805190810160405280601c81526020016000805160206132388339815191528152508260405180838051906020019080838360208310610c445780518252601f199092019160209182019101610c25565b600160a060020a03168a600160a060020a031614155b1561286e5760039150611897565b600160a060020a038a16600090815260038c01602052604090205460ff161561289a5760029150611897565b600160a060020a038a166000908152600a8c01602052604090205485146128c45760049150611897565b600160a060020a038a16600090815260088c016020526040902054869010156128f05760089150611897565b600160a060020a038316600090815260088c016020526040902054868101101561291d5760099150611897565b5060009a9950505050505050505050565b60408051908101604052601c8152600080516020613238833981519152602082015281565b600181015433600160a060020a0390811691161461297057600080fd5b60018101548154600160a060020a0391821691610100909104167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600181018054825474ffffffffffffffffffffffffffffffffffffffff001916610100600160a060020a038316021790925573ffffffffffffffffffffffffffffffffffffffff199091169055565b60007ff16f9b530000000000000000000000000000000000000000000000000000000030888888888888604051600160e060020a0319891681526c01000000000000000000000000600160a060020a03808a168202600484015288811682026018840152871602602c820152604081018590526060810184805190602001908083835b60208310612aa75780518252601f199092019160209182019101612a88565b6001836020036101000a03801982511681845116179092525050509190910193845250506020820152604090810196509450505050505180910390209050979650505050505050565b60008060008a60020160159054906101000a900460ff161515612b165760019250612ccb565b612b248b8b8b8b8b8b611d31565b9150600160a060020a038a161580612ba35750612b8d6040805190810160405280601c81526020016000805160206132388339815191528152508360405180838051906020019080838360208310610e965780518252601f199092019160209182019101610e77565b600160a060020a03168a600160a060020a031614155b15612bb15760039250612ccb565b600160a060020a038a16600090815260038c01602052604090205460ff1615612bdd5760029250612ccb565b600160a060020a038a166000908152600a8c0160205260409020548614612c075760049250612ccb565b612c11888861317a565b600160a060020a038b16600090815260088d01602052604090205490915088901015612c405760079250612ccb565b600160a060020a038a16600090815260088c01602052604090205481901015612c6c5760089250612ccb565b600160a060020a038916600090815260088c0160205260409020548881011015612c995760099250612ccb565b600160a060020a038416600090815260088c0160205260409020548781011015612cc65760099250612ccb565b600092505b505098975050505050505050565b6002890154600090819060a860020a900460ff161515612cf857600080fd5b612d078b8b8b8b8b8b8b612a05565b9050600160a060020a038a1615801590612d875750612d726040805190810160405280601c81526020016000805160206132388339815191528152508260405180838051906020019080838360208310610c445780518252601f199092019160209182019101610c25565b600160a060020a03168a600160a060020a0316145b1515612d9257600080fd5b600160a060020a038a16600090815260038c01602052604090205460ff1615612dba57600080fd5b600160a060020a038a166000908152600a8c0160205260409020548514612de057600080fd5b846001018b600a0160008c600160a060020a0316600160a060020a0316815260200190815260200160002081905550878b60090160008c600160a060020a0316600160a060020a0316815260200190815260200160002060008b600160a060020a0316600160a060020a031681526020019081526020016000208190555088600160a060020a03168a600160a060020a03166000805160206132788339815191528a60405190815260200160405180910390a3600160a060020a038a16600090815260088c016020526040902054612eb89087613165565b600160a060020a03808c16600090815260088e0160205260408082209390935590851681522054612ee9908761317a565b600160a060020a03808516600081815260088f016020526040908190209390935591908c16906000805160206132588339815191529089905190815260200160405180910390a388600160a060020a0316638f4ffcb18b8a308b6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612fc8578082015183820152602001612fb0565b50505050905090810190601f168015612ff55780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b151561301657600080fd5b6102c65a03f1151561302757600080fd5b5060019d9c50505050505050505050505050565b600281015460a060020a900460ff16151561305557600080fd5b600281015433600160a060020a03908116911614806130865750805433600160a060020a0390811661010090920416145b151561309157600080fd5b60028101805474ff0000000000000000000000000000000000000000198116909155600160a060020a0316156131365760028101547f1cf2de25c5bf439ac0287061c3a0fa69b3b02867d0ccfd2ded34e42577050b7390600160a060020a03166000604051600160a060020a039283168152911660208201526040908101905180910390a160028101805473ffffffffffffffffffffffffffffffffffffffff191690555b7faf79b4370f6af9d950564bbe6b81f7f0834c003c455db9248f4e55e6bf865eb760405160405180910390a150565b60008282111561317457600080fd5b50900390565b818101828110156126c957600080fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106131cb57805160ff19168380011785556131f8565b828001600101855582156131f8579182015b828111156131f85782518255916020019190600101906131dd565b5061320492915061321a565b5090565b60206040519081016040526000815290565b61323491905b808211156132045760008155600101613220565b90560019457468657265756d205369676e6564204d6573736167653a0a333200000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a165627a7a72305820dbfaee8587da7b0e992e6332a324e4030afb395056213feb9e391cfb4d2104c30029
Deployed Bytecode
0x6060604052600436106101925763ffffffff60e060020a60003504166306ad0e7b811461019757806306fc8397146101c557806311a44a6b1461023d578063233907a3146102df57806335659df9146103045780633c0734a3146103bb57806340c3e55b146103f35780635250afa11461046b5780635b08c4d8146104825780635b1ea8581461050057806364850de51461050857806367b996541461051f5780637512eb851461053f5780637f3f30bf146105595780638099f6cb146105b6578063836be758146105e257806389443aac146106085780638fedeca614610610578063976f56a5146106275780639fb6f52614610632578063a3fc136a14610651578063b39d0e0914610659578063b457c85f14610670578063bed568f7146106e8578063c14a932f14610702578063c3af8bcb1461070a578063d4acaf6c14610792578063e0ccb749146107f9578063e2cc7a51146108b4578063ea300bda146108bc578063ed3b174b146108c7578063f12d346e14610933578063f134977b146109ab578063f72cb00a14610a66575b600080fd5b6101b1600435600160a060020a0360243516604435610a71565b604051901515815260200160405180910390f35b6101b16004803590600160a060020a036024803582169260443590921691606435916084359160a4359160e49060c43590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a03169250610bab915050565b6102bb6004803590600160a060020a036024803582169260443583169260643516916084359160a4359160c43591906101049060e43590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a03169250610df7915050565b604051808260098111156102cb57fe5b60ff16815260200191505060405180910390f35b6102e76110ad565b604051600160e060020a0319909116815260200160405180910390f35b6103b9600480359060248035600160a060020a0316919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496505050833560ff16936020810135935060408101351515925060600135151590506110d1565b005b6103e1600435600160a060020a036024358116906044351660643560843560a43561125b565b60405190815260200160405180910390f35b6101b16004803590600160a060020a036024803582169260443590921691606435916084359160a4359160e49060c43590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a031692506112fc915050565b6103b9600435600160a060020a03602435166114d6565b6101b16004803590600160a060020a036024803582169260443583169260643516916084359160a4359160c43591906101049060e43590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a03169250611595915050565b6102e76118a5565b6103b9600435600160a060020a03602435166118c9565b6101b1600435600160a060020a036024358116906044351660643561191a565b6101b1600435600160a060020a0360243516604435611a5b565b6101b1600480359060248035600160a060020a0316916044359160849060643590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650611b0795505050505050565b6103e1600435600160a060020a036024358116906044358116906064351660843560a43560c435611c84565b6103e1600435600160a060020a036024358116906044351660643560843560a435611d31565b6103e1611dd2565b6103b9600435600160a060020a0360243516611dd7565b6103b9600435611e84565b6101b1600435600160a060020a03602435166044356064351515611f12565b6102e7612069565b6103b9600435600160a060020a036024351661208d565b6102bb6004803590600160a060020a036024803582169260443590921691606435916084359160a4359160e49060c43590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a03169250612128915050565b6101b1600435600160a060020a03602435166044356122a5565b6102e7612327565b61071b60043560ff6024351661234b565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561075757808201518382015260200161073f565b50505050905090810190601f1680156107845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6107dd600480359060446024803590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506126cf95505050505050565b604051600160a060020a03909116815260200160405180910390f35b6102bb6004803590600160a060020a0360248035821692604435909216916064359160a49060843590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094968635966020808201359750919550606081019450604090810135860180830194503592508291601f83018190048102019051908101604052818152929190602084018383808284375094965050509235600160a060020a031692506127af915050565b61071b61292e565b6103b9600435612953565b6103e16004803590600160a060020a0360248035821692604435909216916064359160a49060843590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050843594602001359350612a0592505050565b6102bb6004803590600160a060020a036024803582169260443590921691606435916084359160a4359160e49060c43590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a03169250612af0915050565b6101b16004803590600160a060020a0360248035821692604435909216916064359160a49060843590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094968635966020808201359750919550606081019450604090810135860180830194503592508291601f83018190048102019051908101604052818152929190602084018383808284375094965050509235600160a060020a03169250612cd9915050565b6103b960043561303b565b600283015460009060a860020a900460ff1680610ad05750600284015460a060020a900460ff168015610ad05750835433600160a060020a03908116610100909204161480610ad05750600284015433600160a060020a039081169116145b1515610adb57600080fd5b600160a060020a033316600090815260038501602052604090205460ff1615610b0357600080fd5b600160a060020a0333166000908152600885016020526040902054610b289083613165565b600160a060020a0333811660009081526008870160205260408082209390935590851681522054610b59908361317a565b600160a060020a03808516600081815260088801602052604090819020939093559133909116906000805160206132588339815191529085905190815260200160405180910390a35060019392505050565b6002880154600090819060a860020a900460ff161515610bca57600080fd5b610bd88a8a8a8a8a8a61125b565b9050600160a060020a03891615801590610c905750610c7b6040805190810160405280601c8152602001600080516020613238833981519152815250826040518083805190602001908083835b60208310610c445780518252601f199092019160209182019101610c25565b6001836020036101000a038019825116818451161790925250505091909101928352505060200190506040518091039020856126cf565b600160a060020a031689600160a060020a0316145b1515610c9b57600080fd5b600160a060020a038916600090815260038b01602052604090205460ff1615610cc357600080fd5b600160a060020a0389166000908152600a8b0160205260409020548514610ce957600080fd5b600160a060020a03808a166000818152600a8d016020908152604080832060018b01905560098f018252808320948d1680845294909152908190208a9055600080516020613278833981519152908a905190815260200160405180910390a3600160a060020a038916600090815260088b016020526040902054610d6d9087613165565b600160a060020a03808b16600090815260088d0160205260408082209390935590851681522054610d9e908761317a565b600160a060020a03808516600081815260088e016020526040908190209390935591908b16906000805160206132588339815191529089905190815260200160405180910390a3600191505b5098975050505050505050565b60008060008b60020160159054906101000a900460ff161515610e1d576001925061109e565b610e2c8c8c8c8c8c8c8c611c84565b9150600160a060020a038b161580610ee35750610ecd6040805190810160405280601c8152602001600080516020613238833981519152815250836040518083805190602001908083835b60208310610e965780518252601f199092019160209182019101610e77565b6001836020036101000a038019825116818451161790925250505091909101928352505060200190506040518091039020866126cf565b600160a060020a03168b600160a060020a031614155b15610ef1576003925061109e565b600160a060020a038a16600090815260038d01602052604090205460ff1615610f1d576002925061109e565b600160a060020a038b166000908152600a8d0160205260409020548614610f47576004925061109e565b610f51888861317a565b9050878c60090160008c600160a060020a0316600160a060020a0316815260200190815260200160002060008d600160a060020a0316600160a060020a03168152602001908152602001600020541015610fae576005925061109e565b600160a060020a03808b16600090815260098e0160209081526040808320938f168352929052205481901015610fe7576006925061109e565b600160a060020a038a16600090815260088d01602052604090205488901015611013576007925061109e565b600160a060020a038a16600090815260088d0160205260409020548190101561103f576008925061109e565b600160a060020a038916600090815260088d016020526040902054888101101561106c576009925061109e565b600160a060020a038416600090815260088d0160205260409020548781011015611099576009925061109e565b600092505b50509998505050505050505050565b7ff16f9b530000000000000000000000000000000000000000000000000000000081565b875460ff16156110e057600080fd5b8754600160ff199091161774ffffffffffffffffffffffffffffffffffffffff001916610100600160a060020a038916021788556004880186805161112992916020019061318a565b506005880185805161113f92916020019061318a565b5060068801805460ff191660ff861617905560008311156111fa57600160a060020a03808816600090815260088a01602052604080822086905560078b018690558a546101009004909216917ff9288aa3c16d157f87dbf24b824f702d4c76887d38e8fd6ef8212ad19a712aee91869151918252151560208201526040908101905180910390a287546101009004600160a060020a031660006000805160206132588339815191528560405190815260200160405180910390a35b6002909701805497151560a860020a0275ff0000000000000000000000000000000000000000001992151560a060020a0274ff0000000000000000000000000000000000000000199099169890981791909116969096179095555050505050565b60007fe9afa7a100000000000000000000000000000000000000000000000000000000308787878787604051600160e060020a031990971687526c01000000000000000000000000600160a060020a03968716810260048901529486168502601888015292909416909202602c8501526040808501929092526060840192909252608083019190915260a09091019051809103902090509695505050505050565b6002880154600090819060a860020a900460ff16151561131b57600080fd5b6113298a8a8a8a8a8a611d31565b9050600160a060020a038916158015906113a957506113946040805190810160405280601c81526020016000805160206132388339815191528152508260405180838051906020019080838360208310610c445780518252601f199092019160209182019101610c25565b600160a060020a031689600160a060020a0316145b15156113b457600080fd5b600160a060020a038916600090815260038b01602052604090205460ff16156113dc57600080fd5b600160a060020a0389166000908152600a8b016020526040902054851461140257600080fd5b600160a060020a0389166000908152600a8b016020908152604080832060018901905560088d019091529020546114399088613165565b600160a060020a03808b16600090815260088d01602052604080822093909355908a168152205461146a908861317a565b600160a060020a03808a16600081815260088e016020526040908190209390935591908b1690600080516020613258833981519152908a905190815260200160405180910390a3600160a060020a038916600090815260088b016020526040902054610d6d9087613165565b815433600160a060020a0390811661010090920416146114f557600080fd5b600282015460a060020a900460ff16151561150f57600080fd5b60028201547f1cf2de25c5bf439ac0287061c3a0fa69b3b02867d0ccfd2ded34e42577050b7390600160a060020a031682604051600160a060020a039283168152911660208201526040908101905180910390a1600291909101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b6002890154600090819060a860020a900460ff1615156115b457600080fd5b6115c38b8b8b8b8b8b8b611c84565b9050600160a060020a038a1615801590611643575061162e6040805190810160405280601c81526020016000805160206132388339815191528152508260405180838051906020019080838360208310610c445780518252601f199092019160209182019101610c25565b600160a060020a03168a600160a060020a0316145b151561164e57600080fd5b600160a060020a038916600090815260038c01602052604090205460ff161561167657600080fd5b600160a060020a038a166000908152600a8c016020526040902054851461169c57600080fd5b600160a060020a03808b166000908152600a8d016020908152604080832060018a019055928c16825260088e01905220546116d79088613165565b600160a060020a03808b16600090815260088e01602090815260408083209490945560098f018152838220928e1682529190915220546117179088613165565b600160a060020a03808b16600090815260098e01602090815260408083208f85168452825280832094909455918b16815260088e01909152205461175b908861317a565b600160a060020a03808a16600081815260088f016020526040908190209390935591908b1690600080516020613258833981519152908a905190815260200160405180910390a3600160a060020a038916600090815260088c0160205260409020546117c79087613165565b600160a060020a03808b16600090815260088e01602090815260408083209490945560098f018152838220928e1682529190915220546118079087613165565b600160a060020a03808b16600090815260098e01602090815260408083208f85168452825280832094909455918616815260088e01909152205461184b908761317a565b600160a060020a03808516600081815260088f016020526040908190209390935591908b16906000805160206132588339815191529089905190815260200160405180910390a3600191505b509998505050505050505050565b7f7532eaac0000000000000000000000000000000000000000000000000000000081565b815433600160a060020a0390811661010090920416146118e857600080fd5b600191909101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600284015460009060a860020a900460ff16151561193757600080fd5b600160a060020a038416600090815260038601602052604090205460ff161561195f57600080fd5b600160a060020a03841660009081526008860160205260409020546119849083613165565b600160a060020a0380861660009081526008880160209081526040808320949094556009890181528382203390931682529190915220546119c59083613165565b600160a060020a038086166000908152600988016020908152604080832033851684528252808320949094559186168152600888019091522054611a09908361317a565b600160a060020a038085166000818152600889016020526040908190209390935591908616906000805160206132588339815191529085905190815260200160405180910390a3506001949350505050565b825460009033600160a060020a039081166101009092041614611a7d57600080fd5b8354600160a060020a038085169163a9059cbb91610100909104168460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611ae557600080fd5b6102c65a03f11515611af657600080fd5b505050604051805195945050505050565b600160a060020a033316600090815260038501602052604081205460ff1615611b2f57600080fd5b600160a060020a033381166000818152600988016020908152604080832094891680845294909152908190208690556000805160206132788339815191529086905190815260200160405180910390a383600160a060020a0316638f4ffcb1338530866040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611c17578082015183820152602001611bff565b50505050905090810190601f168015611c445780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1515611c6557600080fd5b6102c65a03f11515611c7657600080fd5b506001979650505050505050565b60007f344bcc7d0000000000000000000000000000000000000000000000000000000030888888888888604051600160e060020a031990981688526c01000000000000000000000000600160a060020a03978816810260048a0152958716860260188901529386168502602c8801529190941690920260408086019190915260548501939093526074840191909152609483015260b4909101905180910390209050979650505050505050565b60007f7532eaac00000000000000000000000000000000000000000000000000000000308787878787604051600160e060020a031990971687526c01000000000000000000000000600160a060020a03968716810260048901529486168502601888015292909416909202602c8501526040808501929092526060840192909252608083019190915260a09091019051809103902090509695505050505050565b606e81565b815433600160a060020a039081166101009092041614611df657600080fd5b8154600160a060020a03808316916101009004167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38154600160a060020a039091166101000274ffffffffffffffffffffffffffffffffffffffff0019909116178155600101805473ffffffffffffffffffffffffffffffffffffffff19169055565b805433600160a060020a039081166101009092041614611ea357600080fd5b600281015460a860020a900460ff1615611ebc57600080fd5b60028101805475ff000000000000000000000000000000000000000000191660a860020a1790557feadb24812ab3c9a55c774958184293ebdb6c7f6a2dbab11f397d80c86feb65d360405160405180910390a150565b600284015460009060a060020a900460ff161515611f2f57600080fd5b600285015433600160a060020a0390811691161480611f605750845433600160a060020a0390811661010090920416145b1515611f6b57600080fd5b8115611f9757600160a060020a03841660009081526003860160205260409020805460ff191660011790555b600160a060020a0384166000908152600886016020526040902054611fbc908461317a565b600160a060020a03851660009081526008870160205260409020556007850154611fe6908461317a565b6007860155600160a060020a0384167ff9288aa3c16d157f87dbf24b824f702d4c76887d38e8fd6ef8212ad19a712aee8484604051918252151560208201526040908101905180910390a2600160a060020a03841660006000805160206132588339815191528560405190815260200160405180910390a3506001949350505050565b7fe9afa7a10000000000000000000000000000000000000000000000000000000081565b815433600160a060020a0390811661010090920416146120ac57600080fd5b600160a060020a038116600090815260038301602052604090205460ff1615156120d557600080fd5b600160a060020a038116600081815260038401602052604090819020805460ff191690557fb7df7ef889418eecc895118f0d863c3074abf7769bfe39ba852192114c725dfc905160405180910390a25050565b6002880154600090819060a860020a900460ff16151561214b5760019150610dea565b6121598a8a8a8a8a8a61125b565b9050600160a060020a03891615806121d857506121c26040805190810160405280601c81526020016000805160206132388339815191528152508260405180838051906020019080838360208310610c445780518252601f199092019160209182019101610c25565b600160a060020a031689600160a060020a031614155b156121e65760039150610dea565b600160a060020a038916600090815260038b01602052604090205460ff16156122125760029150610dea565b600160a060020a0389166000908152600a8b016020526040902054851461223c5760049150610dea565b600160a060020a038916600090815260088b016020526040902054869010156122685760089150610dea565b600160a060020a038316600090815260088b01602052604090205486810110156122955760099150610dea565b5060009998505050505050505050565b600160a060020a033316600090815260038401602052604081205460ff16156122cd57600080fd5b600160a060020a033381166000818152600987016020908152604080832094881680845294909152908190208590556000805160206132788339815191529085905190815260200160405180910390a35060019392505050565b7f344bcc7d0000000000000000000000000000000000000000000000000000000081565b612353613208565b600082600981111561236157fe5b14156123a25760408051908101604052600781527f5375636365737300000000000000000000000000000000000000000000000000602082015290506126c9565b60018260098111156123b057fe5b14156123f15760408051908101604052601b81527f546f6b656e73206e6f74207472616e7366657261626c65207965740000000000602082015290506126c9565b60028260098111156123ff57fe5b14156124405760408051908101604052600e81527f4163636f756e74206c6f636b6564000000000000000000000000000000000000602082015290506126c9565b600382600981111561244e57fe5b141561248f5760408051908101604052601b81527f4d69736d6174636820696e207369676e696e67206163636f756e740000000000602082015290506126c9565b600482600981111561249d57fe5b14156124de5760408051908101604052600d81527f496e76616c6964206e6f6e636500000000000000000000000000000000000000602082015290506126c9565b60058260098111156124ec57fe5b141561252d5760408051908101604052601c81527f496e73756666696369656e7420617070726f76656420746f6b656e7300000000602082015290506126c9565b600682600981111561253b57fe5b14156125a557606060405190810160405280602581526020017f496e73756666696369656e7420617070726f76656420746f6b656e7320666f7281526020017f206665657300000000000000000000000000000000000000000000000000000081525090506126c9565b60078260098111156125b357fe5b14156125f45760408051908101604052601381527f496e73756666696369656e7420746f6b656e7300000000000000000000000000602082015290506126c9565b600882600981111561260257fe5b14156126435760408051908101604052601c81527f496e73756666696369656e7420746f6b656e7320666f72206665657300000000602082015290506126c9565b600982600981111561265157fe5b14156126925760408051908101604052600e81527f4f766572666c6f77206572726f72000000000000000000000000000000000000602082015290506126c9565b60408051908101604052600d81527f556e6b6e6f776e206572726f7200000000000000000000000000000000000000602082015290505b92915050565b60008060008084516041146126e757600093506127a6565b6020850151925060408501519150606085015160001a9050601b8160ff16101561270f57601b015b8060ff16601b1415801561272757508060ff16601c14155b1561273557600093506127a6565b6001868285856040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f1151561279a57600080fd5b50506020604051035193505b50505092915050565b6002890154600090819060a860020a900460ff1615156127d25760019150611897565b6127e18b8b8b8b8b8b8b612a05565b9050600160a060020a038a161580612860575061284a6040805190810160405280601c81526020016000805160206132388339815191528152508260405180838051906020019080838360208310610c445780518252601f199092019160209182019101610c25565b600160a060020a03168a600160a060020a031614155b1561286e5760039150611897565b600160a060020a038a16600090815260038c01602052604090205460ff161561289a5760029150611897565b600160a060020a038a166000908152600a8c01602052604090205485146128c45760049150611897565b600160a060020a038a16600090815260088c016020526040902054869010156128f05760089150611897565b600160a060020a038316600090815260088c016020526040902054868101101561291d5760099150611897565b5060009a9950505050505050505050565b60408051908101604052601c8152600080516020613238833981519152602082015281565b600181015433600160a060020a0390811691161461297057600080fd5b60018101548154600160a060020a0391821691610100909104167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600181018054825474ffffffffffffffffffffffffffffffffffffffff001916610100600160a060020a038316021790925573ffffffffffffffffffffffffffffffffffffffff199091169055565b60007ff16f9b530000000000000000000000000000000000000000000000000000000030888888888888604051600160e060020a0319891681526c01000000000000000000000000600160a060020a03808a168202600484015288811682026018840152871602602c820152604081018590526060810184805190602001908083835b60208310612aa75780518252601f199092019160209182019101612a88565b6001836020036101000a03801982511681845116179092525050509190910193845250506020820152604090810196509450505050505180910390209050979650505050505050565b60008060008a60020160159054906101000a900460ff161515612b165760019250612ccb565b612b248b8b8b8b8b8b611d31565b9150600160a060020a038a161580612ba35750612b8d6040805190810160405280601c81526020016000805160206132388339815191528152508360405180838051906020019080838360208310610e965780518252601f199092019160209182019101610e77565b600160a060020a03168a600160a060020a031614155b15612bb15760039250612ccb565b600160a060020a038a16600090815260038c01602052604090205460ff1615612bdd5760029250612ccb565b600160a060020a038a166000908152600a8c0160205260409020548614612c075760049250612ccb565b612c11888861317a565b600160a060020a038b16600090815260088d01602052604090205490915088901015612c405760079250612ccb565b600160a060020a038a16600090815260088c01602052604090205481901015612c6c5760089250612ccb565b600160a060020a038916600090815260088c0160205260409020548881011015612c995760099250612ccb565b600160a060020a038416600090815260088c0160205260409020548781011015612cc65760099250612ccb565b600092505b505098975050505050505050565b6002890154600090819060a860020a900460ff161515612cf857600080fd5b612d078b8b8b8b8b8b8b612a05565b9050600160a060020a038a1615801590612d875750612d726040805190810160405280601c81526020016000805160206132388339815191528152508260405180838051906020019080838360208310610c445780518252601f199092019160209182019101610c25565b600160a060020a03168a600160a060020a0316145b1515612d9257600080fd5b600160a060020a038a16600090815260038c01602052604090205460ff1615612dba57600080fd5b600160a060020a038a166000908152600a8c0160205260409020548514612de057600080fd5b846001018b600a0160008c600160a060020a0316600160a060020a0316815260200190815260200160002081905550878b60090160008c600160a060020a0316600160a060020a0316815260200190815260200160002060008b600160a060020a0316600160a060020a031681526020019081526020016000208190555088600160a060020a03168a600160a060020a03166000805160206132788339815191528a60405190815260200160405180910390a3600160a060020a038a16600090815260088c016020526040902054612eb89087613165565b600160a060020a03808c16600090815260088e0160205260408082209390935590851681522054612ee9908761317a565b600160a060020a03808516600081815260088f016020526040908190209390935591908c16906000805160206132588339815191529089905190815260200160405180910390a388600160a060020a0316638f4ffcb18b8a308b6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612fc8578082015183820152602001612fb0565b50505050905090810190601f168015612ff55780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b151561301657600080fd5b6102c65a03f1151561302757600080fd5b5060019d9c50505050505050505050505050565b600281015460a060020a900460ff16151561305557600080fd5b600281015433600160a060020a03908116911614806130865750805433600160a060020a0390811661010090920416145b151561309157600080fd5b60028101805474ff0000000000000000000000000000000000000000198116909155600160a060020a0316156131365760028101547f1cf2de25c5bf439ac0287061c3a0fa69b3b02867d0ccfd2ded34e42577050b7390600160a060020a03166000604051600160a060020a039283168152911660208201526040908101905180910390a160028101805473ffffffffffffffffffffffffffffffffffffffff191690555b7faf79b4370f6af9d950564bbe6b81f7f0834c003c455db9248f4e55e6bf865eb760405160405180910390a150565b60008282111561317457600080fd5b50900390565b818101828110156126c957600080fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106131cb57805160ff19168380011785556131f8565b828001600101855582156131f8579182015b828111156131f85782518255916020019190600101906131dd565b5061320492915061321a565b5090565b60206040519081016040526000815290565b61323491905b808211156132045760008155600101613220565b90560019457468657265756d205369676e6564204d6573736167653a0a333200000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a165627a7a72305820dbfaee8587da7b0e992e6332a324e4030afb395056213feb9e391cfb4d2104c30029
Swarm Source
bzzr://dbfaee8587da7b0e992e6332a324e4030afb395056213feb9e391cfb4d2104c3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.