0 ETH
USD
BTC
0xdfc85C08d5e5924aB49750E006CF8a826ffb7B13
In order to save any account details you will need to provide a signed message of that account for verification. Currently we support only signatures generated by the MyCrypto Tool.
The signature text MUST CONTAIN the the string " etherchain.org ".
Hash | Block | Type | From | To | Value | Fee | Time |
---|
pragma solidity 0.4.18;
interface ERC20 {
function totalSupply() public view returns (uint supply);
function balanceOf(address _owner) public view returns (uint balance);
function transfer(address _to, uint _value) public returns (bool success);
function transferFrom(address _from, address _to, uint _value) public returns (bool success);
function approve(address _spender, uint _value) public returns (bool success);
function allowance(address _owner, address _spender) public view returns (uint remaining);
function decimals() public view returns(uint digits);
event Approval(address indexed _owner, address indexed _spender, uint _value);
}
contract PermissionGroups {
address public admin;
address public pendingAdmin;
mapping(address=>bool) internal operators;
mapping(address=>bool) internal alerters;
address[] internal operatorsGroup;
address[] internal alertersGroup;
uint constant internal MAX_GROUP_SIZE = 50;
function PermissionGroups() public {
admin = msg.sender;
}
modifier onlyAdmin() {
require(msg.sender == admin);
_;
}
modifier onlyOperator() {
require(operators[msg.sender]);
_;
}
modifier onlyAlerter() {
require(alerters[msg.sender]);
_;
}
function getOperators () external view returns(address[]) {
return operatorsGroup;
}
function getAlerters () external view returns(address[]) {
return alertersGroup;
}
event TransferAdminPending(address pendingAdmin);
/**
* @dev Allows the current admin to set the pendingAdmin address.
* @param newAdmin The address to transfer ownership to.
*/
function transferAdmin(address newAdmin) public onlyAdmin {
require(newAdmin != address(0));
TransferAdminPending(pendingAdmin);
pendingAdmin = newAdmin;
}
/**
* @dev Allows the current admin to set the admin in one tx. Useful initial deployment.
* @param newAdmin The address to transfer ownership to.
*/
function transferAdminQuickly(address newAdmin) public onlyAdmin {
require(newAdmin != address(0));
TransferAdminPending(newAdmin);
AdminClaimed(newAdmin, admin);
admin = newAdmin;
}
event AdminClaimed( address newAdmin, address previousAdmin);
/**
* @dev Allows the pendingAdmin address to finalize the change admin process.
*/
function claimAdmin() public {
require(pendingAdmin == msg.sender);
AdminClaimed(pendingAdmin, admin);
admin = pendingAdmin;
pendingAdmin = address(0);
}
event AlerterAdded (address newAlerter, bool isAdd);
function addAlerter(address newAlerter) public onlyAdmin {
require(!alerters[newAlerter]); // prevent duplicates.
require(alertersGroup.length < MAX_GROUP_SIZE);
AlerterAdded(newAlerter, true);
alerters[newAlerter] = true;
alertersGroup.push(newAlerter);
}
function removeAlerter (address alerter) public onlyAdmin {
require(alerters[alerter]);
alerters[alerter] = false;
for (uint i = 0; i < alertersGroup.length; ++i) {
if (alertersGroup[i] == alerter) {
alertersGroup[i] = alertersGroup[alertersGroup.length - 1];
alertersGroup.length--;
AlerterAdded(alerter, false);
break;
}
}
}
event OperatorAdded(address newOperator, bool isAdd);
function addOperator(address newOperator) public onlyAdmin {
require(!operators[newOperator]); // prevent duplicates.
require(operatorsGroup.length < MAX_GROUP_SIZE);
OperatorAdded(newOperator, true);
operators[newOperator] = true;
operatorsGroup.push(newOperator);
}
function removeOperator (address operator) public onlyAdmin {
require(operators[operator]);
operators[operator] = false;
for (uint i = 0; i < operatorsGroup.length; ++i) {
if (operatorsGroup[i] == operator) {
operatorsGroup[i] = operatorsGroup[operatorsGroup.length - 1];
operatorsGroup.length -= 1;
OperatorAdded(operator, false);
break;
}
}
}
}
contract Utils {
ERC20 constant internal ETH_TOKEN_ADDRESS = ERC20(0x00eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee);
uint constant internal PRECISION = (10**18);
uint constant internal MAX_QTY = (10**28); // 10B tokens
uint constant internal MAX_RATE = (PRECISION * 10**6); // up to 1M tokens per ETH
uint constant internal MAX_DECIMALS = 18;
uint constant internal ETH_DECIMALS = 18;
mapping(address=>uint) internal decimals;
function setDecimals(ERC20 token) internal {
if (token == ETH_TOKEN_ADDRESS) decimals[token] = ETH_DECIMALS;
else decimals[token] = token.decimals();
}
function getDecimals(ERC20 token) internal view returns(uint) {
if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access
uint tokenDecimals = decimals[token];
// technically, there might be token with decimals 0
// moreover, very possible that old tokens have decimals 0
// these tokens will just have higher gas fees.
if(tokenDecimals == 0) return token.decimals();
return tokenDecimals;
}
function calcDstQty(uint srcQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) {
require(srcQty <= MAX_QTY);
require(rate <= MAX_RATE);
if (dstDecimals >= srcDecimals) {
require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
return (srcQty * rate * (10**(dstDecimals - srcDecimals))) / PRECISION;
} else {
require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
return (srcQty * rate) / (PRECISION * (10**(srcDecimals - dstDecimals)));
}
}
function calcSrcQty(uint dstQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) {
require(dstQty <= MAX_QTY);
require(rate <= MAX_RATE);
//source quantity is rounded up. to avoid dest quantity being too low.
uint numerator;
uint denominator;
if (srcDecimals >= dstDecimals) {
require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals)));
denominator = rate;
} else {
require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
numerator = (PRECISION * dstQty);
denominator = (rate * (10**(dstDecimals - srcDecimals)));
}
return (numerator + denominator - 1) / denominator; //avoid rounding down errors
}
}
contract Withdrawable is PermissionGroups {
event TokenWithdraw(ERC20 token, uint amount, address sendTo);
/**
* @dev Withdraw all ERC20 compatible tokens
* @param token ERC20 The address of the token contract
*/
function withdrawToken(ERC20 token, uint amount, address sendTo) external onlyAdmin {
require(token.transfer(sendTo, amount));
TokenWithdraw(token, amount, sendTo);
}
event EtherWithdraw(uint amount, address sendTo);
/**
* @dev Withdraw Ethers
*/
function withdrawEther(uint amount, address sendTo) external onlyAdmin {
sendTo.transfer(amount);
EtherWithdraw(amount, sendTo);
}
}
interface SanityRatesInterface {
function getSanityRate(ERC20 src, ERC20 dest) public view returns(uint);
}
contract SanityRates is SanityRatesInterface, Withdrawable, Utils {
mapping(address=>uint) public tokenRate;
mapping(address=>uint) public reasonableDiffInBps;
function SanityRates(address _admin) public {
require(_admin != address(0));
admin = _admin;
}
function setReasonableDiff(ERC20[] srcs, uint[] diff) public onlyAdmin {
require(srcs.length == diff.length);
for (uint i = 0; i < srcs.length; i++) {
require(diff[i] <= 100 * 100);
reasonableDiffInBps[srcs[i]] = diff[i];
}
}
function setSanityRates(ERC20[] srcs, uint[] rates) public onlyOperator {
require(srcs.length == rates.length);
for (uint i = 0; i < srcs.length; i++) {
require(rates[i] <= MAX_RATE);
tokenRate[srcs[i]] = rates[i];
}
}
function getSanityRate(ERC20 src, ERC20 dest) public view returns(uint) {
if (src != ETH_TOKEN_ADDRESS && dest != ETH_TOKEN_ADDRESS) return 0;
uint rate;
address token;
if (src == ETH_TOKEN_ADDRESS) {
rate = (PRECISION*PRECISION)/tokenRate[dest];
token = dest;
} else {
rate = tokenRate[src];
token = src;
}
return rate * (10000 + reasonableDiffInBps[token])/10000;
}
}
Type | Name | Constant | Signature |
---|---|---|---|
function | removeAlerter(alerter address) | false | 0x01a12fd3 |
function | pendingAdmin() => ( address) | true | 0x26782247 |
function | getOperators() => ( address[]) | true | 0x27a099d8 |
function | withdrawToken(token address, amount uint256, sendTo address) | false | 0x3ccdbb28 |
function | addAlerter(newAlerter address) | false | 0x408ee7fe |
function | reasonableDiffInBps( address) => ( uint256) | true | 0x5463a2e4 |
function | setReasonableDiff(srcs address[], diff uint256[]) | false | 0x5c53ec59 |
function | transferAdmin(newAdmin address) | false | 0x75829def |
function | claimAdmin() | false | 0x77f50f97 |
function | transferAdminQuickly(newAdmin address) | false | 0x7acc8678 |
function | getAlerters() => ( address[]) | true | 0x7c423f54 |
function | addOperator(newOperator address) | false | 0x9870d7fe |
function | getSanityRate(src address, dest address) => ( uint256) | true | 0xa58092b7 |
function | removeOperator(operator address) | false | 0xac8a584a |
function | tokenRate( address) => ( uint256) | true | 0xc57fbf90 |
function | withdrawEther(amount uint256, sendTo address) | false | 0xce56c454 |
function | setSanityRates(srcs address[], rates uint256[]) | false | 0xf5db370f |
function | admin() => ( address) | true | 0xf851a440 |
constructor | (_admin address) | ||
event | TokenWithdraw(token address, amount uint256, sendTo address) | 0x72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6 | |
event | EtherWithdraw(amount uint256, sendTo address) | 0xec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de | |
event | TransferAdminPending(pendingAdmin address) | 0x3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc40 | |
event | AdminClaimed(newAdmin address, previousAdmin address) | 0x65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed | |
event | AlerterAdded(newAlerter address, isAdd bool) | 0x5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762 | |
event | OperatorAdded(newOperator address, isAdd bool) | 0x091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b |
[
{
"constant": false,
"inputs": [
{
"name": "alerter",
"type": "address"
}
],
"name": "removeAlerter",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function",
"signature": "0x01a12fd3"
},
{
"constant": true,
"inputs": [],
"name": "pendingAdmin",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function",
"signature": "0x26782247"
},
{
"constant": true,
"inputs": [],
"name": "getOperators",
"outputs": [
{
"name": "",
"type": "address[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function",
"signature": "0x27a099d8"
},
{
"constant": false,
"inputs": [
{
"name": "token",
"type": "address"
},
{
"name": "amount",
"type": "uint256"
},
{
"name": "sendTo",
"type": "address"
}
],
"name": "withdrawToken",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function",
"signature": "0x3ccdbb28"
},
{
"constant": false,
"inputs": [
{
"name": "newAlerter",
"type": "address"
}
],
"name": "addAlerter",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function",
"signature": "0x408ee7fe"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address"
}
],
"name": "reasonableDiffInBps",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function",
"signature": "0x5463a2e4"
},
{
"constant": false,
"inputs": [
{
"name": "srcs",
"type": "address[]"
},
{
"name": "diff",
"type": "uint256[]"
}
],
"name": "setReasonableDiff",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function",
"signature": "0x5c53ec59"
},
{
"constant": false,
"inputs": [
{
"name": "newAdmin",
"type": "address"
}
],
"name": "transferAdmin",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function",
"signature": "0x75829def"
},
{
"constant": false,
"inputs": [],
"name": "claimAdmin",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function",
"signature": "0x77f50f97"
},
{
"constant": false,
"inputs": [
{
"name": "newAdmin",
"type": "address"
}
],
"name": "transferAdminQuickly",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function",
"signature": "0x7acc8678"
},
{
"constant": true,
"inputs": [],
"name": "getAlerters",
"outputs": [
{
"name": "",
"type": "address[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function",
"signature": "0x7c423f54"
},
{
"constant": false,
"inputs": [
{
"name": "newOperator",
"type": "address"
}
],
"name": "addOperator",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function",
"signature": "0x9870d7fe"
},
{
"constant": true,
"inputs": [
{
"name": "src",
"type": "address"
},
{
"name": "dest",
"type": "address"
}
],
"name": "getSanityRate",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function",
"signature": "0xa58092b7"
},
{
"constant": false,
"inputs": [
{
"name": "operator",
"type": "address"
}
],
"name": "removeOperator",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function",
"signature": "0xac8a584a"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address"
}
],
"name": "tokenRate",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function",
"signature": "0xc57fbf90"
},
{
"constant": false,
"inputs": [
{
"name": "amount",
"type": "uint256"
},
{
"name": "sendTo",
"type": "address"
}
],
"name": "withdrawEther",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function",
"signature": "0xce56c454"
},
{
"constant": false,
"inputs": [
{
"name": "srcs",
"type": "address[]"
},
{
"name": "rates",
"type": "uint256[]"
}
],
"name": "setSanityRates",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function",
"signature": "0xf5db370f"
},
{
"constant": true,
"inputs": [],
"name": "admin",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function",
"signature": "0xf851a440"
},
{
"inputs": [
{
"name": "_admin",
"type": "address"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "token",
"type": "address"
},
{
"indexed": false,
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"name": "sendTo",
"type": "address"
}
],
"name": "TokenWithdraw",
"type": "event",
"signature": "0x72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"name": "sendTo",
"type": "address"
}
],
"name": "EtherWithdraw",
"type": "event",
"signature": "0xec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "pendingAdmin",
"type": "address"
}
],
"name": "TransferAdminPending",
"type": "event",
"signature": "0x3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc40"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "newAdmin",
"type": "address"
},
{
"indexed": false,
"name": "previousAdmin",
"type": "address"
}
],
"name": "AdminClaimed",
"type": "event",
"signature": "0x65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "newAlerter",
"type": "address"
},
{
"indexed": false,
"name": "isAdd",
"type": "bool"
}
],
"name": "AlerterAdded",
"type": "event",
"signature": "0x5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "newOperator",
"type": "address"
},
{
"indexed": false,
"name": "isAdd",
"type": "bool"
}
],
"name": "OperatorAdded",
"type": "event",
"signature": "0x091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b"
}
]
bzz://4e50a8fa39a18734741cc84ff04a63a840c3655af3919ea3bcb549a91a9ecd9a
6060604052600436106100fb5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301a12fd38114610100578063267822471461012157806327a099d8146101505780633ccdbb28146101b6578063408ee7fe146101df5780635463a2e4146101fe5780635c53ec591461022f57806375829def146102be57806377f50f97146102dd5780637acc8678146102f05780637c423f541461030f5780639870d7fe14610322578063a58092b714610341578063ac8a584a14610366578063c57fbf9014610385578063ce56c454146103a4578063f5db370f146103c6578063f851a44014610455575b600080fd5b341561010b57600080fd5b61011f600160a060020a0360043516610468565b005b341561012c57600080fd5b6101346105d8565b604051600160a060020a03909116815260200160405180910390f35b341561015b57600080fd5b6101636105e7565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156101a257808201518382015260200161018a565b505050509050019250505060405180910390f35b34156101c157600080fd5b61011f600160a060020a036004358116906024359060443516610650565b34156101ea57600080fd5b61011f600160a060020a0360043516610760565b341561020957600080fd5b61021d600160a060020a036004351661085c565b60405190815260200160405180910390f35b341561023a57600080fd5b61011f60046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284375094965061086e95505050505050565b34156102c957600080fd5b61011f600160a060020a0360043516610920565b34156102e857600080fd5b61011f6109bb565b34156102fb57600080fd5b61011f600160a060020a0360043516610a55565b341561031a57600080fd5b610163610b37565b341561032d57600080fd5b61011f600160a060020a0360043516610b9d565b341561034c57600080fd5b61021d600160a060020a0360043581169060243516610c6d565b341561037157600080fd5b61011f600160a060020a0360043516610d75565b341561039057600080fd5b61021d600160a060020a0360043516610ee1565b34156103af57600080fd5b61011f600435600160a060020a0360243516610ef3565b34156103d157600080fd5b61011f600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843750949650610f8695505050505050565b341561046057600080fd5b610134611046565b6000805433600160a060020a0390811691161461048457600080fd5b600160a060020a03821660009081526003602052604090205460ff1615156104ab57600080fd5b50600160a060020a0381166000908152600360205260408120805460ff191690555b6005548110156105d45781600160a060020a03166005828154811015156104f057fe5b600091825260209091200154600160a060020a031614156105cc5760058054600019810190811061051d57fe5b60009182526020909120015460058054600160a060020a03909216918390811061054357fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600580549061057f906000198301611055565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051600160a060020a039092168252151560208201526040908101905180910390a16105d4565b6001016104cd565b5050565b600154600160a060020a031681565b6105ef611079565b600480548060200260200160405190810160405280929190818152602001828054801561064557602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610627575b505050505090505b90565b60005433600160a060020a0390811691161461066b57600080fd5b82600160a060020a031663a9059cbb82846000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156106e157600080fd5b6102c65a03f115156106f257600080fd5b50505060405180519050151561070757600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051600160a060020a03938416815260208101929092529091166040808301919091526060909101905180910390a1505050565b60005433600160a060020a0390811691161461077b57600080fd5b600160a060020a03811660009081526003602052604090205460ff16156107a157600080fd5b600554603290106107b157600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600360205260409020805460ff1916600190811790915560058054909181016108308382611055565b5060009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055565b60086020526000908152604090205481565b6000805433600160a060020a0390811691161461088a57600080fd5b815183511461089857600080fd5b5060005b825181101561091b576127108282815181106108b457fe5b9060200190602002015111156108c957600080fd5b8181815181106108d557fe5b90602001906020020151600860008584815181106108ef57fe5b90602001906020020151600160a060020a0316815260208101919091526040016000205560010161089c565b505050565b60005433600160a060020a0390811691161461093b57600080fd5b600160a060020a038116151561095057600080fd5b6001547f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4090600160a060020a0316604051600160a060020a03909116815260200160405180910390a160018054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a039081169116146109d657600080fd5b6001546000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed91600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a16001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b60005433600160a060020a03908116911614610a7057600080fd5b600160a060020a0381161515610a8557600080fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051600160a060020a03909116815260200160405180910390a16000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a160008054600160a060020a031916600160a060020a0392909216919091179055565b610b3f611079565b600580548060200260200160405190810160405280929190818152602001828054801561064557602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610627575050505050905090565b60005433600160a060020a03908116911614610bb857600080fd5b600160a060020a03811660009081526002602052604090205460ff1615610bde57600080fd5b60045460329010610bee57600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600260205260409020805460ff1916600190811790915560048054909181016108308382611055565b60008080600160a060020a03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14801590610cbb5750600160a060020a03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b15610cc95760009250610d6d565b600160a060020a03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610d2b57600160a060020a0384166000908152600760205260409020546ec097ce7bc90715b34b9f1000000000811515610d2057fe5b049150839050610d48565b5050600160a060020a038316600090815260076020526040902054835b600160a060020a03811660009081526008602052604090205461271090810183020492505b505092915050565b6000805433600160a060020a03908116911614610d9157600080fd5b600160a060020a03821660009081526002602052604090205460ff161515610db857600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b6004548110156105d45781600160a060020a0316600482815481101515610dfd57fe5b600091825260209091200154600160a060020a03161415610ed957600480546000198101908110610e2a57fe5b60009182526020909120015460048054600160a060020a039092169183908110610e5057fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600480546000190190610e8c9082611055565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051600160a060020a039092168252151560208201526040908101905180910390a16105d4565b600101610dda565b60076020526000908152604090205481565b60005433600160a060020a03908116911614610f0e57600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f193505050501515610f3f57600080fd5b7fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de8282604051918252600160a060020a031660208201526040908101905180910390a15050565b600160a060020a03331660009081526002602052604081205460ff161515610fad57600080fd5b8151835114610fbb57600080fd5b5060005b825181101561091b5769d3c21bcecceda1000000828281518110610fdf57fe5b906020019060200201511115610ff457600080fd5b81818151811061100057fe5b906020019060200201516007600085848151811061101a57fe5b90602001906020020151600160a060020a03168152602081019190915260400160002055600101610fbf565b600054600160a060020a031681565b81548183558181151161091b5760008381526020902061091b91810190830161108b565b60206040519081016040526000815290565b61064d91905b808211156110a55760008155600101611091565b50905600a165627a7a723058204e50a8fa39a18734741cc84ff04a63a840c3655af3919ea3bcb549a91a9ecd9a0029
00000000000000000000000031fd060138ed4ce512afe0d93f127ad1f4799142
Transaction 0xb4cf54e2528fe7bcfc847ebc27f25c1642a413154be6a57c1c7311c4ee02811f on the 2018-02-06T12:15:42+00:00 (2 years ago).