ETH Price: $3,748.56 (+19.00%)
Gas: 20 Gwei

Transaction Decoder

Block:
11599016 at Jan-06-2021 05:06:45 AM +UTC
Transaction Fee:
0.0081980932 ETH $30.73
Gas Used:
55,618 Gas / 147.4 Gwei

Emitted Events:

52 TokenChildProxyV2.0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef( 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef, 0x000000000000000000000000ae2abd5dd9a1031497860def89dc9b90d0a2cec5, 0x00000000000000000000000033e1d6316b6b49556ea9bec539bffda14bc6c833, 00000000000000000000000000000000000000000000001b1ae4d6e2ef500000 )

Account State Difference:

  Address   Before After State Difference Code
(Spark Pool)
39.065385526861016742 Eth39.073583620061016742 Eth0.0081980932
0x772e7b46...96a510a27
0xaE2abd5D...0d0A2Cec5
0.027400317412622958 Eth
Nonce: 28
0.019202224212622958 Eth
Nonce: 29
0.0081980932

Execution Trace

TokenChildProxyV2.a9059cbb( )
  • TokenChildProxyV2.a9059cbb( )
    • 0xd47c3a5bc71adb4861a8bfe43c71f2aa62852153.a9059cbb( )
      File 1 of 2: TokenChildProxyV2
      // SPDX-License-Identifier: MIT
      
      
      pragma solidity >=0.5.16 <0.7.0;
      
      /**
       * @title Proxy
       *
       * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
       * different contract through the {_delegate} function.
       * 
       * The success and return data of the delegated call will be returned back to the caller of the proxy.
       */
      abstract contract Proxy {
          /**
           * @dev Delegates the current call to `implementation`.
           * 
           * This function does not return to its internall call site, it will return directly to the external caller.
           */
          function _delegate(address implementation) internal {
              // solhint-disable-next-line no-inline-assembly
              assembly {
                  // Copy msg.data. We take full control of memory in this inline assembly
                  // block because it will not return to Solidity code. We overwrite the
                  // Solidity scratch pad at memory position 0.
                  calldatacopy(0, 0, calldatasize())
      
                  // Call the implementation.
                  // out and outsize are 0 because we don't know the size yet.
                  let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
      
                  // Copy the returned data.
                  returndatacopy(0, 0, returndatasize())
      
                  switch result
                  // delegatecall returns 0 on error.
                  case 0 { revert(0, returndatasize()) }
                  default { return(0, returndatasize()) }
              }
          }
      
          /**
           * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
           * and {_fallback} should delegate.
           */
          function _implementation() internal virtual view returns (address);
      
          /**
           * @dev Delegates the current call to the address returned by `_implementation()`.
           * 
           * This function does not return to its internall call site, it will return directly to the external caller.
           */
          function _fallback() internal {
              _beforeFallback();
              _delegate(_implementation());
          }
      
          /**
           * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
           * function in the contract matches the call data.
           */
          fallback () payable external {
              _fallback();
          }
      
          /**
           * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
           * is empty.
           */
          receive () payable external {
              _fallback();
          }
      
          /**
           * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
           * call, or as part of the Solidity `fallback` or `receive` functions.
           * 
           * If overriden should call `super._beforeFallback()`.
           */
          function _beforeFallback() internal virtual {
          }
      }
      
      
      pragma solidity >=0.5.16 <0.7.0;
      
      /**
       * Utility library of inline functions on addresses
       */
      library AddressUtils {
          /**
           * Returns whether the target address is a contract
           * @dev This function will return false if invoked during the constructor of a contract,
           * as the code is not actually created until after the constructor finishes.
           * @param addr address to check
           * @return whether the target address is a contract
           */
          function isContract(address addr) internal view returns (bool) {
              uint256 size;
              // XXX Currently there is no better way to check if there is a contract in an address
              // than to check the size of the code at that address.
              // See https://ethereum.stackexchange.com/a/14016/36603
              // for more details about how this works.
              // TODO Check this again before the Serenity release, because all addresses will be
              // contracts then.
              // solium-disable-next-line security/no-inline-assembly
              assembly {
                  size := extcodesize(addr)
              }
              return size > 0;
          }
      
      }
      
      
      pragma solidity >=0.5.16 <0.7.0;
      
      
      
      /**
       * @title UpgradeableProxyV1
       *
       * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
       * implementation address that can be changed. This address is stored in storage in the location specified by
       * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
       * implementation behind the proxy.
       *
       * Upgradeability is only provided internally through {_upgradeTo}. For an externally upgradeable proxy see
       * {TransparentUpgradeableProxy}.
       */
      abstract contract UpgradeableProxyV1 is Proxy {
          /**
           * @dev Initializes the upgradeable proxy with an initial implementation specified by `logic`.
           *
           * If `_data` is nonempty, it's used as data in a delegate call to `logic`. This will typically be an encoded
           * function call, and allows initializating the storage of the proxy like a Solidity constructor.
           */
          constructor(address logic, bytes memory data) public payable {
              if (logic == address(0x0)) {
                  return;
              }
              assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
              _setImplementation(logic);
              if (data.length > 0) {
                  // solhint-disable-next-line avoid-low-level-calls
                  (bool success, ) = logic.delegatecall(data);
                  require(success, "Call impl with data failed");
              }
          }
      
          function _initProxyImpl(
              address logic,
              bytes memory data
          ) internal virtual {
              require(_implementation() == address(0x0), "Impl had been set");
              _setImplementation(logic);
              if (data.length > 0) {
                  // solhint-disable-next-line avoid-low-level-calls
                  (bool success, ) = logic.delegatecall(data);
                  require(success, "Call impl with data failed");
              }
          }
      
          /**
           * @dev Emitted when the implementation is upgraded.
           */
          event Upgraded(address indexed implementation);
      
          /**
           * @dev Storage slot with the address of the current implementation.
           * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
           * validated in the constructor.
           */
          bytes32 private constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
      
          /**
           * @dev Returns the current implementation.
           * @return impl Address of the current implementation
           */
          function _implementation() internal virtual override view returns (address impl) {
              bytes32 slot = _IMPLEMENTATION_SLOT;
              // solhint-disable-next-line no-inline-assembly
              assembly {
                  impl := sload(slot)
              }
          }
      
          /**
           * @dev Upgrades the proxy to a new implementation.
           *
           * Emits an {Upgraded} event.
           */
          function _upgradeTo(address newImplementation) internal {
              _setImplementation(newImplementation);
              emit Upgraded(newImplementation);
          }
      
          /**
           * @dev Stores a new address in the EIP1967 implementation slot.
           */
          function _setImplementation(address newImplementation) private {
              require(AddressUtils.isContract(newImplementation), "UpgradeableProxy: new implementation is not a contract");
      
              bytes32 slot = _IMPLEMENTATION_SLOT;
      
              // solhint-disable-next-line no-inline-assembly
              assembly {
                  sstore(slot, newImplementation)
              }
          }
      }
      
      
      pragma solidity >=0.5.16 <0.7.0;
      
      
      /**
       * @title ManagedProxyV2
       *
       * @dev This contract implements a proxy that is upgradeable by an admin.
       * initializing the implementation, admin, and init data.
       */
      contract ManagedProxyV2 is UpgradeableProxyV1 {
          /**
           * @dev Initializes an upgradeable proxy managed by `admin`, backed by the implementation at `logic`, and
           * optionally initialized with `data` as explained in {UpgradeableProxy-constructor}.
           */
          constructor(
              address logic,
              address admin,
              bytes memory data
          ) public payable UpgradeableProxyV1(logic, data) {
              assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
              if (admin != address(0x0)) {
                  _setAdmin(admin);
              }
          }
      
          function _initManagedProxy(
              address logic,
              address admin,
              bytes memory data
          ) internal {
              require(_admin() == address(0x0), "Admin had been set");
              _initProxyImpl(logic, data);
              _setAdmin(admin);
          }
      
          /**
           * @dev Emitted when the admin account has changed.
           */
          event AdminChanged(address previousAdmin, address newAdmin);
      
          /**
           * @dev Storage slot with the admin of the contract.
           * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
           * validated in the constructor.
           */
          bytes32 private constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
      
          /**
           * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
           */
          modifier ifAdmin() {
              if (msg.sender == _admin()) {
                  _;
              } else {
                  _fallback();
              }
          }
      
          /**
           * @dev Returns the current admin.
           *
           * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.
           *
           * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
           * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
           * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
           */
          function admin() external ifAdmin returns (address) {
              return _admin();
          }
      
          /**
           * @dev Returns the current implementation.
           *
           * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.
           *
           * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
           * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
           * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
           */
          function implementation() external ifAdmin returns (address) {
              return _implementation();
          }
      
          /**
           * @dev Changes the admin of the proxy.
           *
           * Emits an {AdminChanged} event.
           *
           * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.
           */
          function changeAdmin(address newAdmin) external ifAdmin {
              require(newAdmin != address(0), "ManagedProxy: new admin is the zero address");
              emit AdminChanged(_admin(), newAdmin);
              _setAdmin(newAdmin);
          }
      
          /**
           * @dev Upgrade the implementation of the proxy.
           *
           * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.
           */
          function upgradeTo(address newImplementation) external ifAdmin {
              _upgradeTo(newImplementation);
          }
      
          /**
           * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified
           * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the
           * proxied contract.
           *
           * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.
           */
          function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {
              _upgradeTo(newImplementation);
              // solhint-disable-next-line avoid-low-level-calls
              (bool success, ) = newImplementation.delegatecall(data);
              require(success);
          }
      
          /**
           * @dev Returns the current admin.
           */
          function _admin() internal view returns (address adm) {
              bytes32 slot = _ADMIN_SLOT;
              // solhint-disable-next-line no-inline-assembly
              assembly {
                  adm := sload(slot)
              }
          }
      
          /**
           * @dev Stores a new address in the EIP1967 admin slot.
           */
          function _setAdmin(address newAdmin) private {
              bytes32 slot = _ADMIN_SLOT;
      
              // solhint-disable-next-line no-inline-assembly
              assembly {
                  sstore(slot, newAdmin)
              }
          }
      }
      
      pragma solidity >=0.5.16 <0.7.0;
      
      contract TokenChildProxyV2 is ManagedProxyV2 {
          constructor() public payable ManagedProxyV2(address(0x0), msg.sender, "") {}
      
          function _initProxyOfProxy(
              address impl,
              address admin,
              bytes memory data
          ) public {
              _initManagedProxy(impl, admin, data);
          }
      }

      File 2 of 2: TokenChildProxyV2
      // SPDX-License-Identifier: MIT
      
      
      pragma solidity >=0.5.16 <0.7.0;
      
      /**
       * @title Proxy
       *
       * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
       * different contract through the {_delegate} function.
       * 
       * The success and return data of the delegated call will be returned back to the caller of the proxy.
       */
      abstract contract Proxy {
          /**
           * @dev Delegates the current call to `implementation`.
           * 
           * This function does not return to its internall call site, it will return directly to the external caller.
           */
          function _delegate(address implementation) internal {
              // solhint-disable-next-line no-inline-assembly
              assembly {
                  // Copy msg.data. We take full control of memory in this inline assembly
                  // block because it will not return to Solidity code. We overwrite the
                  // Solidity scratch pad at memory position 0.
                  calldatacopy(0, 0, calldatasize())
      
                  // Call the implementation.
                  // out and outsize are 0 because we don't know the size yet.
                  let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
      
                  // Copy the returned data.
                  returndatacopy(0, 0, returndatasize())
      
                  switch result
                  // delegatecall returns 0 on error.
                  case 0 { revert(0, returndatasize()) }
                  default { return(0, returndatasize()) }
              }
          }
      
          /**
           * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
           * and {_fallback} should delegate.
           */
          function _implementation() internal virtual view returns (address);
      
          /**
           * @dev Delegates the current call to the address returned by `_implementation()`.
           * 
           * This function does not return to its internall call site, it will return directly to the external caller.
           */
          function _fallback() internal {
              _beforeFallback();
              _delegate(_implementation());
          }
      
          /**
           * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
           * function in the contract matches the call data.
           */
          fallback () payable external {
              _fallback();
          }
      
          /**
           * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
           * is empty.
           */
          receive () payable external {
              _fallback();
          }
      
          /**
           * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
           * call, or as part of the Solidity `fallback` or `receive` functions.
           * 
           * If overriden should call `super._beforeFallback()`.
           */
          function _beforeFallback() internal virtual {
          }
      }
      
      
      pragma solidity >=0.5.16 <0.7.0;
      
      /**
       * Utility library of inline functions on addresses
       */
      library AddressUtils {
          /**
           * Returns whether the target address is a contract
           * @dev This function will return false if invoked during the constructor of a contract,
           * as the code is not actually created until after the constructor finishes.
           * @param addr address to check
           * @return whether the target address is a contract
           */
          function isContract(address addr) internal view returns (bool) {
              uint256 size;
              // XXX Currently there is no better way to check if there is a contract in an address
              // than to check the size of the code at that address.
              // See https://ethereum.stackexchange.com/a/14016/36603
              // for more details about how this works.
              // TODO Check this again before the Serenity release, because all addresses will be
              // contracts then.
              // solium-disable-next-line security/no-inline-assembly
              assembly {
                  size := extcodesize(addr)
              }
              return size > 0;
          }
      
      }
      
      
      pragma solidity >=0.5.16 <0.7.0;
      
      
      
      /**
       * @title UpgradeableProxyV1
       *
       * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
       * implementation address that can be changed. This address is stored in storage in the location specified by
       * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
       * implementation behind the proxy.
       *
       * Upgradeability is only provided internally through {_upgradeTo}. For an externally upgradeable proxy see
       * {TransparentUpgradeableProxy}.
       */
      abstract contract UpgradeableProxyV1 is Proxy {
          /**
           * @dev Initializes the upgradeable proxy with an initial implementation specified by `logic`.
           *
           * If `_data` is nonempty, it's used as data in a delegate call to `logic`. This will typically be an encoded
           * function call, and allows initializating the storage of the proxy like a Solidity constructor.
           */
          constructor(address logic, bytes memory data) public payable {
              if (logic == address(0x0)) {
                  return;
              }
              assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
              _setImplementation(logic);
              if (data.length > 0) {
                  // solhint-disable-next-line avoid-low-level-calls
                  (bool success, ) = logic.delegatecall(data);
                  require(success, "Call impl with data failed");
              }
          }
      
          function _initProxyImpl(
              address logic,
              bytes memory data
          ) internal virtual {
              require(_implementation() == address(0x0), "Impl had been set");
              _setImplementation(logic);
              if (data.length > 0) {
                  // solhint-disable-next-line avoid-low-level-calls
                  (bool success, ) = logic.delegatecall(data);
                  require(success, "Call impl with data failed");
              }
          }
      
          /**
           * @dev Emitted when the implementation is upgraded.
           */
          event Upgraded(address indexed implementation);
      
          /**
           * @dev Storage slot with the address of the current implementation.
           * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
           * validated in the constructor.
           */
          bytes32 private constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
      
          /**
           * @dev Returns the current implementation.
           * @return impl Address of the current implementation
           */
          function _implementation() internal virtual override view returns (address impl) {
              bytes32 slot = _IMPLEMENTATION_SLOT;
              // solhint-disable-next-line no-inline-assembly
              assembly {
                  impl := sload(slot)
              }
          }
      
          /**
           * @dev Upgrades the proxy to a new implementation.
           *
           * Emits an {Upgraded} event.
           */
          function _upgradeTo(address newImplementation) internal {
              _setImplementation(newImplementation);
              emit Upgraded(newImplementation);
          }
      
          /**
           * @dev Stores a new address in the EIP1967 implementation slot.
           */
          function _setImplementation(address newImplementation) private {
              require(AddressUtils.isContract(newImplementation), "UpgradeableProxy: new implementation is not a contract");
      
              bytes32 slot = _IMPLEMENTATION_SLOT;
      
              // solhint-disable-next-line no-inline-assembly
              assembly {
                  sstore(slot, newImplementation)
              }
          }
      }
      
      
      pragma solidity >=0.5.16 <0.7.0;
      
      
      /**
       * @title ManagedProxyV2
       *
       * @dev This contract implements a proxy that is upgradeable by an admin.
       * initializing the implementation, admin, and init data.
       */
      contract ManagedProxyV2 is UpgradeableProxyV1 {
          /**
           * @dev Initializes an upgradeable proxy managed by `admin`, backed by the implementation at `logic`, and
           * optionally initialized with `data` as explained in {UpgradeableProxy-constructor}.
           */
          constructor(
              address logic,
              address admin,
              bytes memory data
          ) public payable UpgradeableProxyV1(logic, data) {
              assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
              if (admin != address(0x0)) {
                  _setAdmin(admin);
              }
          }
      
          function _initManagedProxy(
              address logic,
              address admin,
              bytes memory data
          ) internal {
              require(_admin() == address(0x0), "Admin had been set");
              _initProxyImpl(logic, data);
              _setAdmin(admin);
          }
      
          /**
           * @dev Emitted when the admin account has changed.
           */
          event AdminChanged(address previousAdmin, address newAdmin);
      
          /**
           * @dev Storage slot with the admin of the contract.
           * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
           * validated in the constructor.
           */
          bytes32 private constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
      
          /**
           * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
           */
          modifier ifAdmin() {
              if (msg.sender == _admin()) {
                  _;
              } else {
                  _fallback();
              }
          }
      
          /**
           * @dev Returns the current admin.
           *
           * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.
           *
           * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
           * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
           * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
           */
          function admin() external ifAdmin returns (address) {
              return _admin();
          }
      
          /**
           * @dev Returns the current implementation.
           *
           * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.
           *
           * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
           * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
           * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
           */
          function implementation() external ifAdmin returns (address) {
              return _implementation();
          }
      
          /**
           * @dev Changes the admin of the proxy.
           *
           * Emits an {AdminChanged} event.
           *
           * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.
           */
          function changeAdmin(address newAdmin) external ifAdmin {
              require(newAdmin != address(0), "ManagedProxy: new admin is the zero address");
              emit AdminChanged(_admin(), newAdmin);
              _setAdmin(newAdmin);
          }
      
          /**
           * @dev Upgrade the implementation of the proxy.
           *
           * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.
           */
          function upgradeTo(address newImplementation) external ifAdmin {
              _upgradeTo(newImplementation);
          }
      
          /**
           * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified
           * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the
           * proxied contract.
           *
           * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.
           */
          function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {
              _upgradeTo(newImplementation);
              // solhint-disable-next-line avoid-low-level-calls
              (bool success, ) = newImplementation.delegatecall(data);
              require(success);
          }
      
          /**
           * @dev Returns the current admin.
           */
          function _admin() internal view returns (address adm) {
              bytes32 slot = _ADMIN_SLOT;
              // solhint-disable-next-line no-inline-assembly
              assembly {
                  adm := sload(slot)
              }
          }
      
          /**
           * @dev Stores a new address in the EIP1967 admin slot.
           */
          function _setAdmin(address newAdmin) private {
              bytes32 slot = _ADMIN_SLOT;
      
              // solhint-disable-next-line no-inline-assembly
              assembly {
                  sstore(slot, newAdmin)
              }
          }
      }
      
      pragma solidity >=0.5.16 <0.7.0;
      
      contract TokenChildProxyV2 is ManagedProxyV2 {
          constructor() public payable ManagedProxyV2(address(0x0), msg.sender, "") {}
      
          function _initProxyOfProxy(
              address impl,
              address admin,
              bytes memory data
          ) public {
              _initManagedProxy(impl, admin, data);
          }
      }