Contract 0x17233e07c67d086464fD408148c3ABB56245FA64

 
 
Txn Hash
Method
Block
From
To
Value
0x08fd63c8e25e2ec310654fd08a11224e08cd96c162e4de57baf4059eee2e30cfTransfer Ownersh...55355092018-05-01 2:50:031670 days 23 hrs agoVite: Deployer 1 IN  0x17233e07c67d086464fd408148c3abb56245fa640 Ether0.0004892511
0x28ba723efa399f9cefb5c1b2734a742529c6514e5976f6ea5ab6a3a607bca0a2Deauthorize Addr...55353422018-05-01 2:08:251670 days 23 hrs agoVite: Deployer 1 IN  0x17233e07c67d086464fd408148c3abb56245fa640 Ether0.0003413411
0xfce9bbaf2d076267ff7345b8a4448c929a590b14c9f277fb135aea9b2f2829c6Authorize Addres...55353382018-05-01 2:06:471670 days 23 hrs agoVite: Deployer 1 IN  0x17233e07c67d086464fd408148c3abb56245fa640 Ether0.0006845811
0x83d4a17a33ee1bc5a7c4111f80672ec94ce07c68f020b43d53e7a5092a7b0ad8Authorize Addres...55352202018-05-01 1:38:241671 days 18 mins agoVite: Deployer 1 IN  0x17233e07c67d086464fd408148c3abb56245fa640 Ether0.0007900711
0x3ee467083c08c447519b262831fc4be19a124732cb3703b4eb1cdfac5cfe69e50x6060604055351742018-05-01 1:27:421671 days 29 mins agoVite: Deployer 1 IN  Create: TokenTransferDelegateImpl0 Ether0.0178404411
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TokenTransferDelegateImpl

Compiler Version
v0.4.21+commit.dfe3193c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-05-01
*/

/*
  Copyright 2017 Loopring Project Ltd (Loopring Foundation).
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/
pragma solidity 0.4.21;
/// @title Utility Functions for uint
/// @author Daniel Wang - <[email protected]>
library MathUint {
    function mul(
        uint a,
        uint b
        )
        internal
        pure
        returns (uint c)
    {
        c = a * b;
        require(a == 0 || c / a == b);
    }
    function sub(
        uint a,
        uint b
        )
        internal
        pure
        returns (uint)
    {
        require(b <= a);
        return a - b;
    }
    function add(
        uint a,
        uint b
        )
        internal
        pure
        returns (uint c)
    {
        c = a + b;
        require(c >= a);
    }
    function tolerantSub(
        uint a,
        uint b
        )
        internal
        pure
        returns (uint c)
    {
        return (a >= b) ? a - b : 0;
    }
    /// @dev calculate the square of Coefficient of Variation (CV)
    /// https://en.wikipedia.org/wiki/Coefficient_of_variation
    function cvsquare(
        uint[] arr,
        uint scale
        )
        internal
        pure
        returns (uint)
    {
        uint len = arr.length;
        require(len > 1);
        require(scale > 0);
        uint avg = 0;
        for (uint i = 0; i < len; i++) {
            avg = add(avg, arr[i]);
        }
        avg = avg / len;
        if (avg == 0) {
            return 0;
        }
        uint cvs = 0;
        uint s;
        uint item;
        for (i = 0; i < len; i++) {
            item = arr[i];
            s = item > avg ? item - avg : avg - item;
            cvs = add(cvs, mul(s, s));
        }
        return ((mul(mul(cvs, scale), scale) / avg) / avg) / (len - 1);
    }
}
/*
  Copyright 2017 Loopring Project Ltd (Loopring Foundation).
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/
/*
  Copyright 2017 Loopring Project Ltd (Loopring Foundation).
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/
/*
  Copyright 2017 Loopring Project Ltd (Loopring Foundation).
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/
/// @title Ownable
/// @dev The Ownable contract has an owner address, and provides basic
///      authorization control functions, this simplifies the implementation of
///      "user permissions".
contract Ownable {
    address public owner;
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );
    /// @dev The Ownable constructor sets the original `owner` of the contract
    ///      to the sender.
    function Ownable()
        public
    {
        owner = msg.sender;
    }
    /// @dev Throws if called by any account other than the owner.
    modifier onlyOwner()
    {
        require(msg.sender == owner);
        _;
    }
    /// @dev Allows the current owner to transfer control of the contract to a
    ///      newOwner.
    /// @param newOwner The address to transfer ownership to.
    function transferOwnership(
        address newOwner
        )
        onlyOwner
        public
    {
        require(newOwner != 0x0);
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }
}
/// @title Claimable
/// @dev Extension for the Ownable contract, where the ownership needs
///      to be claimed. This allows the new owner to accept the transfer.
contract Claimable is Ownable {
    address public pendingOwner;
    /// @dev Modifier throws if called by any account other than the pendingOwner.
    modifier onlyPendingOwner() {
        require(msg.sender == pendingOwner);
        _;
    }
    /// @dev Allows the current owner to set the pendingOwner address.
    /// @param newOwner The address to transfer ownership to.
    function transferOwnership(
        address newOwner
        )
        onlyOwner
        public
    {
        require(newOwner != 0x0 && newOwner != owner);
        pendingOwner = newOwner;
    }
    /// @dev Allows the pendingOwner address to finalize the transfer.
    function claimOwnership()
        onlyPendingOwner
        public
    {
        emit OwnershipTransferred(owner, pendingOwner);
        owner = pendingOwner;
        pendingOwner = 0x0;
    }
}
/*
  Copyright 2017 Loopring Project Ltd (Loopring Foundation).
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/
/// @title ERC20 Token Interface
/// @dev see https://github.com/ethereum/EIPs/issues/20
/// @author Daniel Wang - <[email protected]>
contract ERC20 {
    function balanceOf(
        address who
        )
        view
        public
        returns (uint256);
    function allowance(
        address owner,
        address spender
        )
        view
        public
        returns (uint256);
    function transfer(
        address to,
        uint256 value
        )
        public
        returns (bool);
    function transferFrom(
        address from,
        address to,
        uint256 value
        )
        public
        returns (bool);
    function approve(
        address spender,
        uint256 value
        )
        public
        returns (bool);
}
/*
  Copyright 2017 Loopring Project Ltd (Loopring Foundation).
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/
/// @title TokenTransferDelegate
/// @dev Acts as a middle man to transfer ERC20 tokens on behalf of different
/// versions of Loopring protocol to avoid ERC20 re-authorization.
/// @author Daniel Wang - <[email protected]>.
contract TokenTransferDelegate {
    event AddressAuthorized(
        address indexed addr,
        uint32          number
    );
    event AddressDeauthorized(
        address indexed addr,
        uint32          number
    );
    // The following map is used to keep trace of order fill and cancellation
    // history.
    mapping (bytes32 => uint) public cancelledOrFilled;
    // This map is used to keep trace of order's cancellation history.
    mapping (bytes32 => uint) public cancelled;
    // A map from address to its cutoff timestamp.
    mapping (address => uint) public cutoffs;
    // A map from address to its trading-pair cutoff timestamp.
    mapping (address => mapping (bytes20 => uint)) public tradingPairCutoffs;
    /// @dev Add a Loopring protocol address.
    /// @param addr A loopring protocol address.
    function authorizeAddress(
        address addr
        )
        external;
    /// @dev Remove a Loopring protocol address.
    /// @param addr A loopring protocol address.
    function deauthorizeAddress(
        address addr
        )
        external;
    function getLatestAuthorizedAddresses(
        uint max
        )
        external
        view
        returns (address[] addresses);
    /// @dev Invoke ERC20 transferFrom method.
    /// @param token Address of token to transfer.
    /// @param from Address to transfer token from.
    /// @param to Address to transfer token to.
    /// @param value Amount of token to transfer.
    function transferToken(
        address token,
        address from,
        address to,
        uint    value
        )
        external;
    function batchTransferToken(
        address lrcTokenAddress,
        address miner,
        address minerFeeRecipient,
        uint8 walletSplitPercentage,
        bytes32[] batch
        )
        external;
    function isAddressAuthorized(
        address addr
        )
        public
        view
        returns (bool);
    function addCancelled(bytes32 orderHash, uint cancelAmount)
        external;
    function addCancelledOrFilled(bytes32 orderHash, uint cancelOrFillAmount)
        public;
    function batchAddCancelledOrFilled(bytes32[] batch)
        public;
    function setCutoffs(uint t)
        external;
    function setTradingPairCutoffs(bytes20 tokenPair, uint t)
        external;
    function checkCutoffsBatch(address[] owners, bytes20[] tradingPairs, uint[] validSince)
        external
        view;
    function suspend() external;
    function resume() external;
    function kill() external;
}
/// @title An Implementation of TokenTransferDelegate.
/// @author Daniel Wang - <[email protected]>.
/// @author Kongliang Zhong - <[email protected]>.
contract TokenTransferDelegateImpl is TokenTransferDelegate, Claimable {
    using MathUint for uint;
    bool public suspended = false;
    struct AddressInfo {
        address previous;
        uint32  index;
        bool    authorized;
    }
    mapping(address => AddressInfo) public addressInfos;
    address private latestAddress;
    modifier onlyAuthorized()
    {
        require(addressInfos[msg.sender].authorized);
        _;
    }
    modifier notSuspended()
    {
        require(!suspended);
        _;
    }
    modifier isSuspended()
    {
        require(suspended);
        _;
    }
    /// @dev Disable default function.
    function ()
        payable
        public
    {
        revert();
    }
    function authorizeAddress(
        address addr
        )
        onlyOwner
        external
    {
        AddressInfo storage addrInfo = addressInfos[addr];
        if (addrInfo.index != 0) { // existing
            if (addrInfo.authorized == false) { // re-authorize
                addrInfo.authorized = true;
                emit AddressAuthorized(addr, addrInfo.index);
            }
        } else {
            address prev = latestAddress;
            if (prev == 0x0) {
                addrInfo.index = 1;
            } else {
                addrInfo.previous = prev;
                addrInfo.index = addressInfos[prev].index + 1;
            }
            addrInfo.authorized = true;
            latestAddress = addr;
            emit AddressAuthorized(addr, addrInfo.index);
        }
    }
    function deauthorizeAddress(
        address addr
        )
        onlyOwner
        external
    {
        uint32 index = addressInfos[addr].index;
        if (index != 0) {
            addressInfos[addr].authorized = false;
            emit AddressDeauthorized(addr, index);
        }
    }
    function getLatestAuthorizedAddresses(
        uint max
        )
        external
        view
        returns (address[] addresses)
    {
        addresses = new address[](max);
        address addr = latestAddress;
        AddressInfo memory addrInfo;
        uint count = 0;
        while (addr != 0x0 && count < max) {
            addrInfo = addressInfos[addr];
            if (addrInfo.index == 0) {
                break;
            }
            if (addrInfo.authorized) {
                addresses[count++] = addr;
            }
            addr = addrInfo.previous;
        }
    }
    function transferToken(
        address token,
        address from,
        address to,
        uint    value
        )
        onlyAuthorized
        notSuspended
        external
    {
        if (value > 0 && from != to && to != 0x0) {
            require(
                ERC20(token).transferFrom(from, to, value)
            );
        }
    }
    function batchTransferToken(
        address lrcTokenAddress,
        address miner,
        address feeRecipient,
        uint8 walletSplitPercentage,
        bytes32[] batch
        )
        onlyAuthorized
        notSuspended
        external
    {
        uint len = batch.length;
        require(len % 7 == 0);
        require(walletSplitPercentage > 0 && walletSplitPercentage < 100);
        ERC20 lrc = ERC20(lrcTokenAddress);
        address prevOwner = address(batch[len - 7]);
        for (uint i = 0; i < len; i += 7) {
            address owner = address(batch[i]);
            // Pay token to previous order, or to miner as previous order's
            // margin split or/and this order's margin split.
            ERC20 token = ERC20(address(batch[i + 1]));
            // Here batch[i + 2] has been checked not to be 0.
            if (batch[i + 2] != 0x0 && owner != prevOwner) {
                require(
                    token.transferFrom(
                        owner,
                        prevOwner,
                        uint(batch[i + 2])
                    )
                );
            }
            // Miner pays LRx fee to order owner
            uint lrcReward = uint(batch[i + 4]);
            if (lrcReward != 0 && miner != owner) {
                require(
                    lrc.transferFrom(
                        miner,
                        owner,
                        lrcReward
                    )
                );
            }
            // Split margin-split income between miner and wallet
            splitPayFee(
                token,
                uint(batch[i + 3]),
                owner,
                feeRecipient,
                address(batch[i + 6]),
                walletSplitPercentage
            );
            // Split LRx fee income between miner and wallet
            splitPayFee(
                lrc,
                uint(batch[i + 5]),
                owner,
                feeRecipient,
                address(batch[i + 6]),
                walletSplitPercentage
            );
            prevOwner = owner;
        }
    }
    function isAddressAuthorized(
        address addr
        )
        public
        view
        returns (bool)
    {
        return addressInfos[addr].authorized;
    }
    function splitPayFee(
        ERC20   token,
        uint    fee,
        address owner,
        address feeRecipient,
        address walletFeeRecipient,
        uint    walletSplitPercentage
        )
        internal
    {
        if (fee == 0) {
            return;
        }
        uint walletFee = (walletFeeRecipient == 0x0) ? 0 : fee.mul(walletSplitPercentage) / 100;
        uint minerFee = fee.sub(walletFee);
        if (walletFee > 0 && walletFeeRecipient != owner) {
            require(
                token.transferFrom(
                    owner,
                    walletFeeRecipient,
                    walletFee
                )
            );
        }
        if (minerFee > 0 && feeRecipient != 0x0 && feeRecipient != owner) {
            require(
                token.transferFrom(
                    owner,
                    feeRecipient,
                    minerFee
                )
            );
        }
    }
    function addCancelled(bytes32 orderHash, uint cancelAmount)
        onlyAuthorized
        notSuspended
        external
    {
        cancelled[orderHash] = cancelled[orderHash].add(cancelAmount);
    }
    function addCancelledOrFilled(bytes32 orderHash, uint cancelOrFillAmount)
        onlyAuthorized
        notSuspended
        public
    {
        cancelledOrFilled[orderHash] = cancelledOrFilled[orderHash].add(cancelOrFillAmount);
    }
    function batchAddCancelledOrFilled(bytes32[] batch)
        onlyAuthorized
        notSuspended
        public
    {
        require(batch.length % 2 == 0);
        for (uint i = 0; i < batch.length / 2; i++) {
            cancelledOrFilled[batch[i * 2]] = cancelledOrFilled[batch[i * 2]]
                .add(uint(batch[i * 2 + 1]));
        }
    }
    function setCutoffs(uint t)
        onlyAuthorized
        notSuspended
        external
    {
        cutoffs[tx.origin] = t;
    }
    function setTradingPairCutoffs(bytes20 tokenPair, uint t)
        onlyAuthorized
        notSuspended
        external
    {
        tradingPairCutoffs[tx.origin][tokenPair] = t;
    }
    function checkCutoffsBatch(address[] owners, bytes20[] tradingPairs, uint[] validSince)
        external
        view
    {
        uint len = owners.length;
        require(len == tradingPairs.length);
        require(len == validSince.length);
        for(uint i = 0; i < len; i++) {
            require(validSince[i] > tradingPairCutoffs[owners[i]][tradingPairs[i]]);  // order trading pair is cut off
            require(validSince[i] > cutoffs[owners[i]]);                              // order is cut off
        }
    }
    function suspend()
        onlyOwner
        notSuspended
        external
    {
        suspended = true;
    }
    function resume()
        onlyOwner
        isSuspended
        external
    {
        suspended = false;
    }
    /// owner must suspend delegate first before invoke kill method.
    function kill()
        onlyOwner
        isSuspended
        external
    {
        emit OwnershipTransferred(owner, 0x0);
        owner = 0x0;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"owners","type":"address[]"},{"name":"tradingPairs","type":"bytes20[]"},{"name":"validSince","type":"uint256[]"}],"name":"checkCutoffsBatch","outputs":[],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"resume","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"max","type":"uint256"}],"name":"getLatestAuthorizedAddresses","outputs":[{"name":"addresses","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"orderHash","type":"bytes32"},{"name":"cancelOrFillAmount","type":"uint256"}],"name":"addCancelledOrFilled","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"cancelled","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"kill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"lrcTokenAddress","type":"address"},{"name":"miner","type":"address"},{"name":"feeRecipient","type":"address"},{"name":"walletSplitPercentage","type":"uint8"},{"name":"batch","type":"bytes32[]"}],"name":"batchTransferToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"authorizeAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenPair","type":"bytes20"},{"name":"t","type":"uint256"}],"name":"setTradingPairCutoffs","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"cancelledOrFilled","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"suspended","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"batch","type":"bytes32[]"}],"name":"batchAddCancelledOrFilled","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"bytes20"}],"name":"tradingPairCutoffs","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"orderHash","type":"bytes32"},{"name":"cancelAmount","type":"uint256"}],"name":"addCancelled","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"addressInfos","outputs":[{"name":"previous","type":"address"},{"name":"index","type":"uint32"},{"name":"authorized","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"isAddressAuthorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"cutoffs","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"suspend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"deauthorizeAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"uint256"}],"name":"setCutoffs","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"number","type":"uint32"}],"name":"AddressAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"},{"indexed":false,"name":"number","type":"uint32"}],"name":"AddressDeauthorized","type":"event"}]

60606040526005805460a060020a60ff021916905560048054600160a060020a03191633600160a060020a03161790556116b18061003e6000396000f30060606040526004361061012e5763ffffffff60e060020a600035041662a16cab8114610133578063046f7da21461016b5780632097dd041461017e57806326fed988146101e75780632ac12622146102005780632c54de4f1461022857806341c0e1b5146102565780634390a4f8146102695780634a5db3b5146102a85780634b99f0c5146102c75780634e71e0c8146102ef5780635511f31914610302578063702efdf314610318578063739647871461033f5780638da5cb5b1461038e578063b8d641a3146103bd578063c955b514146103ee578063ca7a75d114610407578063ced3fb9c1461045b578063de794c1e1461047a578063e30c397814610499578063e6400bbe146104ac578063f2fde38b146104bf578063f73857cc146104de578063fd902d1e146104fd575b600080fd5b341561013e57600080fd5b6101696024600480358281019290820135918135808301929082013591604435918201910135610513565b005b341561017657600080fd5b610169610646565b341561018957600080fd5b610194600435610699565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156101d35780820151838201526020016101bb565b505050509050019250505060405180910390f35b34156101f257600080fd5b6101696004356024356107b5565b341561020b57600080fd5b61021660043561082f565b60405190815260200160405180910390f35b341561023357600080fd5b610169600160a060020a0360043581169060243581169060443516606435610841565b341561026157600080fd5b61016961094a565b341561027457600080fd5b61016960048035600160a060020a039081169160248035831692604435169160643560ff16916084359081019101356109d7565b34156102b357600080fd5b610169600160a060020a0360043516610cc9565b34156102d257600080fd5b6101696bffffffffffffffffffffffff1960043516602435610efa565b34156102fa57600080fd5b610169610f77565b341561030d57600080fd5b610216600435611005565b341561032357600080fd5b61032b611017565b604051901515815260200160405180910390f35b341561034a57600080fd5b610169600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061102795505050505050565b341561039957600080fd5b6103a161112e565b604051600160a060020a03909116815260200160405180910390f35b34156103c857600080fd5b610216600160a060020a03600435166bffffffffffffffffffffffff196024351661113d565b34156103f957600080fd5b61016960043560243561115a565b341561041257600080fd5b610426600160a060020a03600435166111d4565b604051600160a060020a03909316835263ffffffff909116602083015215156040808301919091526060909101905180910390f35b341561046657600080fd5b61032b600160a060020a0360043516611209565b341561048557600080fd5b610216600160a060020a036004351661122e565b34156104a457600080fd5b6103a1611240565b34156104b757600080fd5b61016961124f565b34156104ca57600080fd5b610169600160a060020a03600435166112a7565b34156104e957600080fd5b610169600160a060020a0360043516611322565b341561050857600080fd5b6101696004356113e5565b84600084821461052257600080fd5b81831461052e57600080fd5b5060005b8181101561063c576003600089898481811061054a57fe5b90506020020135600160a060020a0316600160a060020a0316600160a060020a031681526020019081526020016000206000878784818110151561058a57fe5b602090810292909201356bffffffffffffffffffffffff1916835250810191909152604001600020548484838181106105bf57fe5b905060200201351115156105d257600080fd5b600260008989848181106105e257fe5b90506020020135600160a060020a0316600160a060020a0316600160a060020a0316815260200190815260200160002054848483818110151561062157fe5b9050602002013511151561063457600080fd5b600101610532565b5050505050505050565b60045433600160a060020a0390811691161461066157600080fd5b60055460a060020a900460ff16151561067957600080fd5b6005805474ff000000000000000000000000000000000000000019169055565b6106a1611653565b60006106ab611665565b6000846040518059106106bb5750595b9080825280602002602001820160405250600754909450600160a060020a03169250600090505b600160a060020a038316158015906106f957508481105b156107ad57600160a060020a03831660009081526006602052604090819020906060905190810160409081529154600160a060020a038116825260a060020a810463ffffffff166020830190815260c060020a90910460ff1615159282019290925292505163ffffffff16151561076f576107ad565b8160400151156107a4578284828060010193508151811061078c57fe5b600160a060020a039092166020928302909101909101525b815192506106e2565b505050919050565b33600160a060020a031660009081526006602052604090205460c060020a900460ff1615156107e357600080fd5b60055460a060020a900460ff16156107fa57600080fd5b600082815260208190526040902054610819908263ffffffff61144516565b6000928352602083905260409092209190915550565b60016020526000908152604090205481565b33600160a060020a031660009081526006602052604090205460c060020a900460ff16151561086f57600080fd5b60055460a060020a900460ff161561088657600080fd5b6000811180156108a8575081600160a060020a031683600160a060020a031614155b80156108bc5750600160a060020a03821615155b156109445783600160a060020a03166323b872dd84848460405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561092257600080fd5b5af1151561092f57600080fd5b50505060405180519050151561094457600080fd5b50505050565b60045433600160a060020a0390811691161461096557600080fd5b60055460a060020a900460ff16151561097d57600080fd5b600454600090600160a060020a03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36004805473ffffffffffffffffffffffffffffffffffffffff19169055565b33600160a060020a031660009081526006602052604081205481908190819081908190819060c060020a900460ff161515610a1157600080fd5b60055460a060020a900460ff1615610a2857600080fd5b8796506007870615610a3957600080fd5b60008a60ff16118015610a4f575060648a60ff16105b1515610a5a57600080fd5b8c955088886006198901818110610a6d57fe5b6020029190910135955060009450505b86841015610cba57888885818110610a9157fe5b602002919091013593508990508860018601818110610aac57fe5b602002919091013592508990508860028601818110610ac757fe5b60200291909101351580159150610af0575084600160a060020a031683600160a060020a031614155b15610b9057600160a060020a0382166323b872dd84878c8c60028a01818110610b1557fe5b6020029190910135905060405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610b6e57600080fd5b5af11515610b7b57600080fd5b505050604051805190501515610b9057600080fd5b888860048601818110610b9f57fe5b60200291909101359150508015801590610bcb575082600160a060020a03168c600160a060020a031614155b15610c535785600160a060020a03166323b872dd8d858460405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515610c3157600080fd5b5af11515610c3e57600080fd5b505050604051805190501515610c5357600080fd5b610c99828a8a60038801818110610c6657fe5b60200291909101359050858e8d8d60068b01818110610c8157fe5b9050602002013560001916600190048f60ff1661145b565b610cac868a8a60058801818110610c6657fe5b829450600784019350610a7d565b50505050505050505050505050565b600454600090819033600160a060020a03908116911614610ce957600080fd5b600160a060020a0383166000908152600660205260409020805490925060a060020a900463ffffffff1615610daa57815460c060020a900460ff161515610da557815478ff000000000000000000000000000000000000000000000000191660c060020a17808355600160a060020a038416907f3b61204456cbbcb12a2d6b3006f6a24187ac7d5eeef361a93bad25888eebbb309063ffffffff60a060020a9091041660405163ffffffff909116815260200160405180910390a25b610ef5565b50600754600160a060020a0316801515610de857815477ffffffff0000000000000000000000000000000000000000191660a060020a178255610e58565b8154600160a060020a03821673ffffffffffffffffffffffffffffffffffffffff1990911681178084556000918252600660205260409091205463ffffffff60a060020a918290048116600101160277ffffffff0000000000000000000000000000000000000000199091161782555b815478ff000000000000000000000000000000000000000000000000191660c060020a17825560078054600160a060020a03851673ffffffffffffffffffffffffffffffffffffffff19909116811790915582547f3b61204456cbbcb12a2d6b3006f6a24187ac7d5eeef361a93bad25888eebbb309063ffffffff60a060020a9091041660405163ffffffff909116815260200160405180910390a25b505050565b33600160a060020a031660009081526006602052604090205460c060020a900460ff161515610f2857600080fd5b60055460a060020a900460ff1615610f3f57600080fd5b600160a060020a03321660009081526003602090815260408083206bffffffffffffffffffffffff1990951683529390529190912055565b60055433600160a060020a03908116911614610f9257600080fd5b600554600454600160a060020a0391821691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600580546004805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b60006020819052908152604090205481565b60055460a060020a900460ff1681565b33600160a060020a031660009081526006602052604081205460c060020a900460ff16151561105557600080fd5b60055460a060020a900460ff161561106c57600080fd5b6002825181151561107957fe5b061561108457600080fd5b5060005b6002825181151561109557fe5b0481101561112a576110f58282600202600101815181106110b257fe5b906020019060200201516000808560028602815181106110ce57fe5b9060200190602002015181526020810191909152604001600020549063ffffffff61144516565b60008084846002028151811061110757fe5b906020019060200201518152602081019190915260400160002055600101611088565b5050565b600454600160a060020a031681565b600360209081526000928352604080842090915290825290205481565b33600160a060020a031660009081526006602052604090205460c060020a900460ff16151561118857600080fd5b60055460a060020a900460ff161561119f57600080fd5b6000828152600160205260409020546111be908263ffffffff61144516565b6000928352600160205260409092209190915550565b600660205260009081526040902054600160a060020a0381169060a060020a810463ffffffff169060c060020a900460ff1683565b600160a060020a031660009081526006602052604090205460c060020a900460ff1690565b60026020526000908152604090205481565b600554600160a060020a031681565b60045433600160a060020a0390811691161461126a57600080fd5b60055460a060020a900460ff161561128157600080fd5b6005805474ff0000000000000000000000000000000000000000191660a060020a179055565b60045433600160a060020a039081169116146112c257600080fd5b600160a060020a038116158015906112e85750600454600160a060020a03828116911614155b15156112f357600080fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60045460009033600160a060020a0390811691161461134057600080fd5b50600160a060020a03811660009081526006602052604090205460a060020a900463ffffffff16801561112a57600160a060020a03821660008181526006602052604090819020805478ff000000000000000000000000000000000000000000000000191690557fa407c1ccf2240ac410f40f8008c27443bf0d10c03f6fb4565e5796d3bf86a5be9083905163ffffffff909116815260200160405180910390a25050565b33600160a060020a031660009081526006602052604090205460c060020a900460ff16151561141357600080fd5b60055460a060020a900460ff161561142a57600080fd5b600160a060020a033216600090815260026020526040902055565b8181018281101561145557600080fd5b92915050565b60008086151561146a5761063c565b600160a060020a0384161561149a57606461148b888563ffffffff61161916565b81151561149457fe5b0461149d565b60005b91506114af878363ffffffff61163e16565b90506000821180156114d3575085600160a060020a031684600160a060020a031614155b1561155b5787600160a060020a03166323b872dd87868560405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561153957600080fd5b5af1151561154657600080fd5b50505060405180519050151561155b57600080fd5b6000811180156115735750600160a060020a03851615155b8015611591575085600160a060020a031685600160a060020a031614155b1561063c5787600160a060020a03166323b872dd87878460405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b15156115f757600080fd5b5af1151561160457600080fd5b50505060405180519050151561063c57600080fd5b818102821580611633575081838281151561163057fe5b04145b151561145557600080fd5b60008282111561164d57600080fd5b50900390565b60206040519081016040526000815290565b6060604051908101604090815260008083526020830181905290820152905600a165627a7a7230582053442032d682377739894576cfd1e7a5ebc442236c71de7b5d6845364904d2aa0029

Swarm Source

bzzr://53442032d682377739894576cfd1e7a5ebc442236c71de7b5d6845364904d2aa
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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.