false
true
0

Contract Address Details

0x6122214F7C2747ABD4445489A504c5eDA70201d5

Contract Name
PausableUpgradableProxy
Creator
0xb94333–acb7c0 at 0x9668b6–1778c9
Implementation
RailgunSmartWallet | 0xd29deeb6120103d60f75dbcdc37b43686cefefb7
Balance
0 tPLS
Tokens
Fetching tokens...
Transactions
56 Transactions
Transfers
0 Transfers
Gas Used
51,005,173
Last Balance Update
25690564
Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB 0x17ff8ea50358eed43cb513de794faf59be257b99.
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
Verify & Publish
Contract name:
PausableUpgradableProxy




Optimization enabled
true
Compiler version
v0.8.17+commit.8df45f5f




Optimization runs
200
Verified at
2025-04-30T20:35:03.063189Z

contracts/proxy/Proxy.sol

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.7;
pragma abicoder v2;

// OpenZeppelin v4
import { StorageSlot } from "@openzeppelin/contracts/utils/StorageSlot.sol";
import { Address } from "@openzeppelin/contracts/utils/Address.sol";

/**
 * @title PausableUpgradableProxy
 * @author Railgun Contributors
 * @notice Delegates calls to implementation address
 * @dev Calls are reverted if the contract is paused
 */
contract PausableUpgradableProxy {
  // Storage slot locations
  bytes32 private constant IMPLEMENTATION_SLOT =
    bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1);
  bytes32 private constant ADMIN_SLOT = bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1);
  bytes32 private constant PAUSED_SLOT = bytes32(uint256(keccak256("eip1967.proxy.paused")) - 1);

  // Events
  event ProxyUpgrade(address previousImplementation, address newImplementation);
  event ProxyOwnershipTransfer(address previousOwner, address newOwner);
  event ProxyPause();
  event ProxyUnpause();

  /**
   * @notice Sets initial specified admin value
   * Implementation is set as 0x0 and contract is created as paused
   * @dev Implementation must be set before unpausing
   */

  constructor(address _admin) {
    // Set initial value for admin
    StorageSlot.getAddressSlot(ADMIN_SLOT).value = _admin;

    // Explicitly initialize implementation as 0
    StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = address(0);

    // Explicitly initialize as paused
    StorageSlot.getBooleanSlot(PAUSED_SLOT).value = true;
  }

  /**
   * @notice Reverts if proxy is paused
   */

  modifier notPaused() {
    // Revert if the contract is paused
    require(!StorageSlot.getBooleanSlot(PAUSED_SLOT).value, "Proxy: Contract is paused");
    _;
  }

  /**
   * @notice Delegates call to implementation
   */

  function delegate() internal notPaused {
    // Get implementation
    address implementation = StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;

    // Check that implementation exists
    require(Address.isContract(implementation), "Proxy: Implementation doesn't exist");

    // 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())
      }
    }
  }

  /**
   * @notice Prevents calls unless caller is owner
   * @dev This should be on all external/public functions that aren't the fallback
   */

  modifier onlyOwner() {
    if (msg.sender == StorageSlot.getAddressSlot(ADMIN_SLOT).value) {
      _;
    } else {
      // Redirect to delegate if caller isn't owner
      delegate();
    }
  }

  /**
   * @notice fallback function that delegates calls with calldata
   */
  fallback() external payable {
    delegate();
  }

  /**
   * @notice fallback function that delegates calls with no calldata
   */
  receive() external payable {
    delegate();
  }

  /**
   * @notice Transfers ownership to new address
   * @param _newOwner - Address to transfer ownership to
   */
  function transferOwnership(address _newOwner) external onlyOwner {
    require(_newOwner != address(0), "Proxy: Preventing potential accidental burn");

    // Get admin slot
    StorageSlot.AddressSlot storage admin = StorageSlot.getAddressSlot(ADMIN_SLOT);

    // Emit event
    emit ProxyOwnershipTransfer(admin.value, _newOwner);

    // Store new admin
    admin.value = _newOwner;
  }

  /**
   * @notice Upgrades implementation
   * @param _newImplementation - Address of the new implementation
   */
  function upgrade(address _newImplementation) external onlyOwner {
    // Get implementation slot
    StorageSlot.AddressSlot storage implementation = StorageSlot.getAddressSlot(
      IMPLEMENTATION_SLOT
    );

    // If new implementation is identical to old, skip
    if (implementation.value != _newImplementation) {
      // Emit event
      emit ProxyUpgrade(implementation.value, _newImplementation);

      // Store new implementation
      implementation.value = _newImplementation;
    }
  }

  /**
   * @notice Pauses contract
   */
  function pause() external onlyOwner {
    // Get paused slot
    StorageSlot.BooleanSlot storage paused = StorageSlot.getBooleanSlot(PAUSED_SLOT);

    // If not already paused, pause
    if (!paused.value) {
      // Set paused to true
      paused.value = true;

      // Emit paused event
      emit ProxyPause();
    }
  }

  /**
   * @notice Unpauses contract
   */
  function unpause() external onlyOwner {
    // Get paused slot
    StorageSlot.BooleanSlot storage paused = StorageSlot.getBooleanSlot(PAUSED_SLOT);

    // If already unpaused, do nothing
    if (paused.value) {
      // Set paused to true
      paused.value = false;

      // Emit paused event
      emit ProxyUnpause();
    }
  }
}
        

@openzeppelin/contracts/utils/Address.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}
          

@openzeppelin/contracts/utils/StorageSlot.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.

pragma solidity ^0.8.0;

/**
 * @dev Library for reading and writing primitive types to specific storage slots.
 *
 * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
 * This library helps with reading and writing to such slots without the need for inline assembly.
 *
 * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
 *
 * Example usage to set ERC1967 implementation slot:
 * ```solidity
 * contract ERC1967 {
 *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
 *
 *     function _getImplementation() internal view returns (address) {
 *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
 *     }
 *
 *     function _setImplementation(address newImplementation) internal {
 *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
 *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
 *     }
 * }
 * ```
 *
 * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._
 * _Available since v4.9 for `string`, `bytes`._
 */
library StorageSlot {
    struct AddressSlot {
        address value;
    }

    struct BooleanSlot {
        bool value;
    }

    struct Bytes32Slot {
        bytes32 value;
    }

    struct Uint256Slot {
        uint256 value;
    }

    struct StringSlot {
        string value;
    }

    struct BytesSlot {
        bytes value;
    }

    /**
     * @dev Returns an `AddressSlot` with member `value` located at `slot`.
     */
    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
     */
    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
     */
    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
     */
    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `StringSlot` with member `value` located at `slot`.
     */
    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.
     */
    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := store.slot
        }
    }

    /**
     * @dev Returns an `BytesSlot` with member `value` located at `slot`.
     */
    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
     */
    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := store.slot
        }
    }
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["storageLayout","abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_admin","internalType":"address"}]},{"type":"event","name":"ProxyOwnershipTransfer","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":false},{"type":"address","name":"newOwner","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"ProxyPause","inputs":[],"anonymous":false},{"type":"event","name":"ProxyUnpause","inputs":[],"anonymous":false},{"type":"event","name":"ProxyUpgrade","inputs":[{"type":"address","name":"previousImplementation","internalType":"address","indexed":false},{"type":"address","name":"newImplementation","internalType":"address","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pause","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"_newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unpause","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"upgrade","inputs":[{"type":"address","name":"_newImplementation","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x608060405234801561001057600080fd5b5060405161075e38038061075e83398101604081905261002f91610123565b8061007061005e60017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104610153565b60001b61012060201b6100f21760201c565b80546001600160a01b0319166001600160a01b039290921691909117905560006100be61005e60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610153565b80546001600160a01b0319166001600160a01b0392909216919091179055600161010b61005e827f8dea8703c3cf94703383ce38a9c894669dccd4ca8e65ddb43267aa0248711451610153565b805460ff19169115159190911790555061017a565b90565b60006020828403121561013557600080fd5b81516001600160a01b038116811461014c57600080fd5b9392505050565b8181038181111561017457634e487b7160e01b600052601160045260246000fd5b92915050565b6105d5806101896000396000f3fe6080604052600436106100435760003560e01c80630900f0101461005a5780633f4ba83a1461007a5780638456cb591461008f578063f2fde38b146100a457610052565b36610052576100506100c4565b005b6100506100c4565b34801561006657600080fd5b50610050610075366004610528565b610205565b34801561008657600080fd5b506100506102e8565b34801561009b57600080fd5b5061005061038f565b3480156100b057600080fd5b506100506100bf366004610528565b61042e565b6100f56100f260017f8dea8703c3cf94703383ce38a9c894669dccd4ca8e65ddb43267aa0248711451610558565b90565b5460ff161561014b5760405162461bcd60e51b815260206004820152601960248201527f50726f78793a20436f6e7472616374206973207061757365640000000000000060448201526064015b60405180910390fd5b600061017b6100f260017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610558565b546001600160a01b03169050803b6101e15760405162461bcd60e51b815260206004820152602360248201527f50726f78793a20496d706c656d656e746174696f6e20646f65736e27742065786044820152621a5cdd60ea1b6064820152608401610142565b3660008037600080366000845af43d6000803e808015610200573d6000f35b3d6000fd5b6102216100f26001600080516020610580833981519152610558565b546001600160a01b031633036102dd5760006102616100f260017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610558565b80549091506001600160a01b038381169116146102d9578054604080516001600160a01b03928316815291841660208301527f85aeb0b8dd2de94a068da6d2ccd785fea888eee68ec95d9a17c74446a865839d91015b60405180910390a180546001600160a01b0319166001600160a01b0383161781555b5050565b6102e56100c4565b50565b6103046100f26001600080516020610580833981519152610558565b546001600160a01b031633036103855760006103446100f260017f8dea8703c3cf94703383ce38a9c894669dccd4ca8e65ddb43267aa0248711451610558565b805490915060ff16156102e557805460ff191681556040517f5b5349b254d5540f4586f24c7afd4c990fc8a991b611d7f2c00a020a67f2f29290600090a150565b61038d6100c4565b565b6103ab6100f26001600080516020610580833981519152610558565b546001600160a01b031633036103855760006103eb6100f260017f8dea8703c3cf94703383ce38a9c894669dccd4ca8e65ddb43267aa0248711451610558565b805490915060ff166102e557805460ff191660011781556040517fa51641ae9e6ff3082f83f718f043efc36fa8eb06274cd78c3e7251af263ebb6f90600090a150565b61044a6100f26001600080516020610580833981519152610558565b546001600160a01b031633036102dd576001600160a01b0381166104c45760405162461bcd60e51b815260206004820152602b60248201527f50726f78793a2050726576656e74696e6720706f74656e7469616c206163636960448201526a3232b73a30b610313ab93760a91b6064820152608401610142565b60006104e26100f26001600080516020610580833981519152610558565b8054604080516001600160a01b03928316815291851660208301529192507fab1e9974b911ffe4a29b0d786b57a5f5defde2e77960d0e9f954b053e7de325991016102b7565b60006020828403121561053a57600080fd5b81356001600160a01b038116811461055157600080fd5b9392505050565b8181038181111561057957634e487b7160e01b600052601160045260246000fd5b9291505056feb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104a26469706673582212203e86bd6838c8484ceeabdc5e7b1d26dd75eeaeec072039f3970506583365c5a364736f6c634300081100330000000000000000000000006cb975b01e463fc6450c12b2e935119b489944f0

Deployed ByteCode

0x6080604052600436106100435760003560e01c80630900f0101461005a5780633f4ba83a1461007a5780638456cb591461008f578063f2fde38b146100a457610052565b36610052576100506100c4565b005b6100506100c4565b34801561006657600080fd5b50610050610075366004610528565b610205565b34801561008657600080fd5b506100506102e8565b34801561009b57600080fd5b5061005061038f565b3480156100b057600080fd5b506100506100bf366004610528565b61042e565b6100f56100f260017f8dea8703c3cf94703383ce38a9c894669dccd4ca8e65ddb43267aa0248711451610558565b90565b5460ff161561014b5760405162461bcd60e51b815260206004820152601960248201527f50726f78793a20436f6e7472616374206973207061757365640000000000000060448201526064015b60405180910390fd5b600061017b6100f260017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610558565b546001600160a01b03169050803b6101e15760405162461bcd60e51b815260206004820152602360248201527f50726f78793a20496d706c656d656e746174696f6e20646f65736e27742065786044820152621a5cdd60ea1b6064820152608401610142565b3660008037600080366000845af43d6000803e808015610200573d6000f35b3d6000fd5b6102216100f26001600080516020610580833981519152610558565b546001600160a01b031633036102dd5760006102616100f260017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd610558565b80549091506001600160a01b038381169116146102d9578054604080516001600160a01b03928316815291841660208301527f85aeb0b8dd2de94a068da6d2ccd785fea888eee68ec95d9a17c74446a865839d91015b60405180910390a180546001600160a01b0319166001600160a01b0383161781555b5050565b6102e56100c4565b50565b6103046100f26001600080516020610580833981519152610558565b546001600160a01b031633036103855760006103446100f260017f8dea8703c3cf94703383ce38a9c894669dccd4ca8e65ddb43267aa0248711451610558565b805490915060ff16156102e557805460ff191681556040517f5b5349b254d5540f4586f24c7afd4c990fc8a991b611d7f2c00a020a67f2f29290600090a150565b61038d6100c4565b565b6103ab6100f26001600080516020610580833981519152610558565b546001600160a01b031633036103855760006103eb6100f260017f8dea8703c3cf94703383ce38a9c894669dccd4ca8e65ddb43267aa0248711451610558565b805490915060ff166102e557805460ff191660011781556040517fa51641ae9e6ff3082f83f718f043efc36fa8eb06274cd78c3e7251af263ebb6f90600090a150565b61044a6100f26001600080516020610580833981519152610558565b546001600160a01b031633036102dd576001600160a01b0381166104c45760405162461bcd60e51b815260206004820152602b60248201527f50726f78793a2050726576656e74696e6720706f74656e7469616c206163636960448201526a3232b73a30b610313ab93760a91b6064820152608401610142565b60006104e26100f26001600080516020610580833981519152610558565b8054604080516001600160a01b03928316815291851660208301529192507fab1e9974b911ffe4a29b0d786b57a5f5defde2e77960d0e9f954b053e7de325991016102b7565b60006020828403121561053a57600080fd5b81356001600160a01b038116811461055157600080fd5b9392505050565b8181038181111561057957634e487b7160e01b600052601160045260246000fd5b9291505056feb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104a26469706673582212203e86bd6838c8484ceeabdc5e7b1d26dd75eeaeec072039f3970506583365c5a364736f6c63430008110033