ETH Price: $2,802.59 (+1.22%)

Transaction Decoder

Block:
23813731 at Nov-16-2025 07:08:11 PM +UTC
Transaction Fee:
0.000187981518486468 ETH $0.53
Gas Used:
86,858 Gas / 2.164239546 Gwei

Emitted Events:

299 WBTC.Transfer( from=[Sender] 0xf5cbef1d450bcf787e7fce0958146cbe51a6c068, to=[Receiver] 0xe85dc543813b8c2cfeaac371517b925a166a9293, value=2140496 )
300 0xe85dc543813b8c2cfeaac371517b925a166a9293.0xd1cf3d156d5f8f0d50f6c122ed609cec09d35c9b9fb3fff6ea0959134dae424e( 0xd1cf3d156d5f8f0d50f6c122ed609cec09d35c9b9fb3fff6ea0959134dae424e, 0x000000000000000000000000f5cbef1d450bcf787e7fce0958146cbe51a6c068, 0x000000000000000000000000f5cbef1d450bcf787e7fce0958146cbe51a6c068, 000000000000000000000000000000000000000000000000000000000020a950 )
301 0xe85dc543813b8c2cfeaac371517b925a166a9293.0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef( 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x000000000000000000000000f5cbef1d450bcf787e7fce0958146cbe51a6c068, 000000000000000000000000000000000000000000000000000000000020a94f )

Account State Difference:

  Address   Before After State Difference Code
0x2260FAC5...93bc2C599
(Titan Builder)
16.657686260918189794 Eth16.657859976918189794 Eth0.000173716
0xe85Dc543...a166a9293
0xf5cbef1d...E51A6C068
0.39982561412040347 Eth
Nonce: 132
0.399637632601917002 Eth
Nonce: 133
0.000187981518486468

Execution Trace

0xe85dc543813b8c2cfeaac371517b925a166a9293.f2b9fdb8( )
  • 0xb8430b935998b5ae5f4a0b8b8ad01ef454eac16c.f2b9fdb8( )
    • WBTC.balanceOf( _owner=0xe85Dc543813B8c2CFEaAc371517b925a166a9293 ) => ( 4711204629 )
    • WBTC.transferFrom( _from=0xf5cbef1d450bcf787e7fce0958146cBE51A6C068, _to=0xe85Dc543813B8c2CFEaAc371517b925a166a9293, _value=2140496 ) => ( True )
    • WBTC.balanceOf( _owner=0xe85Dc543813B8c2CFEaAc371517b925a166a9293 ) => ( 4713345125 )
      pragma solidity 0.4.24;
      
      // File: openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol
      
      /**
       * @title ERC20Basic
       * @dev Simpler version of ERC20 interface
       * See https://github.com/ethereum/EIPs/issues/179
       */
      contract ERC20Basic {
        function totalSupply() public view returns (uint256);
        function balanceOf(address _who) public view returns (uint256);
        function transfer(address _to, uint256 _value) public returns (bool);
        event Transfer(address indexed from, address indexed to, uint256 value);
      }
      
      // File: openzeppelin-solidity/contracts/math/SafeMath.sol
      
      /**
       * @title SafeMath
       * @dev Math operations with safety checks that throw on error
       */
      library SafeMath {
      
        /**
        * @dev Multiplies two numbers, throws on overflow.
        */
        function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
          // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
          // benefit is lost if 'b' is also tested.
          // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
          if (_a == 0) {
            return 0;
          }
      
          c = _a * _b;
          assert(c / _a == _b);
          return c;
        }
      
        /**
        * @dev Integer division of two numbers, truncating the quotient.
        */
        function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
          // assert(_b > 0); // Solidity automatically throws when dividing by 0
          // uint256 c = _a / _b;
          // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
          return _a / _b;
        }
      
        /**
        * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
        */
        function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
          assert(_b <= _a);
          return _a - _b;
        }
      
        /**
        * @dev Adds two numbers, throws on overflow.
        */
        function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
          c = _a + _b;
          assert(c >= _a);
          return c;
        }
      }
      
      // File: openzeppelin-solidity/contracts/token/ERC20/BasicToken.sol
      
      /**
       * @title Basic token
       * @dev Basic version of StandardToken, with no allowances.
       */
      contract BasicToken is ERC20Basic {
        using SafeMath for uint256;
      
        mapping(address => uint256) internal balances;
      
        uint256 internal totalSupply_;
      
        /**
        * @dev Total number of tokens in existence
        */
        function totalSupply() public view returns (uint256) {
          return totalSupply_;
        }
      
        /**
        * @dev Transfer token for a specified address
        * @param _to The address to transfer to.
        * @param _value The amount to be transferred.
        */
        function transfer(address _to, uint256 _value) public returns (bool) {
          require(_value <= balances[msg.sender]);
          require(_to != address(0));
      
          balances[msg.sender] = balances[msg.sender].sub(_value);
          balances[_to] = balances[_to].add(_value);
          emit Transfer(msg.sender, _to, _value);
          return true;
        }
      
        /**
        * @dev Gets the balance of the specified address.
        * @param _owner The address to query the the balance of.
        * @return An uint256 representing the amount owned by the passed address.
        */
        function balanceOf(address _owner) public view returns (uint256) {
          return balances[_owner];
        }
      
      }
      
      // File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol
      
      /**
       * @title ERC20 interface
       * @dev see https://github.com/ethereum/EIPs/issues/20
       */
      contract ERC20 is ERC20Basic {
        function allowance(address _owner, address _spender)
          public view returns (uint256);
      
        function transferFrom(address _from, address _to, uint256 _value)
          public returns (bool);
      
        function approve(address _spender, uint256 _value) public returns (bool);
        event Approval(
          address indexed owner,
          address indexed spender,
          uint256 value
        );
      }
      
      // File: openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol
      
      /**
       * @title Standard ERC20 token
       *
       * @dev Implementation of the basic standard token.
       * https://github.com/ethereum/EIPs/issues/20
       * Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
       */
      contract StandardToken is ERC20, BasicToken {
      
        mapping (address => mapping (address => uint256)) internal allowed;
      
      
        /**
         * @dev Transfer tokens from one address to another
         * @param _from address The address which you want to send tokens from
         * @param _to address The address which you want to transfer to
         * @param _value uint256 the amount of tokens to be transferred
         */
        function transferFrom(
          address _from,
          address _to,
          uint256 _value
        )
          public
          returns (bool)
        {
          require(_value <= balances[_from]);
          require(_value <= allowed[_from][msg.sender]);
          require(_to != address(0));
      
          balances[_from] = balances[_from].sub(_value);
          balances[_to] = balances[_to].add(_value);
          allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
          emit Transfer(_from, _to, _value);
          return true;
        }
      
        /**
         * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
         * Beware that changing an allowance with this method brings the risk that someone may use both the old
         * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
         * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
         * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
         * @param _spender The address which will spend the funds.
         * @param _value The amount of tokens to be spent.
         */
        function approve(address _spender, uint256 _value) public returns (bool) {
          allowed[msg.sender][_spender] = _value;
          emit Approval(msg.sender, _spender, _value);
          return true;
        }
      
        /**
         * @dev Function to check the amount of tokens that an owner allowed to a spender.
         * @param _owner address The address which owns the funds.
         * @param _spender address The address which will spend the funds.
         * @return A uint256 specifying the amount of tokens still available for the spender.
         */
        function allowance(
          address _owner,
          address _spender
         )
          public
          view
          returns (uint256)
        {
          return allowed[_owner][_spender];
        }
      
        /**
         * @dev Increase the amount of tokens that an owner allowed to a spender.
         * approve should be called when allowed[_spender] == 0. To increment
         * allowed value is better to use this function to avoid 2 calls (and wait until
         * the first transaction is mined)
         * From MonolithDAO Token.sol
         * @param _spender The address which will spend the funds.
         * @param _addedValue The amount of tokens to increase the allowance by.
         */
        function increaseApproval(
          address _spender,
          uint256 _addedValue
        )
          public
          returns (bool)
        {
          allowed[msg.sender][_spender] = (
            allowed[msg.sender][_spender].add(_addedValue));
          emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
          return true;
        }
      
        /**
         * @dev Decrease the amount of tokens that an owner allowed to a spender.
         * approve should be called when allowed[_spender] == 0. To decrement
         * allowed value is better to use this function to avoid 2 calls (and wait until
         * the first transaction is mined)
         * From MonolithDAO Token.sol
         * @param _spender The address which will spend the funds.
         * @param _subtractedValue The amount of tokens to decrease the allowance by.
         */
        function decreaseApproval(
          address _spender,
          uint256 _subtractedValue
        )
          public
          returns (bool)
        {
          uint256 oldValue = allowed[msg.sender][_spender];
          if (_subtractedValue >= oldValue) {
            allowed[msg.sender][_spender] = 0;
          } else {
            allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
          }
          emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
          return true;
        }
      
      }
      
      // File: openzeppelin-solidity/contracts/token/ERC20/DetailedERC20.sol
      
      /**
       * @title DetailedERC20 token
       * @dev The decimals are only for visualization purposes.
       * All the operations are done using the smallest and indivisible token unit,
       * just as on Ethereum all the operations are done in wei.
       */
      contract DetailedERC20 is ERC20 {
        string public name;
        string public symbol;
        uint8 public decimals;
      
        constructor(string _name, string _symbol, uint8 _decimals) public {
          name = _name;
          symbol = _symbol;
          decimals = _decimals;
        }
      }
      
      // File: openzeppelin-solidity/contracts/ownership/Ownable.sol
      
      /**
       * @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 OwnershipRenounced(address indexed previousOwner);
        event OwnershipTransferred(
          address indexed previousOwner,
          address indexed newOwner
        );
      
      
        /**
         * @dev The Ownable constructor sets the original `owner` of the contract to the sender
         * account.
         */
        constructor() 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 relinquish control of the contract.
         * @notice Renouncing to ownership will leave the contract without an owner.
         * It will not be possible to call the functions with the `onlyOwner`
         * modifier anymore.
         */
        function renounceOwnership() public onlyOwner {
          emit OwnershipRenounced(owner);
          owner = address(0);
        }
      
        /**
         * @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) public onlyOwner {
          _transferOwnership(_newOwner);
        }
      
        /**
         * @dev Transfers control of the contract to a newOwner.
         * @param _newOwner The address to transfer ownership to.
         */
        function _transferOwnership(address _newOwner) internal {
          require(_newOwner != address(0));
          emit OwnershipTransferred(owner, _newOwner);
          owner = _newOwner;
        }
      }
      
      // File: openzeppelin-solidity/contracts/token/ERC20/MintableToken.sol
      
      /**
       * @title Mintable token
       * @dev Simple ERC20 Token example, with mintable token creation
       * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
       */
      contract MintableToken is StandardToken, Ownable {
        event Mint(address indexed to, uint256 amount);
        event MintFinished();
      
        bool public mintingFinished = false;
      
      
        modifier canMint() {
          require(!mintingFinished);
          _;
        }
      
        modifier hasMintPermission() {
          require(msg.sender == owner);
          _;
        }
      
        /**
         * @dev Function to mint tokens
         * @param _to The address that will receive the minted tokens.
         * @param _amount The amount of tokens to mint.
         * @return A boolean that indicates if the operation was successful.
         */
        function mint(
          address _to,
          uint256 _amount
        )
          public
          hasMintPermission
          canMint
          returns (bool)
        {
          totalSupply_ = totalSupply_.add(_amount);
          balances[_to] = balances[_to].add(_amount);
          emit Mint(_to, _amount);
          emit Transfer(address(0), _to, _amount);
          return true;
        }
      
        /**
         * @dev Function to stop minting new tokens.
         * @return True if the operation was successful.
         */
        function finishMinting() public onlyOwner canMint returns (bool) {
          mintingFinished = true;
          emit MintFinished();
          return true;
        }
      }
      
      // File: openzeppelin-solidity/contracts/token/ERC20/BurnableToken.sol
      
      /**
       * @title Burnable Token
       * @dev Token that can be irreversibly burned (destroyed).
       */
      contract BurnableToken is BasicToken {
      
        event Burn(address indexed burner, uint256 value);
      
        /**
         * @dev Burns a specific amount of tokens.
         * @param _value The amount of token to be burned.
         */
        function burn(uint256 _value) public {
          _burn(msg.sender, _value);
        }
      
        function _burn(address _who, uint256 _value) internal {
          require(_value <= balances[_who]);
          // no need to require value <= totalSupply, since that would imply the
          // sender's balance is greater than the totalSupply, which *should* be an assertion failure
      
          balances[_who] = balances[_who].sub(_value);
          totalSupply_ = totalSupply_.sub(_value);
          emit Burn(_who, _value);
          emit Transfer(_who, address(0), _value);
        }
      }
      
      // File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol
      
      /**
       * @title Pausable
       * @dev Base contract which allows children to implement an emergency stop mechanism.
       */
      contract Pausable is Ownable {
        event Pause();
        event Unpause();
      
        bool public paused = false;
      
      
        /**
         * @dev Modifier to make a function callable only when the contract is not paused.
         */
        modifier whenNotPaused() {
          require(!paused);
          _;
        }
      
        /**
         * @dev Modifier to make a function callable only when the contract is paused.
         */
        modifier whenPaused() {
          require(paused);
          _;
        }
      
        /**
         * @dev called by the owner to pause, triggers stopped state
         */
        function pause() public onlyOwner whenNotPaused {
          paused = true;
          emit Pause();
        }
      
        /**
         * @dev called by the owner to unpause, returns to normal state
         */
        function unpause() public onlyOwner whenPaused {
          paused = false;
          emit Unpause();
        }
      }
      
      // File: openzeppelin-solidity/contracts/token/ERC20/PausableToken.sol
      
      /**
       * @title Pausable token
       * @dev StandardToken modified with pausable transfers.
       **/
      contract PausableToken is StandardToken, Pausable {
      
        function transfer(
          address _to,
          uint256 _value
        )
          public
          whenNotPaused
          returns (bool)
        {
          return super.transfer(_to, _value);
        }
      
        function transferFrom(
          address _from,
          address _to,
          uint256 _value
        )
          public
          whenNotPaused
          returns (bool)
        {
          return super.transferFrom(_from, _to, _value);
        }
      
        function approve(
          address _spender,
          uint256 _value
        )
          public
          whenNotPaused
          returns (bool)
        {
          return super.approve(_spender, _value);
        }
      
        function increaseApproval(
          address _spender,
          uint _addedValue
        )
          public
          whenNotPaused
          returns (bool success)
        {
          return super.increaseApproval(_spender, _addedValue);
        }
      
        function decreaseApproval(
          address _spender,
          uint _subtractedValue
        )
          public
          whenNotPaused
          returns (bool success)
        {
          return super.decreaseApproval(_spender, _subtractedValue);
        }
      }
      
      // File: openzeppelin-solidity/contracts/ownership/Claimable.sol
      
      /**
       * @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) public onlyOwner {
          pendingOwner = newOwner;
        }
      
        /**
         * @dev Allows the pendingOwner address to finalize the transfer.
         */
        function claimOwnership() public onlyPendingOwner {
          emit OwnershipTransferred(owner, pendingOwner);
          owner = pendingOwner;
          pendingOwner = address(0);
        }
      }
      
      // File: openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol
      
      /**
       * @title SafeERC20
       * @dev Wrappers around ERC20 operations that throw on failure.
       * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
       * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
       */
      library SafeERC20 {
        function safeTransfer(
          ERC20Basic _token,
          address _to,
          uint256 _value
        )
          internal
        {
          require(_token.transfer(_to, _value));
        }
      
        function safeTransferFrom(
          ERC20 _token,
          address _from,
          address _to,
          uint256 _value
        )
          internal
        {
          require(_token.transferFrom(_from, _to, _value));
        }
      
        function safeApprove(
          ERC20 _token,
          address _spender,
          uint256 _value
        )
          internal
        {
          require(_token.approve(_spender, _value));
        }
      }
      
      // File: openzeppelin-solidity/contracts/ownership/CanReclaimToken.sol
      
      /**
       * @title Contracts that should be able to recover tokens
       * @author SylTi
       * @dev This allow a contract to recover any ERC20 token received in a contract by transferring the balance to the contract owner.
       * This will prevent any accidental loss of tokens.
       */
      contract CanReclaimToken is Ownable {
        using SafeERC20 for ERC20Basic;
      
        /**
         * @dev Reclaim all ERC20Basic compatible tokens
         * @param _token ERC20Basic The address of the token contract
         */
        function reclaimToken(ERC20Basic _token) external onlyOwner {
          uint256 balance = _token.balanceOf(this);
          _token.safeTransfer(owner, balance);
        }
      
      }
      
      // File: contracts/utils/OwnableContract.sol
      
      // empty block is used as this contract just inherits others.
      contract OwnableContract is CanReclaimToken, Claimable { } /* solhint-disable-line no-empty-blocks */
      
      // File: contracts/token/WBTC.sol
      
      contract WBTC is StandardToken, DetailedERC20("Wrapped BTC", "WBTC", 8),
          MintableToken, BurnableToken, PausableToken, OwnableContract {
      
          function burn(uint value) public onlyOwner {
              super.burn(value);
          }
      
          function finishMinting() public onlyOwner returns (bool) {
              return false;
          }
      
          function renounceOwnership() public onlyOwner {
              revert("renouncing ownership is blocked");
          }
      }