ETH Price: $2,005.13 (-0.03%)

Transaction Decoder

Block:
4865008 at Jan-06-2018 07:06:42 PM +UTC
Transaction Fee:
0.008538123191021784 ETH $17.12
Gas Used:
46,694 Gas / 182.852683236 Gwei

Account State Difference:

  Address   Before After State Difference Code
0x0D8775F6...50d2887EF
(Nanopool)
10,601.031306362613546406 Eth10,601.03984448580456819 Eth0.008538123191021784
0xFBb1b73C...f520fBB98
(Bittrex)
690,018.699390860051831704 Eth
Nonce: 4048251
690,018.69085273686080992 Eth
Nonce: 4048252
0.008538123191021784

Execution Trace

0x6d0d8e7026afb82bc851c6a63ba76f4c2fe4519b.6ea056a9( )
  • Controller.sweeperOf( _token=0x0D8775F648430679A709E98d2b0Cb6250d2887EF ) => ( 0xb2233FCEC42c588Ee71A594d9A25AA695345426c )
  • DefaultSweeper.sweep( _token=0x0D8775F648430679A709E98d2b0Cb6250d2887EF, _amount=533667356420000000000 ) => ( True )
    • Controller.CALL( )
    • Controller.CALL( )
    • Controller.CALL( )
    • Controller.CALL( )
    • BAToken.balanceOf( _owner=0x6d0d8e7026aFB82bC851c6A63bA76F4C2Fe4519B ) => ( balance=533667356420000000000 )
    • BAToken.transfer( _to=0xFBb1b73C4f0BDa4f67dcA266ce6Ef42f520fBB98, _value=533667356420000000000 ) => ( success=True )
    • Controller.logSweep( from=0x6d0d8e7026aFB82bC851c6A63bA76F4C2Fe4519B, to=0xFBb1b73C4f0BDa4f67dcA266ce6Ef42f520fBB98, token=0x0D8775F648430679A709E98d2b0Cb6250d2887EF, amount=533667356420000000000 )
      File 1 of 3: BAToken
      pragma solidity ^0.4.10;
      
      /* taking ideas from FirstBlood token */
      contract SafeMath {
      
          /* function assert(bool assertion) internal { */
          /*   if (!assertion) { */
          /*     throw; */
          /*   } */
          /* }      // assert no longer needed once solidity is on 0.4.10 */
      
          function safeAdd(uint256 x, uint256 y) internal returns(uint256) {
            uint256 z = x + y;
            assert((z >= x) && (z >= y));
            return z;
          }
      
          function safeSubtract(uint256 x, uint256 y) internal returns(uint256) {
            assert(x >= y);
            uint256 z = x - y;
            return z;
          }
      
          function safeMult(uint256 x, uint256 y) internal returns(uint256) {
            uint256 z = x * y;
            assert((x == 0)||(z/x == y));
            return z;
          }
      
      }
      
      contract Token {
          uint256 public totalSupply;
          function balanceOf(address _owner) constant returns (uint256 balance);
          function transfer(address _to, uint256 _value) returns (bool success);
          function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
          function approve(address _spender, uint256 _value) returns (bool success);
          function allowance(address _owner, address _spender) constant returns (uint256 remaining);
          event Transfer(address indexed _from, address indexed _to, uint256 _value);
          event Approval(address indexed _owner, address indexed _spender, uint256 _value);
      }
      
      
      /*  ERC 20 token */
      contract StandardToken is Token {
      
          function transfer(address _to, uint256 _value) returns (bool success) {
            if (balances[msg.sender] >= _value && _value > 0) {
              balances[msg.sender] -= _value;
              balances[_to] += _value;
              Transfer(msg.sender, _to, _value);
              return true;
            } else {
              return false;
            }
          }
      
          function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
            if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0) {
              balances[_to] += _value;
              balances[_from] -= _value;
              allowed[_from][msg.sender] -= _value;
              Transfer(_from, _to, _value);
              return true;
            } else {
              return false;
            }
          }
      
          function balanceOf(address _owner) constant returns (uint256 balance) {
              return balances[_owner];
          }
      
          function approve(address _spender, uint256 _value) returns (bool success) {
              allowed[msg.sender][_spender] = _value;
              Approval(msg.sender, _spender, _value);
              return true;
          }
      
          function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
            return allowed[_owner][_spender];
          }
      
          mapping (address => uint256) balances;
          mapping (address => mapping (address => uint256)) allowed;
      }
      
      contract BAToken is StandardToken, SafeMath {
      
          // metadata
          string public constant name = "Basic Attention Token";
          string public constant symbol = "BAT";
          uint256 public constant decimals = 18;
          string public version = "1.0";
      
          // contracts
          address public ethFundDeposit;      // deposit address for ETH for Brave International
          address public batFundDeposit;      // deposit address for Brave International use and BAT User Fund
      
          // crowdsale parameters
          bool public isFinalized;              // switched to true in operational state
          uint256 public fundingStartBlock;
          uint256 public fundingEndBlock;
          uint256 public constant batFund = 500 * (10**6) * 10**decimals;   // 500m BAT reserved for Brave Intl use
          uint256 public constant tokenExchangeRate = 6400; // 6400 BAT tokens per 1 ETH
          uint256 public constant tokenCreationCap =  1500 * (10**6) * 10**decimals;
          uint256 public constant tokenCreationMin =  675 * (10**6) * 10**decimals;
      
      
          // events
          event LogRefund(address indexed _to, uint256 _value);
          event CreateBAT(address indexed _to, uint256 _value);
      
          // constructor
          function BAToken(
              address _ethFundDeposit,
              address _batFundDeposit,
              uint256 _fundingStartBlock,
              uint256 _fundingEndBlock)
          {
            isFinalized = false;                   //controls pre through crowdsale state
            ethFundDeposit = _ethFundDeposit;
            batFundDeposit = _batFundDeposit;
            fundingStartBlock = _fundingStartBlock;
            fundingEndBlock = _fundingEndBlock;
            totalSupply = batFund;
            balances[batFundDeposit] = batFund;    // Deposit Brave Intl share
            CreateBAT(batFundDeposit, batFund);  // logs Brave Intl fund
          }
      
          /// @dev Accepts ether and creates new BAT tokens.
          function createTokens() payable external {
            if (isFinalized) throw;
            if (block.number < fundingStartBlock) throw;
            if (block.number > fundingEndBlock) throw;
            if (msg.value == 0) throw;
      
            uint256 tokens = safeMult(msg.value, tokenExchangeRate); // check that we're not over totals
            uint256 checkedSupply = safeAdd(totalSupply, tokens);
      
            // return money if something goes wrong
            if (tokenCreationCap < checkedSupply) throw;  // odd fractions won't be found
      
            totalSupply = checkedSupply;
            balances[msg.sender] += tokens;  // safeAdd not needed; bad semantics to use here
            CreateBAT(msg.sender, tokens);  // logs token creation
          }
      
          /// @dev Ends the funding period and sends the ETH home
          function finalize() external {
            if (isFinalized) throw;
            if (msg.sender != ethFundDeposit) throw; // locks finalize to the ultimate ETH owner
            if(totalSupply < tokenCreationMin) throw;      // have to sell minimum to move to operational
            if(block.number <= fundingEndBlock && totalSupply != tokenCreationCap) throw;
            // move to operational
            isFinalized = true;
            if(!ethFundDeposit.send(this.balance)) throw;  // send the eth to Brave International
          }
      
          /// @dev Allows contributors to recover their ether in the case of a failed funding campaign.
          function refund() external {
            if(isFinalized) throw;                       // prevents refund if operational
            if (block.number <= fundingEndBlock) throw; // prevents refund until sale period is over
            if(totalSupply >= tokenCreationMin) throw;  // no refunds if we sold enough
            if(msg.sender == batFundDeposit) throw;    // Brave Intl not entitled to a refund
            uint256 batVal = balances[msg.sender];
            if (batVal == 0) throw;
            balances[msg.sender] = 0;
            totalSupply = safeSubtract(totalSupply, batVal); // extra safe
            uint256 ethVal = batVal / tokenExchangeRate;     // should be safe; previous throws covers edges
            LogRefund(msg.sender, ethVal);               // log it 
            if (!msg.sender.send(ethVal)) throw;       // if you're using a contract; make sure it works with .send gas limits
          }
      
      }

      File 2 of 3: Controller
      pragma solidity ^0.4.10;
      
      // Copyright 2017 Bittrex
      
      contract AbstractSweeper {
          function sweep(address token, uint amount) returns (bool);
      
          function () { throw; }
      
          Controller controller;
      
          function AbstractSweeper(address _controller) {
              controller = Controller(_controller);
          }
      
          modifier canSweep() {
              if (msg.sender != controller.authorizedCaller() && msg.sender != controller.owner()) throw;
              if (controller.halted()) throw;
              _;
          }
      }
      
      contract Token {
          function balanceOf(address a) returns (uint) {
              (a);
              return 0;
          }
      
          function transfer(address a, uint val) returns (bool) {
              (a);
              (val);
              return false;
          }
      }
      
      contract DefaultSweeper is AbstractSweeper {
          function DefaultSweeper(address controller)
                   AbstractSweeper(controller) {}
      
          function sweep(address _token, uint _amount)
          canSweep
          returns (bool) {
              bool success = false;
              address destination = controller.destination();
      
              if (_token != address(0)) {
                  Token token = Token(_token);
                  uint amount = _amount;
                  if (amount > token.balanceOf(this)) {
                      return false;
                  }
      
                  success = token.transfer(destination, amount);
              }
              else {
                  uint amountInWei = _amount;
                  if (amountInWei > this.balance) {
                      return false;
                  }
      
                  success = destination.send(amountInWei);
              }
      
              if (success) {
                  controller.logSweep(this, destination, _token, _amount);
              }
              return success;
          }
      }
      
      contract UserWallet {
          AbstractSweeperList sweeperList;
          function UserWallet(address _sweeperlist) {
              sweeperList = AbstractSweeperList(_sweeperlist);
          }
      
          function () public payable { }
      
          function tokenFallback(address _from, uint _value, bytes _data) {
              (_from);
              (_value);
              (_data);
           }
      
          function sweep(address _token, uint _amount)
          returns (bool) {
              (_amount);
              return sweeperList.sweeperOf(_token).delegatecall(msg.data);
          }
      }
      
      contract AbstractSweeperList {
          function sweeperOf(address _token) returns (address);
      }
      
      contract Controller is AbstractSweeperList {
          address public owner;
          address public authorizedCaller;
      
          address public destination;
      
          bool public halted;
      
          event LogNewWallet(address receiver);
          event LogSweep(address indexed from, address indexed to, address indexed token, uint amount);
          
          modifier onlyOwner() {
              if (msg.sender != owner) throw; 
              _;
          }
      
          modifier onlyAuthorizedCaller() {
              if (msg.sender != authorizedCaller) throw; 
              _;
          }
      
          modifier onlyAdmins() {
              if (msg.sender != authorizedCaller && msg.sender != owner) throw; 
              _;
          }
      
          function Controller() 
          {
              owner = msg.sender;
              destination = msg.sender;
              authorizedCaller = msg.sender;
          }
      
          function changeAuthorizedCaller(address _newCaller) onlyOwner {
              authorizedCaller = _newCaller;
          }
      
          function changeDestination(address _dest) onlyOwner {
              destination = _dest;
          }
      
          function changeOwner(address _owner) onlyOwner {
              owner = _owner;
          }
      
          function makeWallet() onlyAdmins returns (address wallet)  {
              wallet = address(new UserWallet(this));
              LogNewWallet(wallet);
          }
      
          function halt() onlyAdmins {
              halted = true;
          }
      
          function start() onlyOwner {
              halted = false;
          }
      
          address public defaultSweeper = address(new DefaultSweeper(this));
          mapping (address => address) sweepers;
      
          function addSweeper(address _token, address _sweeper) onlyOwner {
              sweepers[_token] = _sweeper;
          }
      
          function sweeperOf(address _token) returns (address) {
              address sweeper = sweepers[_token];
              if (sweeper == 0) sweeper = defaultSweeper;
              return sweeper;
          }
      
          function logSweep(address from, address to, address token, uint amount) {
              LogSweep(from, to, token, amount);
          }
      }

      File 3 of 3: DefaultSweeper
      pragma solidity ^0.4.10;
      
      // Copyright 2017 Bittrex
      
      contract AbstractSweeper {
          function sweep(address token, uint amount) returns (bool);
      
          function () { throw; }
      
          Controller controller;
      
          function AbstractSweeper(address _controller) {
              controller = Controller(_controller);
          }
      
          modifier canSweep() {
              if (msg.sender != controller.authorizedCaller() && msg.sender != controller.owner()) throw;
              if (controller.halted()) throw;
              _;
          }
      }
      
      contract Token {
          function balanceOf(address a) returns (uint) {
              (a);
              return 0;
          }
      
          function transfer(address a, uint val) returns (bool) {
              (a);
              (val);
              return false;
          }
      }
      
      contract DefaultSweeper is AbstractSweeper {
          function DefaultSweeper(address controller)
                   AbstractSweeper(controller) {}
      
          function sweep(address _token, uint _amount)
          canSweep
          returns (bool) {
              bool success = false;
              address destination = controller.destination();
      
              if (_token != address(0)) {
                  Token token = Token(_token);
                  uint amount = _amount;
                  if (amount > token.balanceOf(this)) {
                      return false;
                  }
      
                  success = token.transfer(destination, amount);
              }
              else {
                  uint amountInWei = _amount;
                  if (amountInWei > this.balance) {
                      return false;
                  }
      
                  success = destination.send(amountInWei);
              }
      
              if (success) {
                  controller.logSweep(this, destination, _token, _amount);
              }
              return success;
          }
      }
      
      contract UserWallet {
          AbstractSweeperList sweeperList;
          function UserWallet(address _sweeperlist) {
              sweeperList = AbstractSweeperList(_sweeperlist);
          }
      
          function () public payable { }
      
          function tokenFallback(address _from, uint _value, bytes _data) {
              (_from);
              (_value);
              (_data);
           }
      
          function sweep(address _token, uint _amount)
          returns (bool) {
              (_amount);
              return sweeperList.sweeperOf(_token).delegatecall(msg.data);
          }
      }
      
      contract AbstractSweeperList {
          function sweeperOf(address _token) returns (address);
      }
      
      contract Controller is AbstractSweeperList {
          address public owner;
          address public authorizedCaller;
      
          address public destination;
      
          bool public halted;
      
          event LogNewWallet(address receiver);
          event LogSweep(address indexed from, address indexed to, address indexed token, uint amount);
          
          modifier onlyOwner() {
              if (msg.sender != owner) throw; 
              _;
          }
      
          modifier onlyAuthorizedCaller() {
              if (msg.sender != authorizedCaller) throw; 
              _;
          }
      
          modifier onlyAdmins() {
              if (msg.sender != authorizedCaller && msg.sender != owner) throw; 
              _;
          }
      
          function Controller() 
          {
              owner = msg.sender;
              destination = msg.sender;
              authorizedCaller = msg.sender;
          }
      
          function changeAuthorizedCaller(address _newCaller) onlyOwner {
              authorizedCaller = _newCaller;
          }
      
          function changeDestination(address _dest) onlyOwner {
              destination = _dest;
          }
      
          function changeOwner(address _owner) onlyOwner {
              owner = _owner;
          }
      
          function makeWallet() onlyAdmins returns (address wallet)  {
              wallet = address(new UserWallet(this));
              LogNewWallet(wallet);
          }
      
          function halt() onlyAdmins {
              halted = true;
          }
      
          function start() onlyOwner {
              halted = false;
          }
      
          address public defaultSweeper = address(new DefaultSweeper(this));
          mapping (address => address) sweepers;
      
          function addSweeper(address _token, address _sweeper) onlyOwner {
              sweepers[_token] = _sweeper;
          }
      
          function sweeperOf(address _token) returns (address) {
              address sweeper = sweepers[_token];
              if (sweeper == 0) sweeper = defaultSweeper;
              return sweeper;
          }
      
          function logSweep(address from, address to, address token, uint amount) {
              LogSweep(from, to, token, amount);
          }
      }