ETH Price: $2,445.78 (+1.87%)

Transaction Decoder

Block:
14150066 at Feb-06-2022 03:34:05 AM +UTC
Transaction Fee:
0.004881277352917368 ETH $11.94
Gas Used:
106,457 Gas / 45.852103224 Gwei

Emitted Events:

99 POWTokenProxy.0xb5ac981f7dfc43b2a141edb45d8ec56a8ec7c42836f3ebf40719b881a1745f1f( 0xb5ac981f7dfc43b2a141edb45d8ec56a8ec7c42836f3ebf40719b881a1745f1f, 0000000000000000000000000000000000000000000000000000000061ff25c8, 0000000000000000000000000000000000000000000000000000000061ff41ad, 000000000000000000000000000000000000000000000000104d13747b830693 )
100 POWTokenProxy.0x26435983069d9b34d528794d1550173e657479ac9a02c70ae09434b978548cea( 0x26435983069d9b34d528794d1550173e657479ac9a02c70ae09434b978548cea, 0x00000000000000000000000077203c37b10d543278f72673e405404ee4c8ddc9, 00000000000000000000000000000000000000000000000001466abe55e6a4ae )

Account State Difference:

  Address   Before After State Difference Code
(Poolin 2)
2,564.369783683077917063 Eth2,564.369943368577917063 Eth0.0001596855
0x77203c37...eE4c8DDC9
2.621861973922515344 Eth
Nonce: 1364
2.708858904694781126 Eth
Nonce: 1365
0.086996930772265782
0xA15690E9...8c300C1ad 183.592895922109532167 Eth183.501017713984349017 Eth0.09187820812518315
0xf3da734c...d6d0b7Cb7

Execution Trace

POWTokenProxy.CALL( )
  • 0x0ca747e2a9560fda38348b844195277ec05f3765.DELEGATECALL( )
    • POWTokenProxy.STATICCALL( )
      • 0xddf23427abe061cd10408661bd3a7d051efe7fed.DELEGATECALL( )
      • POWTokenProxy.STATICCALL( )
        • 0xddf23427abe061cd10408661bd3a7d051efe7fed.DELEGATECALL( )
        • POWTokenProxy.STATICCALL( )
          • 0xddf23427abe061cd10408661bd3a7d051efe7fed.DELEGATECALL( )
          • POWTokenProxy.STATICCALL( )
            • 0xddf23427abe061cd10408661bd3a7d051efe7fed.DELEGATECALL( )
            • POWTokenProxy.STATICCALL( )
              • 0xddf23427abe061cd10408661bd3a7d051efe7fed.DELEGATECALL( )
              • POWTokenProxy.STATICCALL( )
                • 0xddf23427abe061cd10408661bd3a7d051efe7fed.DELEGATECALL( )
                • POWTokenProxy.STATICCALL( )
                  • 0xddf23427abe061cd10408661bd3a7d051efe7fed.DELEGATECALL( )
                  • POWTokenProxy.5a44de17( )
                    • 0xddf23427abe061cd10408661bd3a7d051efe7fed.5a44de17( )
                    • POWTokenProxy.6117d0a9( )
                      • 0xddf23427abe061cd10408661bd3a7d051efe7fed.6117d0a9( )
                        • ETH 0.09187820812518315 0x77203c37b10d543278f72673e405404ee4c8ddc9.CALL( )
                          File 1 of 2: POWTokenProxy
                          pragma solidity ^0.5.0;
                          
                          /**
                           * Utility library of inline functions on addresses
                           *
                           * Source https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-solidity/v2.1.3/contracts/utils/Address.sol
                           * This contract is copied here and renamed from the original to avoid clashes in the compiled artifacts
                           * when the user imports a zos-lib contract (that transitively causes this contract to be compiled and added to the
                           * build/artifacts folder) as well as the vanilla Address implementation from an openzeppelin version.
                           */
                          library ZOSLibAddress {
                              /**
                               * 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 account address of the account to check
                               * @return whether the target address is a contract
                               */
                              function isContract(address account) 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.
                                  // solhint-disable-next-line no-inline-assembly
                                  assembly { size := extcodesize(account) }
                                  return size > 0;
                              }
                          }
                          
                          /**
                           * @title Proxy
                           * @dev Implements delegation of calls to other contracts, with proper
                           * forwarding of return values and bubbling of failures.
                           * It defines a fallback function that delegates all calls to the address
                           * returned by the abstract _implementation() internal function.
                           */
                          contract Proxy {
                              /**
                               * @dev Fallback function.
                               * Implemented entirely in `_fallback`.
                               */
                              function () payable external {
                                  _fallback();
                              }
                          
                              /**
                               * @return The Address of the implementation.
                               */
                              function _implementation() internal view returns (address);
                          
                              /**
                               * @dev Delegates execution to an implementation contract.
                               * This is a low level function that doesn't return to its internal call site.
                               * It will return to the external caller whatever the implementation returns.
                               * @param implementation Address to delegate.
                               */
                              function _delegate(address implementation) internal {
                                  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 Function that is run as the first thing in the fallback function.
                               * Can be redefined in derived contracts to add functionality.
                               * Redefinitions must call super._willFallback().
                               */
                              function _willFallback() internal {
                              }
                          
                              /**
                               * @dev fallback implementation.
                               * Extracted to enable manual triggering.
                               */
                              function _fallback() internal {
                                  _willFallback();
                                  _delegate(_implementation());
                              }
                          }
                          
                          /**
                           * @title BaseUpgradeabilityProxy
                           * @dev This contract implements a proxy that allows to change the
                           * implementation address to which it will delegate.
                           * Such a change is called an implementation upgrade.
                           */
                          contract BaseUpgradeabilityProxy is Proxy {
                              /**
                               * @dev Emitted when the implementation is upgraded.
                               * @param implementation Address of the new implementation.
                               */
                              event Upgraded(address indexed implementation);
                          
                              /**
                               * @dev Storage slot with the address of the current implementation.
                               * This is the keccak-256 hash of "org.zeppelinos.proxy.implementation", and is
                               * validated in the constructor.
                               */
                              bytes32 internal constant IMPLEMENTATION_SLOT = 0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3;
                          
                              /**
                               * @dev Returns the current implementation.
                               * @return Address of the current implementation
                               */
                              function _implementation() internal view returns (address impl) {
                                  bytes32 slot = IMPLEMENTATION_SLOT;
                                  assembly {
                                      impl := sload(slot)
                                  }
                              }
                          
                              /**
                               * @dev Upgrades the proxy to a new implementation.
                               * @param newImplementation Address of the new implementation.
                               */
                              function _upgradeTo(address newImplementation) internal {
                                  _setImplementation(newImplementation);
                                  emit Upgraded(newImplementation);
                              }
                          
                              /**
                               * @dev Sets the implementation address of the proxy.
                               * @param newImplementation Address of the new implementation.
                               */
                              function _setImplementation(address newImplementation) internal {
                                  require(ZOSLibAddress.isContract(newImplementation), "Cannot set a proxy implementation to a non-contract address");
                          
                                  bytes32 slot = IMPLEMENTATION_SLOT;
                          
                                  assembly {
                                      sstore(slot, newImplementation)
                                  }
                              }
                          }
                          
                          /**
                           * @title UpgradeabilityProxy
                           * @dev Extends BaseUpgradeabilityProxy with a constructor for initializing
                           * implementation and init data.
                           */
                          contract UpgradeabilityProxy is BaseUpgradeabilityProxy {
                              /**
                               * @dev Contract constructor.
                               * @param _logic Address of the initial implementation.
                               * @param _data Data to send as msg.data to the implementation to initialize the proxied contract.
                               * It should include the signature and the parameters of the function to be called, as described in
                               * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.
                               * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped.
                               */
                              constructor(address _logic, bytes memory _data) public payable {
                                  assert(IMPLEMENTATION_SLOT == keccak256("org.zeppelinos.proxy.implementation"));
                                  _setImplementation(_logic);
                                  if(_data.length > 0) {
                                      (bool success,) = _logic.delegatecall(_data);
                                      require(success);
                                  }
                              }
                          }
                          
                          /**
                           * @title BaseAdminUpgradeabilityProxy
                           * @dev This contract combines an upgradeability proxy with an authorization
                           * mechanism for administrative tasks.
                           * All external functions in this contract must be guarded by the
                           * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity
                           * feature proposal that would enable this to be done automatically.
                           */
                          contract BaseAdminUpgradeabilityProxy is BaseUpgradeabilityProxy {
                              /**
                               * @dev Emitted when the administration has been transferred.
                               * @param previousAdmin Address of the previous admin.
                               * @param newAdmin Address of the new admin.
                               */
                              event AdminChanged(address previousAdmin, address newAdmin);
                          
                              /**
                               * @dev Storage slot with the admin of the contract.
                               * This is the keccak-256 hash of "org.zeppelinos.proxy.admin", and is
                               * validated in the constructor.
                               */
                              bytes32 internal constant ADMIN_SLOT = 0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b;
                          
                              /**
                               * @dev Modifier to check whether the `msg.sender` is the admin.
                               * If it is, it will run the function. Otherwise, it will delegate the call
                               * to the implementation.
                               */
                              modifier ifAdmin() {
                                  if (msg.sender == _admin()) {
                                      _;
                                  } else {
                                      _fallback();
                                  }
                              }
                          
                              /**
                               * @return The address of the proxy admin.
                               */
                              function admin() external ifAdmin returns (address) {
                                  return _admin();
                              }
                          
                              /**
                               * @return The address of the implementation.
                               */
                              function implementation() external ifAdmin returns (address) {
                                  return _implementation();
                              }
                          
                              /**
                               * @dev Changes the admin of the proxy.
                               * Only the current admin can call this function.
                               * @param newAdmin Address to transfer proxy administration to.
                               */
                              function changeAdmin(address newAdmin) external ifAdmin {
                                  require(newAdmin != address(0), "Cannot change the admin of a proxy to the zero address");
                                  emit AdminChanged(_admin(), newAdmin);
                                  _setAdmin(newAdmin);
                              }
                          
                              /**
                               * @dev Upgrade the backing implementation of the proxy.
                               * Only the admin can call this function.
                               * @param newImplementation Address of the new implementation.
                               */
                              function upgradeTo(address newImplementation) external ifAdmin {
                                  _upgradeTo(newImplementation);
                              }
                          
                              /**
                               * @dev Upgrade the backing implementation of the proxy and call a function
                               * on the new implementation.
                               * This is useful to initialize the proxied contract.
                               * @param newImplementation Address of the new implementation.
                               * @param data Data to send as msg.data in the low level call.
                               * It should include the signature and the parameters of the function to be called, as described in
                               * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.
                               */
                              function upgradeToAndCall(address newImplementation, bytes calldata data) payable external ifAdmin {
                                  _upgradeTo(newImplementation);
                                  (bool success,) = newImplementation.delegatecall(data);
                                  require(success);
                              }
                          
                              /**
                               * @return The admin slot.
                               */
                              function _admin() internal view returns (address adm) {
                                  bytes32 slot = ADMIN_SLOT;
                                  assembly {
                                      adm := sload(slot)
                                  }
                              }
                          
                              /**
                               * @dev Sets the address of the proxy admin.
                               * @param newAdmin Address of the new proxy admin.
                               */
                              function _setAdmin(address newAdmin) internal {
                                  bytes32 slot = ADMIN_SLOT;
                          
                                  assembly {
                                      sstore(slot, newAdmin)
                                  }
                              }
                          
                              /**
                               * @dev Only fall back when the sender is not the admin.
                               */
                              function _willFallback() internal {
                                  require(msg.sender != _admin(), "Cannot call fallback function from the proxy admin");
                                  super._willFallback();
                              }
                          }
                          
                          /**
                           * @title AdminUpgradeabilityProxy
                           * @dev Extends from BaseAdminUpgradeabilityProxy with a constructor for
                           * initializing the implementation, admin, and init data.
                           */
                          contract AdminUpgradeabilityProxy is BaseAdminUpgradeabilityProxy, UpgradeabilityProxy {
                              /**
                               * Contract constructor.
                               * @param _logic address of the initial implementation.
                               * @param _admin Address of the proxy administrator.
                               * @param _data Data to send as msg.data to the implementation to initialize the proxied contract.
                               * It should include the signature and the parameters of the function to be called, as described in
                               * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.
                               * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped.
                               */
                              constructor(address _logic, address _admin, bytes memory _data) UpgradeabilityProxy(_logic, _data) public payable {
                                  assert(ADMIN_SLOT == keccak256("org.zeppelinos.proxy.admin"));
                                  _setAdmin(_admin);
                              }
                          }
                          
                          contract POWTokenProxy is AdminUpgradeabilityProxy {
                              constructor(address _implementation, address _admin) public AdminUpgradeabilityProxy(_implementation, _admin, new bytes(0)) {
                              }
                          }

                          File 2 of 2: POWTokenProxy
                          pragma solidity ^0.5.0;
                          
                          /**
                           * Utility library of inline functions on addresses
                           *
                           * Source https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-solidity/v2.1.3/contracts/utils/Address.sol
                           * This contract is copied here and renamed from the original to avoid clashes in the compiled artifacts
                           * when the user imports a zos-lib contract (that transitively causes this contract to be compiled and added to the
                           * build/artifacts folder) as well as the vanilla Address implementation from an openzeppelin version.
                           */
                          library ZOSLibAddress {
                              /**
                               * 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 account address of the account to check
                               * @return whether the target address is a contract
                               */
                              function isContract(address account) 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.
                                  // solhint-disable-next-line no-inline-assembly
                                  assembly { size := extcodesize(account) }
                                  return size > 0;
                              }
                          }
                          
                          /**
                           * @title Proxy
                           * @dev Implements delegation of calls to other contracts, with proper
                           * forwarding of return values and bubbling of failures.
                           * It defines a fallback function that delegates all calls to the address
                           * returned by the abstract _implementation() internal function.
                           */
                          contract Proxy {
                              /**
                               * @dev Fallback function.
                               * Implemented entirely in `_fallback`.
                               */
                              function () payable external {
                                  _fallback();
                              }
                          
                              /**
                               * @return The Address of the implementation.
                               */
                              function _implementation() internal view returns (address);
                          
                              /**
                               * @dev Delegates execution to an implementation contract.
                               * This is a low level function that doesn't return to its internal call site.
                               * It will return to the external caller whatever the implementation returns.
                               * @param implementation Address to delegate.
                               */
                              function _delegate(address implementation) internal {
                                  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 Function that is run as the first thing in the fallback function.
                               * Can be redefined in derived contracts to add functionality.
                               * Redefinitions must call super._willFallback().
                               */
                              function _willFallback() internal {
                              }
                          
                              /**
                               * @dev fallback implementation.
                               * Extracted to enable manual triggering.
                               */
                              function _fallback() internal {
                                  _willFallback();
                                  _delegate(_implementation());
                              }
                          }
                          
                          /**
                           * @title BaseUpgradeabilityProxy
                           * @dev This contract implements a proxy that allows to change the
                           * implementation address to which it will delegate.
                           * Such a change is called an implementation upgrade.
                           */
                          contract BaseUpgradeabilityProxy is Proxy {
                              /**
                               * @dev Emitted when the implementation is upgraded.
                               * @param implementation Address of the new implementation.
                               */
                              event Upgraded(address indexed implementation);
                          
                              /**
                               * @dev Storage slot with the address of the current implementation.
                               * This is the keccak-256 hash of "org.zeppelinos.proxy.implementation", and is
                               * validated in the constructor.
                               */
                              bytes32 internal constant IMPLEMENTATION_SLOT = 0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3;
                          
                              /**
                               * @dev Returns the current implementation.
                               * @return Address of the current implementation
                               */
                              function _implementation() internal view returns (address impl) {
                                  bytes32 slot = IMPLEMENTATION_SLOT;
                                  assembly {
                                      impl := sload(slot)
                                  }
                              }
                          
                              /**
                               * @dev Upgrades the proxy to a new implementation.
                               * @param newImplementation Address of the new implementation.
                               */
                              function _upgradeTo(address newImplementation) internal {
                                  _setImplementation(newImplementation);
                                  emit Upgraded(newImplementation);
                              }
                          
                              /**
                               * @dev Sets the implementation address of the proxy.
                               * @param newImplementation Address of the new implementation.
                               */
                              function _setImplementation(address newImplementation) internal {
                                  require(ZOSLibAddress.isContract(newImplementation), "Cannot set a proxy implementation to a non-contract address");
                          
                                  bytes32 slot = IMPLEMENTATION_SLOT;
                          
                                  assembly {
                                      sstore(slot, newImplementation)
                                  }
                              }
                          }
                          
                          /**
                           * @title UpgradeabilityProxy
                           * @dev Extends BaseUpgradeabilityProxy with a constructor for initializing
                           * implementation and init data.
                           */
                          contract UpgradeabilityProxy is BaseUpgradeabilityProxy {
                              /**
                               * @dev Contract constructor.
                               * @param _logic Address of the initial implementation.
                               * @param _data Data to send as msg.data to the implementation to initialize the proxied contract.
                               * It should include the signature and the parameters of the function to be called, as described in
                               * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.
                               * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped.
                               */
                              constructor(address _logic, bytes memory _data) public payable {
                                  assert(IMPLEMENTATION_SLOT == keccak256("org.zeppelinos.proxy.implementation"));
                                  _setImplementation(_logic);
                                  if(_data.length > 0) {
                                      (bool success,) = _logic.delegatecall(_data);
                                      require(success);
                                  }
                              }
                          }
                          
                          /**
                           * @title BaseAdminUpgradeabilityProxy
                           * @dev This contract combines an upgradeability proxy with an authorization
                           * mechanism for administrative tasks.
                           * All external functions in this contract must be guarded by the
                           * `ifAdmin` modifier. See ethereum/solidity#3864 for a Solidity
                           * feature proposal that would enable this to be done automatically.
                           */
                          contract BaseAdminUpgradeabilityProxy is BaseUpgradeabilityProxy {
                              /**
                               * @dev Emitted when the administration has been transferred.
                               * @param previousAdmin Address of the previous admin.
                               * @param newAdmin Address of the new admin.
                               */
                              event AdminChanged(address previousAdmin, address newAdmin);
                          
                              /**
                               * @dev Storage slot with the admin of the contract.
                               * This is the keccak-256 hash of "org.zeppelinos.proxy.admin", and is
                               * validated in the constructor.
                               */
                              bytes32 internal constant ADMIN_SLOT = 0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b;
                          
                              /**
                               * @dev Modifier to check whether the `msg.sender` is the admin.
                               * If it is, it will run the function. Otherwise, it will delegate the call
                               * to the implementation.
                               */
                              modifier ifAdmin() {
                                  if (msg.sender == _admin()) {
                                      _;
                                  } else {
                                      _fallback();
                                  }
                              }
                          
                              /**
                               * @return The address of the proxy admin.
                               */
                              function admin() external ifAdmin returns (address) {
                                  return _admin();
                              }
                          
                              /**
                               * @return The address of the implementation.
                               */
                              function implementation() external ifAdmin returns (address) {
                                  return _implementation();
                              }
                          
                              /**
                               * @dev Changes the admin of the proxy.
                               * Only the current admin can call this function.
                               * @param newAdmin Address to transfer proxy administration to.
                               */
                              function changeAdmin(address newAdmin) external ifAdmin {
                                  require(newAdmin != address(0), "Cannot change the admin of a proxy to the zero address");
                                  emit AdminChanged(_admin(), newAdmin);
                                  _setAdmin(newAdmin);
                              }
                          
                              /**
                               * @dev Upgrade the backing implementation of the proxy.
                               * Only the admin can call this function.
                               * @param newImplementation Address of the new implementation.
                               */
                              function upgradeTo(address newImplementation) external ifAdmin {
                                  _upgradeTo(newImplementation);
                              }
                          
                              /**
                               * @dev Upgrade the backing implementation of the proxy and call a function
                               * on the new implementation.
                               * This is useful to initialize the proxied contract.
                               * @param newImplementation Address of the new implementation.
                               * @param data Data to send as msg.data in the low level call.
                               * It should include the signature and the parameters of the function to be called, as described in
                               * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.
                               */
                              function upgradeToAndCall(address newImplementation, bytes calldata data) payable external ifAdmin {
                                  _upgradeTo(newImplementation);
                                  (bool success,) = newImplementation.delegatecall(data);
                                  require(success);
                              }
                          
                              /**
                               * @return The admin slot.
                               */
                              function _admin() internal view returns (address adm) {
                                  bytes32 slot = ADMIN_SLOT;
                                  assembly {
                                      adm := sload(slot)
                                  }
                              }
                          
                              /**
                               * @dev Sets the address of the proxy admin.
                               * @param newAdmin Address of the new proxy admin.
                               */
                              function _setAdmin(address newAdmin) internal {
                                  bytes32 slot = ADMIN_SLOT;
                          
                                  assembly {
                                      sstore(slot, newAdmin)
                                  }
                              }
                          
                              /**
                               * @dev Only fall back when the sender is not the admin.
                               */
                              function _willFallback() internal {
                                  require(msg.sender != _admin(), "Cannot call fallback function from the proxy admin");
                                  super._willFallback();
                              }
                          }
                          
                          /**
                           * @title AdminUpgradeabilityProxy
                           * @dev Extends from BaseAdminUpgradeabilityProxy with a constructor for
                           * initializing the implementation, admin, and init data.
                           */
                          contract AdminUpgradeabilityProxy is BaseAdminUpgradeabilityProxy, UpgradeabilityProxy {
                              /**
                               * Contract constructor.
                               * @param _logic address of the initial implementation.
                               * @param _admin Address of the proxy administrator.
                               * @param _data Data to send as msg.data to the implementation to initialize the proxied contract.
                               * It should include the signature and the parameters of the function to be called, as described in
                               * https://solidity.readthedocs.io/en/v0.4.24/abi-spec.html#function-selector-and-argument-encoding.
                               * This parameter is optional, if no data is given the initialization call to proxied contract will be skipped.
                               */
                              constructor(address _logic, address _admin, bytes memory _data) UpgradeabilityProxy(_logic, _data) public payable {
                                  assert(ADMIN_SLOT == keccak256("org.zeppelinos.proxy.admin"));
                                  _setAdmin(_admin);
                              }
                          }
                          
                          contract POWTokenProxy is AdminUpgradeabilityProxy {
                              constructor(address _implementation, address _admin) public AdminUpgradeabilityProxy(_implementation, _admin, new bytes(0)) {
                              }
                          }