FRAX Price: $1.03 (+6.42%)

Contract

0x9E461cF6773F168A991A7aD73E2aD89ecD737745

Overview

FRAX Balance | FXTL Balance

0 FRAX | 3,575 FXTL

FRAX Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Age:30D
Reset Filter

Transaction Hash
Block
From
To

There are no matching entries

> 10 Token Transfers found.

View more zero value Internal Transactions in Advanced View mode

Advanced mode:

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FPISLockerUtils

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at fraxscan.com on 2024-06-16
*/

// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.8.0;


// lib/frax-standard-solidity/lib/forge-std/src/console2.sol

/// @dev The original console.sol uses `int` and `uint` for computing function selectors, but it should
/// use `int256` and `uint256`. This modified version fixes that. This version is recommended
/// over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in
/// forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`.
/// Reference: https://github.com/NomicFoundation/hardhat/issues/2178
library console2 {
    address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

    function _castLogPayloadViewToPure(
        function(bytes memory) internal view fnIn
    ) internal pure returns (function(bytes memory) internal pure fnOut) {
        assembly {
            fnOut := fnIn
        }
    }

    function _sendLogPayload(bytes memory payload) internal pure {
        _castLogPayloadViewToPure(_sendLogPayloadView)(payload);
    }

    function _sendLogPayloadView(bytes memory payload) private view {
        uint256 payloadLength = payload.length;
        address consoleAddress = CONSOLE_ADDRESS;
        /// @solidity memory-safe-assembly
        assembly {
            let payloadStart := add(payload, 32)
            let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
        }
    }

    function log() internal pure {
        _sendLogPayload(abi.encodeWithSignature("log()"));
    }

    function logInt(int256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
    }

    function logUint(uint256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
    }

    function logString(string memory p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function logBool(bool p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function logAddress(address p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function logBytes(bytes memory p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
    }

    function logBytes1(bytes1 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
    }

    function logBytes2(bytes2 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
    }

    function logBytes3(bytes3 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
    }

    function logBytes4(bytes4 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
    }

    function logBytes5(bytes5 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
    }

    function logBytes6(bytes6 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
    }

    function logBytes7(bytes7 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
    }

    function logBytes8(bytes8 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
    }

    function logBytes9(bytes9 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
    }

    function logBytes10(bytes10 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
    }

    function logBytes11(bytes11 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
    }

    function logBytes12(bytes12 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
    }

    function logBytes13(bytes13 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
    }

    function logBytes14(bytes14 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
    }

    function logBytes15(bytes15 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
    }

    function logBytes16(bytes16 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
    }

    function logBytes17(bytes17 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
    }

    function logBytes18(bytes18 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
    }

    function logBytes19(bytes19 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
    }

    function logBytes20(bytes20 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
    }

    function logBytes21(bytes21 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
    }

    function logBytes22(bytes22 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
    }

    function logBytes23(bytes23 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
    }

    function logBytes24(bytes24 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
    }

    function logBytes25(bytes25 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
    }

    function logBytes26(bytes26 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
    }

    function logBytes27(bytes27 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
    }

    function logBytes28(bytes28 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
    }

    function logBytes29(bytes29 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
    }

    function logBytes30(bytes30 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
    }

    function logBytes31(bytes31 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
    }

    function logBytes32(bytes32 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
    }

    function log(uint256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
    }

    function log(int256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
    }

    function log(string memory p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function log(bool p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function log(address p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function log(uint256 p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
    }

    function log(uint256 p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
    }

    function log(uint256 p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
    }

    function log(uint256 p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
    }

    function log(string memory p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
    }

    function log(string memory p0, int256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,int256)", p0, p1));
    }

    function log(string memory p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
    }

    function log(string memory p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
    }

    function log(string memory p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
    }

    function log(bool p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
    }

    function log(bool p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
    }

    function log(bool p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
    }

    function log(bool p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
    }

    function log(address p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
    }

    function log(address p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
    }

    function log(address p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
    }

    function log(address p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
    }

    function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
    }

    function log(string memory p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
    }

    function log(string memory p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
    }

    function log(string memory p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
    }

    function log(string memory p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
    }

    function log(bool p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
    }

    function log(bool p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
    }

    function log(bool p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
    }

    function log(bool p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
    }

    function log(bool p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
    }

    function log(bool p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
    }

    function log(bool p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
    }

    function log(bool p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
    }

    function log(address p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
    }

    function log(address p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
    }

    function log(address p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
    }

    function log(address p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
    }

    function log(address p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
    }

    function log(address p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
    }

    function log(address p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
    }

    function log(address p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
    }

    function log(address p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
    }

    function log(address p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
    }

    function log(address p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
    }

    function log(address p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
    }

}

// node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// src/contracts/VestedFXS-and-Flox/FPISLocker/IlFPISStructs.sol

// @version 0.2.8

/**
 * ====================================================================
 * |     ______                   _______                             |
 * |    / _____________ __  __   / ____(_____  ____ _____  ________   |
 * |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
 * |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
 * | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
 * |                                                                  |
 * ====================================================================
 * ======================== lFPISStructs ==============================
 * ====================================================================
 * Structs of lFPIS contracts (lFPIS)
 * Frax Finance: https://github.com/FraxFinance
 */
interface IlFPISStructs {
    /// @notice Detailed lock info for a user
    /// @param user Address of the user
    /// @param allLocks All of the locks of the user
    /// @param numberOfLocks The total number of locks that the user has
    /// @param activeLocks Only the active locks of the user
    /// @param expiredLocks Only the expired locks of the user
    /// @param totalFpis The total amount of FPIS that the user has for all, active, and expired locks respectively
    struct DetailedUserLockInfo {
        address user;
        uint256 numberOfLocks;
        LockedBalanceExtended[] allLocks;
        LockedBalanceExtended[] activeLocks;
        LockedBalanceExtended[] expiredLocks;
        int128[3] totalFpis;
    }

    /// @notice Basic information about a lock
    /// @param amount The amount that is locked
    /// @param end The ending timestamp for the lock
    /// @dev We cannot really do block numbers per se b/c slope is per time, not per block and per block could be fairly bad b/c Ethereum changes blocktimes. What we can do is to extrapolate ***At functions
    struct LockedBalance {
        int128 amount;
        uint128 end; // This should more than suffice for our needs and allows the struct to be packed
    }

    /// @notice Extended information about a lock
    /// @param id The ID of the lock
    /// @param index The index of the lock. If index is 0, do not trust it unless isInUse is also true
    /// @param amount The amount that is locked
    /// @param end The ending timestamp for the lock
    struct LockedBalanceExtended {
        uint256 id;
        uint128 index;
        int128 amount;
        uint128 end;
    }

    /// @notice Lock ID Info. Cannot be a simple mapping because lock indeces are in constant flux and index 0 vs null is ambiguous.
    /// @param id The ID of the lock
    /// @param index The index of the lock. If index is 0, do not trust it unless isInUse is also true
    /// @param isInUse If the lock ID is currently in use
    struct LockIdIdxInfo {
        uint256 id;
        uint128 index;
        bool isInUse;
    }

    /// @notice Point in a user's lock
    /// @param bias The bias of the point
    /// @param slope The slope of the point
    /// @param ts The timestamp of the point
    /// @param blk The block of the point
    /// @param fpisAmt The amount of FPIS at the point
    struct Point {
        int128 bias;
        int128 slope; // - dweight / dt
        uint256 ts;
        uint256 blk; // block
        uint256 fpisAmt;
    }

    /// @notice Longest lock info for a user
    /// @param lock The longest lock of the user
    /// @param lockIndex The index of the longest lock
    /// @param user The address of the user
    struct LongestLock {
        LockedBalance lock;
        uint128 lockIndex;
        address user;
    }
}

// node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// src/contracts/VestedFXS-and-Flox/interfaces/IFPISLocker.sol

// @version 0.2.8

/**
 * ====================================================================
 * |     ______                   _______                             |
 * |    / _____________ __  __   / ____(_____  ____ _____  ________   |
 * |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
 * |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
 * | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
 * |                                                                  |
 * ====================================================================
 * ============================ IFPISLocker ============================
 * ====================================================================
 * Frax Finance: https://github.com/FraxFinance
 */

interface IFPISLocker is IlFPISStructs {
    function MAXTIME_INT128() external view returns (int128);

    function MAXTIME_UINT256() external view returns (uint256);

    function MAX_CONTRIBUTOR_LOCKS() external view returns (uint8);

    function MAX_USER_LOCKS() external view returns (uint8);

    function MULTIPLIER_UINT256() external view returns (uint256);

    function VOTE_WEIGHT_MULTIPLIER_INT128() external view returns (int128);

    function VOTE_WEIGHT_MULTIPLIER_UINT256() external view returns (uint256);

    function VOTE_END_POWER_BASIS_POINTS_INT128() external view returns (int128);

    function VOTE_END_POWER_BASIS_POINTS_UINT256() external view returns (uint256);

    function MAX_BASIS_POINTS_INT128() external view returns (int128);

    function MAX_BASIS_POINTS_UINT256() external view returns (uint256);

    function FXS_CONVERSION_START_TIMESTAMP() external view returns (uint256);

    function WEEK_UINT128() external view returns (uint128);

    function WEEK_UINT256() external view returns (uint256);

    function acceptTransferOwnership() external;

    function admin() external view returns (address);

    function balanceOf(address _addr) external view returns (uint256 _balance);

    function balanceOfAllLocksAtBlock(address _addr, uint256 _block) external view returns (uint256 _balance);

    function balanceOfAllLocksAtTime(address _addr, uint256 _timestamp) external view returns (uint256 _balance);

    function balanceOfAt(address _addr, uint256 _block) external view returns (uint256 _balance);

    function balanceOfOneLockAtBlock(
        address _addr,
        uint128 _lockIndex,
        uint256 _block
    ) external view returns (uint256 _balance);

    function balanceOfOneLockAtTime(
        address _addr,
        uint128 _lockIndex,
        uint256 _timestamp
    ) external view returns (uint256 _balance);

    function checkpoint() external;

    function commitTransferOwnership(address _addr) external;

    function createLock(address _addr, uint256 _value, uint128 _unlockTime) external returns (uint128);

    function decimals() external view returns (uint256);

    function depositFor(address _addr, uint256 _value, uint128 _lockIndex) external;

    function emergencyUnlockActive() external view returns (bool);

    function epoch() external view returns (uint256);

    function findBlockEpoch(uint256 _block, uint256 _maxEpoch) external view returns (uint256);

    function floxContributors(address) external view returns (bool);

    function futureAdmin() external view returns (address);

    function getLastUserSlope(address _addr, uint128 _lockIndex) external view returns (int128);

    function increaseAmount(uint256 _value, uint128 _lockIndex) external;

    function increaseUnlockTime(uint128 _unlockTime, uint128 _lockIndex) external;

    function indicesToIds(address, uint128) external view returns (uint256);

    function isPaused() external view returns (bool);

    function locked(address, uint256) external view returns (int128 amount, uint128 end);

    function lockedById(address _addr, uint256 _id) external view returns (LockedBalance memory _lockInfo);

    function lockedByIndex(address _addr, uint128 _index) external view returns (LockedBalance memory _lockInfo);

    function lockedEnd(address _addr, uint128 _index) external view returns (uint256);

    function name() external view returns (string memory);

    function nextId(address) external view returns (uint256);

    function numLocks(address) external view returns (uint128);

    function pointHistory(
        uint256
    ) external view returns (int128 bias, int128 slope, uint256 ts, uint256 blk, uint256 fpisAmt);

    function recoverIERC20(address _tokenAddr, uint256 _amount) external;

    function setFloxContributor(address _floxContributor, bool _isFloxContributor) external;

    function setLVPIDUtils(address _lFpisUtilsAddr) external;

    function slopeChanges(uint256) external view returns (int128);

    function supply() external view returns (uint256);

    function supplyAt(Point memory _point, uint256 _t) external view returns (uint256);

    function symbol() external view returns (string memory);

    function toggleContractPause() external;

    function activateEmergencyUnlock() external;

    function fpis() external view returns (address);

    function totalFPISSupply() external view returns (uint256);

    function totalFPISSupplyAt(uint256 _block) external view returns (uint256);

    function totalSupply() external view returns (uint256);

    function totalSupply(uint256 _timestamp) external view returns (uint256);

    function totalSupplyAt(uint256 _block) external view returns (uint256);

    function userPointEpoch(address, uint256) external view returns (uint256);

    function userPointHistory(
        address,
        uint256,
        uint256
    ) external view returns (int128 bias, int128 slope, uint256 ts, uint256 blk, uint256 fpisAmt);

    function userPointHistoryTs(address _addr, uint128 _lockIndex, uint256 _idx) external view returns (uint256);

    function lFpisUtils() external view returns (address);

    function version() external view returns (string memory);

    function withdraw(uint128 _lockIndex) external;
}

// src/contracts/VestedFXS-and-Flox/FPISLocker/FPISLockerUtils.sol

// @version 0.2.8

/**
 * ====================================================================
 * |     ______                   _______                             |
 * |    / _____________ __  __   / ____(_____  ____ _____  ________   |
 * |   / /_  / ___/ __ `| |/_/  / /_  / / __ \/ __ `/ __ \/ ___/ _ \  |
 * |  / __/ / /  / /_/ _>  <   / __/ / / / / / /_/ / / / / /__/  __/  |
 * | /_/   /_/   \__,_/_/|_|  /_/   /_/_/ /_/\__,_/_/ /_/\___/\___/   |
 * |                                                                  |
 * ====================================================================
 * ========================= FPISLockerUtils ==========================
 * ====================================================================
 * Helper and utility functions for VestedFXS
 * Frax Finance: https://github.com/FraxFinance
 */

/**
 *
 * Voting escrow to have time-weighted votes
 * Votes have a weight depending on time, so that users are committed
 * to the future of (whatever they are voting for).
 * The weight in this implementation is linear, and lock cannot be more than maxtime:
 * w ^
 * 1 +        /
 *   |      /
 *   |    /
 *   |  /
 *   |/
 * 0 +--------+------> time
 *       maxtime (4 years?)
 */

/**
 * @title FPISLockerUtils
 * @author Frax Finance
 * @notice This utility smart contract provides functions to get extended information from the FPISLocker contract.
 */
contract FPISLockerUtils is IlFPISStructs {
    IFPISLocker public immutable lFPIS;
    IERC20Metadata public immutable fpis;

    uint256 public constant VOTE_END_POWER_BASIS_POINTS_UINT256 = 3330;
    uint256 public constant MAX_BASIS_POINTS_UINT256 = 10_000;

    /**
     * @notice Contract constructor
     * @param _FPISLocker Address of the FPISLocker contract
     */
    constructor(address _FPISLocker) {
        lFPIS = IFPISLocker(_FPISLocker);
        fpis = IERC20Metadata(lFPIS.fpis());
    }

    /**
     * @notice Used to get all of the locks of a given user.
     * @dev The locks are retrieved indiscriminately, regardless of whether they are active or expired.
     * @param _user Address of the user
     * @return _userLockInfo DetailedUserLockInfo for the user. Includes _allLocks, _activeLocks, _expiredLocks, and FXS totals for these respectively
     * @dev This lives on Fraxtal and will mostly be read-called in UIs, so gas not really an issue here
     */
    function getDetailedUserLockInfo(address _user) public view returns (DetailedUserLockInfo memory _userLockInfo) {
        // Get the total number of locks
        uint256 _totalLocks = lFPIS.numLocks(_user);
        uint128 _numberOfActiveLocks;

        // Set the number locks for the user
        _userLockInfo.numberOfLocks = _totalLocks;

        // Set the user
        _userLockInfo.user = _user;

        // Initialize _allLocks
        _userLockInfo.allLocks = new LockedBalanceExtended[](_totalLocks);

        // Initial _isActive, which tracks if a given index is active
        bool[] memory _isActive = new bool[](_totalLocks);

        // Loop through all of the locks
        for (uint256 i; i < _userLockInfo.allLocks.length; ) {
            // Update the _allLocks return data
            LockedBalance memory _thisLock = lFPIS.lockedByIndex(_user, uint128(i));
            _userLockInfo.allLocks[i].id = lFPIS.indicesToIds(_user, uint128(i));
            _userLockInfo.allLocks[i].index = uint128(i);
            _userLockInfo.allLocks[i].amount = _thisLock.amount;
            _userLockInfo.allLocks[i].end = _thisLock.end;
            _userLockInfo.totalFpis[0] += _thisLock.amount;

            // Determine whether it is active or expired
            if (_thisLock.end > block.timestamp) {
                // Update isActive tracking
                _isActive[i] = true;

                // Update _totalFxs for active locks
                _userLockInfo.totalFpis[1] += _thisLock.amount;

                unchecked {
                    ++_numberOfActiveLocks;
                }
            } else {
                // Update _totalFxs for expired locks
                _userLockInfo.totalFpis[2] += _thisLock.amount;
            }
            unchecked {
                ++i;
            }
        }

        // Initialize _activeLocks and _expiredLocks
        _userLockInfo.activeLocks = new LockedBalanceExtended[](_numberOfActiveLocks);
        _userLockInfo.expiredLocks = new LockedBalanceExtended[](_totalLocks - _numberOfActiveLocks);

        // Loop through all of the locks again, this time for assigning to _activeLocks and _expiredLocks
        uint128 _activeCounter;
        uint128 _expiredCounter;
        for (uint256 i; i < _userLockInfo.allLocks.length; ) {
            // Get the lock info
            LockedBalanceExtended memory _thisLock = _userLockInfo.allLocks[i];

            // Sort the lock as either active or expired
            if (_isActive[i]) {
                // Active
                _userLockInfo.activeLocks[_activeCounter] = _thisLock;

                unchecked {
                    ++_activeCounter;
                }
            } else {
                // Expired
                _userLockInfo.expiredLocks[_expiredCounter] = _thisLock;

                unchecked {
                    ++_expiredCounter;
                }
            }

            unchecked {
                ++i;
            }
        }
    }

    /**
     * @notice Used to get all of the locks of the given users. Same underlying code as getDetailedUserLockInfo
     * @dev The locks are retrieved indiscriminately, regardless of whether they are active or expired.
     * @param _users Addresses of the users
     * @return _userLockInfos DetailedUserLockInfo[] for the users. Includes _allLocks, _activeLocks, _expiredLocks, and FXS totals for these respectively
     * @dev This lives on Fraxtal and will mostly be read-called in UIs, so gas not really an issue here
     */
    function getDetailedUserLockInfoBulk(
        address[] memory _users
    ) public view returns (DetailedUserLockInfo[] memory _userLockInfos) {
        // Save the number of user addresses
        uint256 _numUsers = _users.length;

        // Initialize the return array
        _userLockInfos = new DetailedUserLockInfo[](_numUsers);

        // Loop through all of the users and get their detailed lock info
        for (uint256 i = 0; i < _numUsers; ) {
            _userLockInfos[i] = getDetailedUserLockInfo(_users[i]);

            unchecked {
                i++;
            }
        }
    }

    /**
     * @notice Used to get the longest lock of a given user.
     * @dev The longest lock is the lock with the timestamp furthest in the future (can also be in the past if there are no active locks).
     * @param user Address of the user
     * @return The longest lock of the user
     * @return The index of the longest lock
     */
    function getLongestLock(address user) public view returns (LockedBalance memory, uint128) {
        LockedBalance[] memory locks = new LockedBalance[](lFPIS.numLocks(user));
        LockedBalance memory longestLock;
        uint128 longestLockIndex;

        for (uint256 i = 0; i < locks.length; ) {
            uint128 currentEnd = lFPIS.lockedByIndex(user, uint128(i)).end;
            if (currentEnd > longestLock.end) {
                longestLock.end = currentEnd;
                longestLock.amount = lFPIS.lockedByIndex(user, uint128(i)).amount;
                longestLockIndex = uint128(i);
            }

            unchecked {
                i++;
            }
        }

        return (longestLock, longestLockIndex);
    }

    /**
     * @notice Used to get longest locks of muliple users.
     * @dev This returns the longest lock indiscriminately, regardless of whether it is active or expired.
     * @dev The return value is an array of LongestLock structs, which contain the lock, the index of the lock, and the user.
     * @param users Array of addresses of the users
     * @return The LongestLocks of the users
     */
    function getLongestLockBulk(address[] memory users) public view returns (LongestLock[] memory) {
        LongestLock[] memory longestLocks = new LongestLock[](users.length);
        LockedBalance memory longestLock;
        uint128 longestLockIndex;

        for (uint256 i = 0; i < users.length; ) {
            for (uint256 j; j < lFPIS.numLocks(users[i]); ) {
                uint128 currentEnd = lFPIS.lockedByIndex(users[i], uint128(j)).end;
                if (currentEnd > longestLock.end) {
                    longestLock.end = currentEnd;
                    longestLock.amount = lFPIS.lockedByIndex(users[i], uint128(j)).amount;
                    longestLockIndex = uint128(j);
                }

                unchecked {
                    ++j;
                }
            }

            longestLocks[i] = LongestLock({ lock: longestLock, lockIndex: longestLockIndex, user: users[i] });

            delete longestLock;
            delete longestLockIndex;

            unchecked {
                ++i;
            }
        }

        return longestLocks;
    }

    /**
     * @notice Calculate the APPROXIMATE amount of lFPIS, given an FPIS amount and a lock length. Cruder version of balanceOf math. Useful for sanity checks.
     * @param _fpisAmount The amount of FPIS
     * @param _lockSecsU128 The length of the lock
     * @return _expectedLFPIS The expected amount of lFPIS. May be slightly off from actual (~1%)
     * @dev Useful to compare to the slope/bias-based balancedOf to make sure the math is working
     */
    function getCrudeExpectedLFPISOneLock(
        int128 _fpisAmount,
        uint128 _lockSecsU128
    ) public view returns (uint256 _expectedLFPIS) {
        // lFPIS = FPIS in emergency unlock situation
        if (lFPIS.emergencyUnlockActive()) {
            return (uint256(int256(_fpisAmount)) * VOTE_END_POWER_BASIS_POINTS_UINT256) / MAX_BASIS_POINTS_UINT256;
        }

        // Truncate _timeLeft down to the nearest week
        int128 _lockSecsI128 = int128((_lockSecsU128 / lFPIS.WEEK_UINT128()) * lFPIS.WEEK_UINT128());

        // Calculate the expected lFPIS
        _expectedLFPIS = uint256(
            uint128(
                ((_fpisAmount * lFPIS.VOTE_END_POWER_BASIS_POINTS_INT128()) / lFPIS.MAX_BASIS_POINTS_INT128()) +
                    ((_fpisAmount * _lockSecsI128 * lFPIS.VOTE_WEIGHT_MULTIPLIER_INT128()) /
                        lFPIS.MAXTIME_INT128() /
                        lFPIS.MAX_BASIS_POINTS_INT128())
            )
        );
    }

    /**
     * @notice Calculate the APPROXIMATE amount of lFPIS, given FPIS amounts and lock lengths. Cruder version of balanceOf math. Useful for sanity checks.
     * @param _fpisAmounts The amounts of FPIS
     * @param _lockSecsU128 The length of the locks
     * @return _expectedLFPIS The expected amount of lFPIS (summed). May be slightly off from actual (~1%)
     * @dev Useful to compare to the slope/bias-based balancedOf to make sure the math is working
     */
    function getCrudeExpectedLFPISMultiLock(
        int128[] memory _fpisAmounts,
        uint128[] memory _lockSecsU128
    ) public view returns (uint256 _expectedLFPIS) {
        // See if you are in an emergency unlock situation
        bool _isEmergencyUnlockActive = lFPIS.emergencyUnlockActive();

        // Loop through the locks
        for (uint128 i = 0; i < _fpisAmounts.length; ++i) {
            // lFPIS = FPIS in emergency unlock situation
            if (_isEmergencyUnlockActive) {
                _expectedLFPIS +=
                    (uint256(int256(_fpisAmounts[i])) * VOTE_END_POWER_BASIS_POINTS_UINT256) /
                    MAX_BASIS_POINTS_UINT256;
            } else {
                _expectedLFPIS += getCrudeExpectedLFPISOneLock(_fpisAmounts[i], _lockSecsU128[i]);
            }
        }
    }

    /**
     * @notice Calculate the APPROXIMATE amount of lFPIS a specific user should have. Cruder version of balanceOf math. Useful for sanity checks.
     * @param _user The address of the user
     * @return _expectedLFPIS The expected amount of lFPIS (summed). May be slightly off from actual (~1%)
     * @dev Useful to compare to the slope/bias-based balancedOf to make sure the math is working
     */
    function getCrudeExpectedLFPISUser(address _user) public view returns (uint256 _expectedLFPIS) {
        // Get all of the user's locks
        DetailedUserLockInfo memory _userLockInfo = getDetailedUserLockInfo(_user);

        // See if you are in an emergency unlock situation
        bool _isEmergencyUnlockActive = lFPIS.emergencyUnlockActive();

        // Loop through all of the user's locks
        for (uint128 i = 0; i < _userLockInfo.numberOfLocks; ) {
            // Get the lock info
            LockedBalanceExtended memory _lockInfo = _userLockInfo.allLocks[i];

            // For the emergency unlock situation, lFPIS = FPIS
            if (_isEmergencyUnlockActive) {
                _expectedLFPIS +=
                    (uint256(int256(_lockInfo.amount)) * VOTE_END_POWER_BASIS_POINTS_UINT256) /
                    MAX_BASIS_POINTS_UINT256;
            } else {
                // Get the lock time to use
                uint128 _lockSecsToUse;
                if (_lockInfo.end < uint128(block.timestamp)) {
                    _lockSecsToUse = 0;
                } else {
                    _lockSecsToUse = _lockInfo.end - uint128(block.timestamp);
                }

                // Get the approximate lFPIS
                _expectedLFPIS += getCrudeExpectedLFPISOneLock(_lockInfo.amount, _lockSecsToUse);
            }

            unchecked {
                ++i;
            }
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_FPISLocker","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MAX_BASIS_POINTS_UINT256","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTE_END_POWER_BASIS_POINTS_UINT256","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fpis","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int128[]","name":"_fpisAmounts","type":"int128[]"},{"internalType":"uint128[]","name":"_lockSecsU128","type":"uint128[]"}],"name":"getCrudeExpectedLFPISMultiLock","outputs":[{"internalType":"uint256","name":"_expectedLFPIS","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int128","name":"_fpisAmount","type":"int128"},{"internalType":"uint128","name":"_lockSecsU128","type":"uint128"}],"name":"getCrudeExpectedLFPISOneLock","outputs":[{"internalType":"uint256","name":"_expectedLFPIS","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getCrudeExpectedLFPISUser","outputs":[{"internalType":"uint256","name":"_expectedLFPIS","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getDetailedUserLockInfo","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"numberOfLocks","type":"uint256"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint128","name":"index","type":"uint128"},{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint128","name":"end","type":"uint128"}],"internalType":"struct IlFPISStructs.LockedBalanceExtended[]","name":"allLocks","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint128","name":"index","type":"uint128"},{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint128","name":"end","type":"uint128"}],"internalType":"struct IlFPISStructs.LockedBalanceExtended[]","name":"activeLocks","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint128","name":"index","type":"uint128"},{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint128","name":"end","type":"uint128"}],"internalType":"struct IlFPISStructs.LockedBalanceExtended[]","name":"expiredLocks","type":"tuple[]"},{"internalType":"int128[3]","name":"totalFpis","type":"int128[3]"}],"internalType":"struct IlFPISStructs.DetailedUserLockInfo","name":"_userLockInfo","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"getDetailedUserLockInfoBulk","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"numberOfLocks","type":"uint256"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint128","name":"index","type":"uint128"},{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint128","name":"end","type":"uint128"}],"internalType":"struct IlFPISStructs.LockedBalanceExtended[]","name":"allLocks","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint128","name":"index","type":"uint128"},{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint128","name":"end","type":"uint128"}],"internalType":"struct IlFPISStructs.LockedBalanceExtended[]","name":"activeLocks","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint128","name":"index","type":"uint128"},{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint128","name":"end","type":"uint128"}],"internalType":"struct IlFPISStructs.LockedBalanceExtended[]","name":"expiredLocks","type":"tuple[]"},{"internalType":"int128[3]","name":"totalFpis","type":"int128[3]"}],"internalType":"struct IlFPISStructs.DetailedUserLockInfo[]","name":"_userLockInfos","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getLongestLock","outputs":[{"components":[{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint128","name":"end","type":"uint128"}],"internalType":"struct IlFPISStructs.LockedBalance","name":"","type":"tuple"},{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"getLongestLockBulk","outputs":[{"components":[{"components":[{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint128","name":"end","type":"uint128"}],"internalType":"struct IlFPISStructs.LockedBalance","name":"lock","type":"tuple"},{"internalType":"uint128","name":"lockIndex","type":"uint128"},{"internalType":"address","name":"user","type":"address"}],"internalType":"struct IlFPISStructs.LongestLock[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lFPIS","outputs":[{"internalType":"contract IFPISLocker","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60c060405234801561000f575f80fd5b50604051611fab380380611fab83398101604081905261002e916100ac565b6001600160a01b038116608081905260408051631753296560e21b81529051635d4ca594916004808201926020929091908290030181865afa158015610076573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061009a91906100ac565b6001600160a01b031660a052506100d9565b5f602082840312156100bc575f80fd5b81516001600160a01b03811681146100d2575f80fd5b9392505050565b60805160a051611e2c61017f5f395f61013101525f8181610179015281816102240152818161038701528181610431015281816104b101528181610547015281816105c701528181610647015281816106ef0152818161076f015281816108f801528181610a5d01528181610aec01528181610ebf01528181610fcd0152818161108c0152818161112601528181611322015281816113e601526114c80152611e2c5ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c80635d4ca5941161006e5780635d4ca5941461012c578063bbf79dc11461016b578063d47ada6614610174578063f37461ab1461019b578063f78fcccc146101e1578063fb908ddd146101f4575f80fd5b806302dc3a33146100aa57806303802473146100d05780630e5f6d5d146100d957806329d71cb6146100ec5780633c5933121461010c575b5f80fd5b6100bd6100b8366004611689565b610214565b6040519081526020015b60405180910390f35b6100bd610d0281565b6100bd6100e73660046116ce565b610384565b6100ff6100fa36600461176b565b61081e565b6040516100c7919061191c565b61011f61011a366004611689565b6108cf565b6040516100c7919061197f565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100c7565b6100bd61271081565b6101537f000000000000000000000000000000000000000000000000000000000000000081565b6101ae6101a9366004611689565b610e89565b604080518351600f0b81526020938401516001600160801b039081169482019490945292909116908201526060016100c7565b6100bd6101ef3660046119ff565b611122565b61020761020236600461176b565b611284565b6040516100c79190611ac2565b5f8061021f836108cf565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f89464856040518163ffffffff1660e01b8152600401602060405180830381865afa15801561027e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102a29190611b4e565b90505f5b8260200151816001600160801b0316101561037c575f8360400151826001600160801b0316815181106102db576102db611b6d565b60200260200101519050821561031e57612710610d028260400151600f0b6103039190611b95565b61030d9190611bc0565b6103179086611bd3565b9450610373565b5f426001600160801b031682606001516001600160801b0316101561034457505f610357565b4282606001516103549190611be6565b90505b610365826040015182610384565b61036f9087611bd3565b9550505b506001016102a6565b505050919050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f89464856040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104059190611b4e565b1561042e5761271061041d610d02600f86900b611b95565b6104279190611bc0565b9050610818565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637c10d93a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561048b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104af9190611c05565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637c10d93a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561050b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052f9190611c05565b6105399085611c20565b6105439190611c4d565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632de4fceb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c59190611c76565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637aa9b5566040518163ffffffff1660e01b8152600401602060405180830381865afa158015610621573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106459190611c76565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fc26cf346040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c59190611c76565b6106cf8488611c91565b6106d99190611c91565b6106e39190611cb0565b6106ed9190611cb0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632de4fceb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610749573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061076d9190611c76565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ced3c9e46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ed9190611c76565b6107f79087611c91565b6108019190611cb0565b61080b9190611cec565b6001600160801b03169150505b92915050565b8051606090806001600160401b0381111561083b5761083b611705565b60405190808252806020026020018201604052801561087457816020015b61086161160e565b8152602001906001900390816108595790505b5091505f5b818110156108c8576108a384828151811061089657610896611b6d565b60200260200101516108cf565b8382815181106108b5576108b5611b6d565b6020908102919091010152600101610879565b5050919050565b6108d761160e565b604051630b9ef08360e41b81526001600160a01b0383811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063b9ef083090602401602060405180830381865afa15801561093f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109639190611c05565b6001600160801b0316602083018190526001600160a01b038416835290505f816001600160401b0381111561099a5761099a611705565b6040519080825280602002602001820160405280156109ea57816020015b604080516080810182525f8082526020808301829052928201819052606082015282525f199092019101816109b85790505b5060408401525f826001600160401b03811115610a0957610a09611705565b604051908082528060200260200182016040528015610a32578160200160208202803683370190505b5090505f5b846040015151811015610cc4576040516321c984e960e01b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906321c984e990610a94908a908690600401611d22565b6040805180830381865afa158015610aae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad29190611d44565b604051635f96d4e760e01b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635f96d4e790610b23908a908690600401611d22565b602060405180830381865afa158015610b3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b629190611da2565b86604001518381518110610b7857610b78611b6d565b60200260200101515f0181815250508186604001518381518110610b9e57610b9e611b6d565b6020908102919091018101516001600160801b0390921691015280516040870151805184908110610bd157610bd1611b6d565b602002602001015160400190600f0b9081600f0b81525050806020015186604001518381518110610c0457610c04611b6d565b60209081029190910101516001600160801b0391909116606090910152805160a08701518051610c35908390611cec565b600f0b9052506020810151426001600160801b039091161115610c9d576001838381518110610c6657610c66611b6d565b911515602092830291909101820152815160a08801519091018051610c8c908390611cec565b600f0b905250600190930192610cbb565b805160a08701516040018051610cb4908390611cec565b600f0b9052505b50600101610a37565b50816001600160801b03166001600160401b03811115610ce657610ce6611705565b604051908082528060200260200182016040528015610d3657816020015b604080516080810182525f8082526020808301829052928201819052606082015282525f19909201910181610d045790505b506060850152610d4f6001600160801b03831684611db9565b6001600160401b03811115610d6657610d66611705565b604051908082528060200260200182016040528015610db657816020015b604080516080810182525f8082526020808301829052928201819052606082015282525f19909201910181610d845790505b5060808501525f80805b866040015151811015610e7e575f87604001518281518110610de457610de4611b6d565b60200260200101519050848281518110610e0057610e00611b6d565b602002602001015115610e4357808860600151856001600160801b031681518110610e2d57610e2d611b6d565b6020026020010181905250836001019350610e75565b808860800151846001600160801b031681518110610e6357610e63611b6d565b60200260200101819052508260010192505b50600101610dc0565b505050505050919050565b604080518082019091525f8082526020820152604051630b9ef08360e41b81526001600160a01b0383811660048301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063b9ef083090602401602060405180830381865afa158015610f04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f289190611c05565b6001600160801b03166001600160401b03811115610f4857610f48611705565b604051908082528060200260200182016040528015610f8c57816020015b604080518082019091525f8082526020820152815260200190600190039081610f665790505b509050610fa8604080518082019091525f808252602082015290565b5f805b8351811015611116576040516321c984e960e01b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906321c984e990611004908b908690600401611d22565b6040805180830381865afa15801561101e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110429190611d44565b60200151905083602001516001600160801b0316816001600160801b0316111561110d576001600160801b03811660208501526040516321c984e960e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906321c984e9906110c3908b908690600401611d22565b6040805180830381865afa1580156110dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111019190611d44565b51600f0b845290915081905b50600101610fab565b50909590945092505050565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f89464856040518163ffffffff1660e01b8152600401602060405180830381865afa158015611180573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a49190611b4e565b90505f5b8451816001600160801b0316101561127c57811561121157612710610d0286836001600160801b0316815181106111e1576111e1611b6d565b6020026020010151600f0b6111f69190611b95565b6112009190611bc0565b61120a9084611bd3565b925061126c565b61125f85826001600160801b03168151811061122f5761122f611b6d565b602002602001015185836001600160801b03168151811061125257611252611b6d565b6020026020010151610384565b6112699084611bd3565b92505b61127581611dcc565b90506111a8565b505092915050565b60605f82516001600160401b038111156112a0576112a0611705565b6040519080825280602002602001820160405280156112f657816020015b6040805160a0810182525f6060820181815260808301829052825260208083018290529282015282525f199092019101816112be5790505b509050611312604080518082019091525f808252602082015290565b5f805b8551811015611604575f5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b9ef083088848151811061136157611361611b6d565b60200260200101516040518263ffffffff1660e01b815260040161139491906001600160a01b0391909116815260200190565b602060405180830381865afa1580156113af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d39190611c05565b6001600160801b031681101561157a575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166321c984e989858151811061142557611425611b6d565b6020026020010151846040518363ffffffff1660e01b815260040161144b929190611d22565b6040805180830381865afa158015611465573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114899190611d44565b60200151905084602001516001600160801b0316816001600160801b03161115611571576001600160801b038116602086015287516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906321c984e9908a908690811061150157611501611b6d565b6020026020010151846040518363ffffffff1660e01b8152600401611527929190611d22565b6040805180830381865afa158015611541573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115659190611d44565b51600f0b855290925082905b50600101611320565b506040518060600160405280848152602001836001600160801b031681526020018783815181106115ad576115ad611b6d565b60200260200101516001600160a01b03168152508482815181106115d3576115d3611b6d565b60200260200101819052506115f7604080518082019091525f808252602082015290565b92505f9150600101611315565b5091949350505050565b6040518060c001604052805f6001600160a01b031681526020015f815260200160608152602001606081526020016060815260200161164b611650565b905290565b60405180606001604052806003906020820280368337509192915050565b80356001600160a01b0381168114611684575f80fd5b919050565b5f60208284031215611699575f80fd5b6116a28261166e565b9392505050565b80600f0b81146116b7575f80fd5b50565b6001600160801b03811681146116b7575f80fd5b5f80604083850312156116df575f80fd5b82356116ea816116a9565b915060208301356116fa816116ba565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561174157611741611705565b604052919050565b5f6001600160401b0382111561176157611761611705565b5060051b60200190565b5f6020828403121561177b575f80fd5b81356001600160401b03811115611790575f80fd5b8201601f810184136117a0575f80fd5b80356117b36117ae82611749565b611719565b8082825260208201915060208360051b8501019250868311156117d4575f80fd5b6020840193505b828410156117fd576117ec8461166e565b8252602093840193909101906117db565b9695505050505050565b5f8151808452602084019350602083015f5b82811015611872578151805187526001600160801b0360208201511660208801526040810151600f0b60408801526001600160801b03606082015116606088015250608086019550602082019150600181019050611819565b5093949350505050565b60018060a01b038151168252602081015160208301525f604082015161010060408501526118ae610100850182611807565b9050606083015184820360608601526118c78282611807565b915050608083015184820360808601526118e18282611807565b91505060a083015160a085015f5b6003811015611911578251600f0b8252602092830192909101906001016118ef565b509195945050505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561197357603f1987860301845261195e85835161187c565b94506020938401939190910190600101611942565b50929695505050505050565b602081525f6116a2602083018461187c565b5f82601f8301126119a0575f80fd5b81356119ae6117ae82611749565b8082825260208201915060208360051b8601019250858311156119cf575f80fd5b602085015b838110156119f55780356119e7816116ba565b8352602092830192016119d4565b5095945050505050565b5f8060408385031215611a10575f80fd5b82356001600160401b03811115611a25575f80fd5b8301601f81018513611a35575f80fd5b8035611a436117ae82611749565b8082825260208201915060208360051b850101925087831115611a64575f80fd5b6020840193505b82841015611a8f578335611a7e816116a9565b825260209384019390910190611a6b565b945050505060208301356001600160401b03811115611aac575f80fd5b611ab885828601611991565b9150509250929050565b602080825282518282018190525f918401906040840190835b81811015611b43578351611b068482518051600f0b82526020908101516001600160801b0316910152565b6020818101516001600160801b0316604086810191909152909101516001600160a01b031660608501529390930192608090920191600101611adb565b509095945050505050565b5f60208284031215611b5e575f80fd5b815180151581146116a2575f80fd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761081857610818611b81565b634e487b7160e01b5f52601260045260245ffd5b5f82611bce57611bce611bac565b500490565b8082018082111561081857610818611b81565b6001600160801b03828116828216039081111561081857610818611b81565b5f60208284031215611c15575f80fd5b81516116a2816116ba565b5f6001600160801b03831680611c3857611c38611bac565b806001600160801b0384160491505092915050565b6001600160801b038181168382160290811690818114611c6f57611c6f611b81565b5092915050565b5f60208284031215611c86575f80fd5b81516116a2816116a9565b5f82600f0b82600f0b0280600f0b9150808214611c6f57611c6f611b81565b5f81600f0b83600f0b80611cc657611cc6611bac565b60016001607f1b031982145f1982141615611ce357611ce3611b81565b90059392505050565b600f81810b9083900b016f7fffffffffffffffffffffffffffffff811360016001607f1b03198212171561081857610818611b81565b6001600160a01b039290921682526001600160801b0316602082015260400190565b5f6040828403128015611d55575f80fd5b50604080519081016001600160401b0381118282101715611d7857611d78611705565b6040528251611d86816116a9565b81526020830151611d96816116ba565b60208201529392505050565b5f60208284031215611db2575f80fd5b5051919050565b8181038181111561081857610818611b81565b5f6001600160801b0382166001600160801b038103611ded57611ded611b81565b6001019291505056fea2646970667358221220d93b3554b029b9083dc4d8c56a0a7db302c903c8a8c3242f10ef109191dee5f964736f6c634300081a0033000000000000000000000000437e9f65ca234ecfed12149109587139d435ad35

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106100a6575f3560e01c80635d4ca5941161006e5780635d4ca5941461012c578063bbf79dc11461016b578063d47ada6614610174578063f37461ab1461019b578063f78fcccc146101e1578063fb908ddd146101f4575f80fd5b806302dc3a33146100aa57806303802473146100d05780630e5f6d5d146100d957806329d71cb6146100ec5780633c5933121461010c575b5f80fd5b6100bd6100b8366004611689565b610214565b6040519081526020015b60405180910390f35b6100bd610d0281565b6100bd6100e73660046116ce565b610384565b6100ff6100fa36600461176b565b61081e565b6040516100c7919061191c565b61011f61011a366004611689565b6108cf565b6040516100c7919061197f565b6101537f000000000000000000000000fc0000000000000000000000000000000000000481565b6040516001600160a01b0390911681526020016100c7565b6100bd61271081565b6101537f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad3581565b6101ae6101a9366004611689565b610e89565b604080518351600f0b81526020938401516001600160801b039081169482019490945292909116908201526060016100c7565b6100bd6101ef3660046119ff565b611122565b61020761020236600461176b565b611284565b6040516100c79190611ac2565b5f8061021f836108cf565b90505f7f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad356001600160a01b031663f89464856040518163ffffffff1660e01b8152600401602060405180830381865afa15801561027e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102a29190611b4e565b90505f5b8260200151816001600160801b0316101561037c575f8360400151826001600160801b0316815181106102db576102db611b6d565b60200260200101519050821561031e57612710610d028260400151600f0b6103039190611b95565b61030d9190611bc0565b6103179086611bd3565b9450610373565b5f426001600160801b031682606001516001600160801b0316101561034457505f610357565b4282606001516103549190611be6565b90505b610365826040015182610384565b61036f9087611bd3565b9550505b506001016102a6565b505050919050565b5f7f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad356001600160a01b031663f89464856040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104059190611b4e565b1561042e5761271061041d610d02600f86900b611b95565b6104279190611bc0565b9050610818565b5f7f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad356001600160a01b0316637c10d93a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561048b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104af9190611c05565b7f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad356001600160a01b0316637c10d93a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561050b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061052f9190611c05565b6105399085611c20565b6105439190611c4d565b90507f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad356001600160a01b0316632de4fceb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c59190611c76565b7f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad356001600160a01b0316637aa9b5566040518163ffffffff1660e01b8152600401602060405180830381865afa158015610621573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106459190611c76565b7f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad356001600160a01b031663fc26cf346040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c59190611c76565b6106cf8488611c91565b6106d99190611c91565b6106e39190611cb0565b6106ed9190611cb0565b7f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad356001600160a01b0316632de4fceb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610749573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061076d9190611c76565b7f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad356001600160a01b031663ced3c9e46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ed9190611c76565b6107f79087611c91565b6108019190611cb0565b61080b9190611cec565b6001600160801b03169150505b92915050565b8051606090806001600160401b0381111561083b5761083b611705565b60405190808252806020026020018201604052801561087457816020015b61086161160e565b8152602001906001900390816108595790505b5091505f5b818110156108c8576108a384828151811061089657610896611b6d565b60200260200101516108cf565b8382815181106108b5576108b5611b6d565b6020908102919091010152600101610879565b5050919050565b6108d761160e565b604051630b9ef08360e41b81526001600160a01b0383811660048301525f917f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad359091169063b9ef083090602401602060405180830381865afa15801561093f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109639190611c05565b6001600160801b0316602083018190526001600160a01b038416835290505f816001600160401b0381111561099a5761099a611705565b6040519080825280602002602001820160405280156109ea57816020015b604080516080810182525f8082526020808301829052928201819052606082015282525f199092019101816109b85790505b5060408401525f826001600160401b03811115610a0957610a09611705565b604051908082528060200260200182016040528015610a32578160200160208202803683370190505b5090505f5b846040015151811015610cc4576040516321c984e960e01b81525f906001600160a01b037f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad3516906321c984e990610a94908a908690600401611d22565b6040805180830381865afa158015610aae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad29190611d44565b604051635f96d4e760e01b81529091506001600160a01b037f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad351690635f96d4e790610b23908a908690600401611d22565b602060405180830381865afa158015610b3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b629190611da2565b86604001518381518110610b7857610b78611b6d565b60200260200101515f0181815250508186604001518381518110610b9e57610b9e611b6d565b6020908102919091018101516001600160801b0390921691015280516040870151805184908110610bd157610bd1611b6d565b602002602001015160400190600f0b9081600f0b81525050806020015186604001518381518110610c0457610c04611b6d565b60209081029190910101516001600160801b0391909116606090910152805160a08701518051610c35908390611cec565b600f0b9052506020810151426001600160801b039091161115610c9d576001838381518110610c6657610c66611b6d565b911515602092830291909101820152815160a08801519091018051610c8c908390611cec565b600f0b905250600190930192610cbb565b805160a08701516040018051610cb4908390611cec565b600f0b9052505b50600101610a37565b50816001600160801b03166001600160401b03811115610ce657610ce6611705565b604051908082528060200260200182016040528015610d3657816020015b604080516080810182525f8082526020808301829052928201819052606082015282525f19909201910181610d045790505b506060850152610d4f6001600160801b03831684611db9565b6001600160401b03811115610d6657610d66611705565b604051908082528060200260200182016040528015610db657816020015b604080516080810182525f8082526020808301829052928201819052606082015282525f19909201910181610d845790505b5060808501525f80805b866040015151811015610e7e575f87604001518281518110610de457610de4611b6d565b60200260200101519050848281518110610e0057610e00611b6d565b602002602001015115610e4357808860600151856001600160801b031681518110610e2d57610e2d611b6d565b6020026020010181905250836001019350610e75565b808860800151846001600160801b031681518110610e6357610e63611b6d565b60200260200101819052508260010192505b50600101610dc0565b505050505050919050565b604080518082019091525f8082526020820152604051630b9ef08360e41b81526001600160a01b0383811660048301525f9182917f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad35169063b9ef083090602401602060405180830381865afa158015610f04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f289190611c05565b6001600160801b03166001600160401b03811115610f4857610f48611705565b604051908082528060200260200182016040528015610f8c57816020015b604080518082019091525f8082526020820152815260200190600190039081610f665790505b509050610fa8604080518082019091525f808252602082015290565b5f805b8351811015611116576040516321c984e960e01b81525f906001600160a01b037f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad3516906321c984e990611004908b908690600401611d22565b6040805180830381865afa15801561101e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110429190611d44565b60200151905083602001516001600160801b0316816001600160801b0316111561110d576001600160801b03811660208501526040516321c984e960e01b81526001600160a01b037f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad3516906321c984e9906110c3908b908690600401611d22565b6040805180830381865afa1580156110dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111019190611d44565b51600f0b845290915081905b50600101610fab565b50909590945092505050565b5f807f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad356001600160a01b031663f89464856040518163ffffffff1660e01b8152600401602060405180830381865afa158015611180573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a49190611b4e565b90505f5b8451816001600160801b0316101561127c57811561121157612710610d0286836001600160801b0316815181106111e1576111e1611b6d565b6020026020010151600f0b6111f69190611b95565b6112009190611bc0565b61120a9084611bd3565b925061126c565b61125f85826001600160801b03168151811061122f5761122f611b6d565b602002602001015185836001600160801b03168151811061125257611252611b6d565b6020026020010151610384565b6112699084611bd3565b92505b61127581611dcc565b90506111a8565b505092915050565b60605f82516001600160401b038111156112a0576112a0611705565b6040519080825280602002602001820160405280156112f657816020015b6040805160a0810182525f6060820181815260808301829052825260208083018290529282015282525f199092019101816112be5790505b509050611312604080518082019091525f808252602082015290565b5f805b8551811015611604575f5b7f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad356001600160a01b031663b9ef083088848151811061136157611361611b6d565b60200260200101516040518263ffffffff1660e01b815260040161139491906001600160a01b0391909116815260200190565b602060405180830381865afa1580156113af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d39190611c05565b6001600160801b031681101561157a575f7f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad356001600160a01b03166321c984e989858151811061142557611425611b6d565b6020026020010151846040518363ffffffff1660e01b815260040161144b929190611d22565b6040805180830381865afa158015611465573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114899190611d44565b60200151905084602001516001600160801b0316816001600160801b03161115611571576001600160801b038116602086015287516001600160a01b037f000000000000000000000000437e9f65ca234ecfed12149109587139d435ad3516906321c984e9908a908690811061150157611501611b6d565b6020026020010151846040518363ffffffff1660e01b8152600401611527929190611d22565b6040805180830381865afa158015611541573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115659190611d44565b51600f0b855290925082905b50600101611320565b506040518060600160405280848152602001836001600160801b031681526020018783815181106115ad576115ad611b6d565b60200260200101516001600160a01b03168152508482815181106115d3576115d3611b6d565b60200260200101819052506115f7604080518082019091525f808252602082015290565b92505f9150600101611315565b5091949350505050565b6040518060c001604052805f6001600160a01b031681526020015f815260200160608152602001606081526020016060815260200161164b611650565b905290565b60405180606001604052806003906020820280368337509192915050565b80356001600160a01b0381168114611684575f80fd5b919050565b5f60208284031215611699575f80fd5b6116a28261166e565b9392505050565b80600f0b81146116b7575f80fd5b50565b6001600160801b03811681146116b7575f80fd5b5f80604083850312156116df575f80fd5b82356116ea816116a9565b915060208301356116fa816116ba565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561174157611741611705565b604052919050565b5f6001600160401b0382111561176157611761611705565b5060051b60200190565b5f6020828403121561177b575f80fd5b81356001600160401b03811115611790575f80fd5b8201601f810184136117a0575f80fd5b80356117b36117ae82611749565b611719565b8082825260208201915060208360051b8501019250868311156117d4575f80fd5b6020840193505b828410156117fd576117ec8461166e565b8252602093840193909101906117db565b9695505050505050565b5f8151808452602084019350602083015f5b82811015611872578151805187526001600160801b0360208201511660208801526040810151600f0b60408801526001600160801b03606082015116606088015250608086019550602082019150600181019050611819565b5093949350505050565b60018060a01b038151168252602081015160208301525f604082015161010060408501526118ae610100850182611807565b9050606083015184820360608601526118c78282611807565b915050608083015184820360808601526118e18282611807565b91505060a083015160a085015f5b6003811015611911578251600f0b8252602092830192909101906001016118ef565b509195945050505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561197357603f1987860301845261195e85835161187c565b94506020938401939190910190600101611942565b50929695505050505050565b602081525f6116a2602083018461187c565b5f82601f8301126119a0575f80fd5b81356119ae6117ae82611749565b8082825260208201915060208360051b8601019250858311156119cf575f80fd5b602085015b838110156119f55780356119e7816116ba565b8352602092830192016119d4565b5095945050505050565b5f8060408385031215611a10575f80fd5b82356001600160401b03811115611a25575f80fd5b8301601f81018513611a35575f80fd5b8035611a436117ae82611749565b8082825260208201915060208360051b850101925087831115611a64575f80fd5b6020840193505b82841015611a8f578335611a7e816116a9565b825260209384019390910190611a6b565b945050505060208301356001600160401b03811115611aac575f80fd5b611ab885828601611991565b9150509250929050565b602080825282518282018190525f918401906040840190835b81811015611b43578351611b068482518051600f0b82526020908101516001600160801b0316910152565b6020818101516001600160801b0316604086810191909152909101516001600160a01b031660608501529390930192608090920191600101611adb565b509095945050505050565b5f60208284031215611b5e575f80fd5b815180151581146116a2575f80fd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761081857610818611b81565b634e487b7160e01b5f52601260045260245ffd5b5f82611bce57611bce611bac565b500490565b8082018082111561081857610818611b81565b6001600160801b03828116828216039081111561081857610818611b81565b5f60208284031215611c15575f80fd5b81516116a2816116ba565b5f6001600160801b03831680611c3857611c38611bac565b806001600160801b0384160491505092915050565b6001600160801b038181168382160290811690818114611c6f57611c6f611b81565b5092915050565b5f60208284031215611c86575f80fd5b81516116a2816116a9565b5f82600f0b82600f0b0280600f0b9150808214611c6f57611c6f611b81565b5f81600f0b83600f0b80611cc657611cc6611bac565b60016001607f1b031982145f1982141615611ce357611ce3611b81565b90059392505050565b600f81810b9083900b016f7fffffffffffffffffffffffffffffff811360016001607f1b03198212171561081857610818611b81565b6001600160a01b039290921682526001600160801b0316602082015260400190565b5f6040828403128015611d55575f80fd5b50604080519081016001600160401b0381118282101715611d7857611d78611705565b6040528251611d86816116a9565b81526020830151611d96816116ba565b60208201529392505050565b5f60208284031215611db2575f80fd5b5051919050565b8181038181111561081857610818611b81565b5f6001600160801b0382166001600160801b038103611ded57611ded611b81565b6001019291505056fea2646970667358221220d93b3554b029b9083dc4d8c56a0a7db302c903c8a8c3242f10ef109191dee5f964736f6c634300081a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000437e9f65ca234ecfed12149109587139d435ad35

-----Decoded View---------------
Arg [0] : _FPISLocker (address): 0x437E9F65cA234eCfed12149109587139d435AD35

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000437e9f65ca234ecfed12149109587139d435ad35


Deployed Bytecode Sourcemap

86517:12587:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97640:1461;;;;;;:::i;:::-;;:::i;:::-;;;529:25:1;;;517:2;502:18;97640:1461:0;;;;;;;;86652:66;;86714:4;86652:66;;94893:992;;;;;;:::i;:::-;;:::i;91144:619::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;87530:3063::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;86607:36::-;;;;;;;;-1:-1:-1;;;;;6008:32:1;;;5990:51;;5978:2;5963:18;86607:36:0;5821:226:1;86725:57:0;;86776:6;86725:57;;86566:34;;;;;92122:758;;;;;;:::i;:::-;;:::i;:::-;;;;6374:12:1;;6370:2;6359:28;6347:41;;6441:4;6430:16;;;6424:23;-1:-1:-1;;;;;6420:64:1;;;6404:14;;;6397:88;;;;6818:47;;;;6798:18;;;6791:75;6720:2;6705:18;92122:758:0;6496:376:1;96375:840:0;;;;;;:::i;:::-;;:::i;93300:1112::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;97640:1461::-;97711:22;97786:41;97830:30;97854:5;97830:23;:30::i;:::-;97786:74;;97933:29;97965:5;-1:-1:-1;;;;;97965:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;97933:61;;98061:9;98056:1038;98080:13;:27;;;98076:1;-1:-1:-1;;;;;98076:31:0;;98056:1038;;;98160:38;98201:13;:22;;;98224:1;-1:-1:-1;;;;;98201:25:0;;;;;;;;;:::i;:::-;;;;;;;98160:66;;98312:24;98308:711;;;86776:6;86714:4;98412:9;:16;;;98405:24;;98397:71;;;;:::i;:::-;98396:121;;;;:::i;:::-;98357:160;;;;:::i;:::-;;;98308:711;;;98603:22;98672:15;-1:-1:-1;;;;;98648:40:0;:9;:13;;;-1:-1:-1;;;;;98648:40:0;;98644:213;;;-1:-1:-1;98730:1:0;98644:213;;;98821:15;98797:9;:13;;;:40;;;;:::i;:::-;98780:57;;98644:213;98941:62;98970:9;:16;;;98988:14;98941:28;:62::i;:::-;98923:80;;;;:::i;:::-;;;98539:480;98308:711;-1:-1:-1;99064:3:0;;98056:1038;;;;97735:1366;;97640:1461;;;:::o;94893:992::-;95020:22;95114:5;-1:-1:-1;;;;;95114:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95110:164;;;86776:6;95168:66;86714:4;95176:19;;;;95168:66;:::i;:::-;95167:95;;;;:::i;:::-;95160:102;;;;95110:164;95342:20;95413:5;-1:-1:-1;;;;;95413:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95389:5;-1:-1:-1;;;;;95389:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95373:36;;:13;:36;:::i;:::-;95372:61;;;;:::i;:::-;95342:92;;95819:5;-1:-1:-1;;;;;95819:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95769:5;-1:-1:-1;;;;;95769:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95703:5;-1:-1:-1;;;;;95703:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95673:27;95687:13;95673:11;:27;:::i;:::-;:67;;;;:::i;:::-;95672:119;;;;:::i;:::-;:178;;;;:::i;:::-;95615:5;-1:-1:-1;;;;;95615:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95569:5;-1:-1:-1;;;;;95569:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95555:56;;:11;:56;:::i;:::-;95554:92;;;;:::i;:::-;95553:298;;;;:::i;:::-;-1:-1:-1;;;;;95505:372:0;95488:389;;95044:841;94893:992;;;;;:::o;91144:619::-;91366:13;;91243:44;;91366:13;-1:-1:-1;;;;;91449:37:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;91432:54;;91579:9;91574:182;91598:9;91594:1;:13;91574:182;;;91646:34;91670:6;91677:1;91670:9;;;;;;;;:::i;:::-;;;;;;;91646:23;:34::i;:::-;91626:14;91641:1;91626:17;;;;;;;;:::i;:::-;;;;;;;;;;:54;91726:3;;91574:182;;;;91289:474;91144:619;;;:::o;87530:3063::-;87599:41;;:::i;:::-;87717:21;;-1:-1:-1;;;87717:21:0;;-1:-1:-1;;;;;6008:32:1;;;87717:21:0;;;5990:51:1;87695:19:0;;87717:5;:14;;;;;;5963:18:1;;87717:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;87695:43:0;87836:27;;;:41;;;-1:-1:-1;;;;;87915:26:0;;;;87695:43;-1:-1:-1;87749:28:0;87695:43;-1:-1:-1;;;;;88012:40:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88012:40:0;;-1:-1:-1;;88012:40:0;;;;;;;;;;;-1:-1:-1;87987:22:0;;;:65;88136:23;88173:11;-1:-1:-1;;;;;88162:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;88162:23:0;;88136:49;;88245:9;88240:1159;88260:13;:22;;;:29;88256:1;:33;88240:1159;;;88390:38;;-1:-1:-1;;;88390:38:0;;88357:30;;-1:-1:-1;;;;;88390:5:0;:19;;;;:38;;88410:5;;88425:1;;88390:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;88474:37;;-1:-1:-1;;;88474:37:0;;88357:71;;-1:-1:-1;;;;;;88474:5:0;:18;;;;:37;;88493:5;;88508:1;;88474:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;88443:13;:22;;;88466:1;88443:25;;;;;;;;:::i;:::-;;;;;;;:28;;:68;;;;;88568:1;88526:13;:22;;;88549:1;88526:25;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;88526:44:0;;;:31;;:44;88620:16;;88585:22;;;;:25;;88608:1;;88585:25;;;;;;:::i;:::-;;;;;;;:32;;:51;;;;;;;;;;;88683:9;:13;;;88651;:22;;;88674:1;88651:25;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;88651:45:0;;;;:29;;;;:45;88741:16;;88711:23;;;;:46;;;;88741:16;;88711:46;:::i;:::-;;;;;-1:-1:-1;88836:13:0;;;;88852:15;-1:-1:-1;;;;;88836:31:0;;;;88832:494;;;88948:4;88933:9;88943:1;88933:12;;;;;;;;:::i;:::-;:19;;;:12;;;;;;;;;;:19;89057:16;;89027:23;;;;:26;;;:46;;;;89057:16;;89027:46;:::i;:::-;;;;;-1:-1:-1;89127:22:0;;;;;88832:494;;;89294:16;;89264:23;;;;:26;;:46;;;;89294:16;;89264:46;:::i;:::-;;;;;-1:-1:-1;88832:494:0;-1:-1:-1;89369:3:0;;88240:1159;;;;89521:20;-1:-1:-1;;;;;89493:49:0;-1:-1:-1;;;;;89493:49:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89493:49:0;;-1:-1:-1;;89493:49:0;;;;;;;;;;;-1:-1:-1;89465:25:0;;;:77;89610:34;-1:-1:-1;;;;;89610:34:0;;:11;:34;:::i;:::-;-1:-1:-1;;;;;89582:63:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89582:63:0;;-1:-1:-1;;89582:63:0;;;;;;;;;;;-1:-1:-1;89553:26:0;;;:92;89765:22;;;89832:754;89852:13;:22;;;:29;89848:1;:33;89832:754;;;89934:38;89975:13;:22;;;89998:1;89975:25;;;;;;;;:::i;:::-;;;;;;;89934:66;;90079:9;90089:1;90079:12;;;;;;;;:::i;:::-;;;;;;;90075:436;;;90183:9;90139:13;:25;;;90165:14;-1:-1:-1;;;;;90139:41:0;;;;;;;;;:::i;:::-;;;;;;:53;;;;90246:16;;;;;90075:436;;;90396:9;90350:13;:26;;;90377:15;-1:-1:-1;;;;;90350:43:0;;;;;;;;;:::i;:::-;;;;;;:55;;;;90459:17;;;;;90075:436;-1:-1:-1;90556:3:0;;89832:754;;;;87642:2951;;;;;87530:3063;;;:::o;92122:758::-;-1:-1:-1;;;;;;;;;;;;;;;;;92274:20:0;;-1:-1:-1;;;92274:20:0;;-1:-1:-1;;;;;6008:32:1;;;92274:20:0;;;5990:51:1;92203:7:0;;;;92274:5;:14;;;;5963:18:1;;92274:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;92254:41:0;-1:-1:-1;;;;;92254:41:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;92254:41:0;;;;;;;;;;;;;;;;92223:72;;92306:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;92306:32:0;92349:24;;92386:436;92410:5;:12;92406:1;:16;92386:436;;;92462:37;;-1:-1:-1;;;92462:37:0;;92441:18;;-1:-1:-1;;;;;92462:5:0;:19;;;;:37;;92482:4;;92496:1;;92462:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;92441:62;;92535:11;:15;;;-1:-1:-1;;;;;92522:28:0;:10;-1:-1:-1;;;;;92522:28:0;;92518:229;;;-1:-1:-1;;;;;92571:28:0;;:15;;;:28;92639:37;;-1:-1:-1;;;92639:37:0;;-1:-1:-1;;;;;92639:5:0;:19;;;;:37;;92659:4;;92673:1;;92639:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;92618:65;;;;92729:1;;-1:-1:-1;92729:1:0;;92518:229;-1:-1:-1;92792:3:0;;92386:436;;;-1:-1:-1;92842:11:0;;92855:16;;-1:-1:-1;92122:758:0;-1:-1:-1;;;92122:758:0:o;96375:840::-;96523:22;96618:29;96650:5;-1:-1:-1;;;;;96650:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;96618:61;;96732:9;96727:481;96751:12;:19;96747:1;-1:-1:-1;;;;;96747:23:0;;96727:481;;;96855:24;96851:346;;;86776:6;86714:4;96955:12;96968:1;-1:-1:-1;;;;;96955:15:0;;;;;;;;;:::i;:::-;;;;;;;96948:23;;96940:70;;;;:::i;:::-;96939:120;;;;:::i;:::-;96900:159;;;;:::i;:::-;;;96851:346;;;97118:63;97147:12;97160:1;-1:-1:-1;;;;;97147:15:0;;;;;;;;;:::i;:::-;;;;;;;97164:13;97178:1;-1:-1:-1;;;;;97164:16:0;;;;;;;;;:::i;:::-;;;;;;;97118:28;:63::i;:::-;97100:81;;;;:::i;:::-;;;96851:346;96772:3;;;:::i;:::-;;;96727:481;;;;96547:668;96375:840;;;;:::o;93300:1112::-;93373:20;93406:33;93460:5;:12;-1:-1:-1;;;;;93442:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93442:31:0;;-1:-1:-1;;93442:31:0;;;;;;;;;;;;93406:67;;93484:32;-1:-1:-1;;;;;;;;;;;;;;;;;;;93484:32:0;93527:24;;93564:809;93588:5;:12;93584:1;:16;93564:809;;;93624:9;93619:492;93639:5;-1:-1:-1;;;;;93639:14:0;;93654:5;93660:1;93654:8;;;;;;;;:::i;:::-;;;;;;;93639:24;;;;;;;;;;;;;;-1:-1:-1;;;;;6008:32:1;;;;5990:51;;5978:2;5963:18;;5821:226;93639:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;93635:28:0;:1;:28;93619:492;;;93686:18;93707:5;-1:-1:-1;;;;;93707:19:0;;93727:5;93733:1;93727:8;;;;;;;;:::i;:::-;;;;;;;93745:1;93707:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;;;93686:66;;93788:11;:15;;;-1:-1:-1;;;;;93775:28:0;:10;-1:-1:-1;;;;;93775:28:0;;93771:249;;;-1:-1:-1;;;;;93828:28:0;;:15;;;:28;93920:8;;-1:-1:-1;;;;;93900:5:0;:19;;;;93920:5;;93926:1;;93920:8;;;;;;:::i;:::-;;;;;;;93938:1;93900:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;93879:69;;;;93998:1;;-1:-1:-1;93998:1:0;;93771:249;-1:-1:-1;94073:3:0;;93619:492;;;;94145:79;;;;;;;;94165:11;94145:79;;;;94189:16;-1:-1:-1;;;;;94145:79:0;;;;;94213:5;94219:1;94213:8;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;94145:79:0;;;;94127:12;94140:1;94127:15;;;;;;;;:::i;:::-;;;;;;:97;;;;94241:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;94241:18:0;;-1:-1:-1;94274:23:0;;-1:-1:-1;94343:3:0;;93564:809;;;-1:-1:-1;94392:12:0;;93300:1112;-1:-1:-1;;;;93300:1112:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;565:120::-;654:5;650:2;639:21;632:5;629:32;619:60;;675:1;672;665:12;619:60;565:120;:::o;690:146::-;-1:-1:-1;;;;;769:5:1;765:46;758:5;755:57;745:85;;826:1;823;816:12;841:386;908:6;916;969:2;957:9;948:7;944:23;940:32;937:52;;;985:1;982;975:12;937:52;1024:9;1011:23;1043:30;1067:5;1043:30;:::i;:::-;1092:5;-1:-1:-1;1149:2:1;1134:18;;1121:32;1162:33;1121:32;1162:33;:::i;:::-;1214:7;1204:17;;;841:386;;;;;:::o;1232:127::-;1293:10;1288:3;1284:20;1281:1;1274:31;1324:4;1321:1;1314:15;1348:4;1345:1;1338:15;1364:275;1435:2;1429:9;1500:2;1481:13;;-1:-1:-1;;1477:27:1;1465:40;;-1:-1:-1;;;;;1520:34:1;;1556:22;;;1517:62;1514:88;;;1582:18;;:::i;:::-;1618:2;1611:22;1364:275;;-1:-1:-1;1364:275:1:o;1644:183::-;1704:4;-1:-1:-1;;;;;1729:6:1;1726:30;1723:56;;;1759:18;;:::i;:::-;-1:-1:-1;1804:1:1;1800:14;1816:4;1796:25;;1644:183::o;1832:892::-;1916:6;1969:2;1957:9;1948:7;1944:23;1940:32;1937:52;;;1985:1;1982;1975:12;1937:52;2025:9;2012:23;-1:-1:-1;;;;;2050:6:1;2047:30;2044:50;;;2090:1;2087;2080:12;2044:50;2113:22;;2166:4;2158:13;;2154:27;-1:-1:-1;2144:55:1;;2195:1;2192;2185:12;2144:55;2235:2;2222:16;2258:64;2274:47;2314:6;2274:47;:::i;:::-;2258:64;:::i;:::-;2344:3;2368:6;2363:3;2356:19;2400:2;2395:3;2391:12;2384:19;;2455:2;2445:6;2442:1;2438:14;2434:2;2430:23;2426:32;2412:46;;2481:7;2473:6;2470:19;2467:39;;;2502:1;2499;2492:12;2467:39;2534:2;2530;2526:11;2515:22;;2546:148;2562:6;2557:3;2554:15;2546:148;;;2628:23;2647:3;2628:23;:::i;:::-;2616:36;;2681:2;2579:12;;;;2672;;;;2546:148;;;2713:5;1832:892;-1:-1:-1;;;;;;1832:892:1:o;2729:742::-;2803:3;2841:5;2835:12;2868:6;2863:3;2856:19;2900:4;2895:3;2891:14;2884:21;;2939:4;2932:5;2928:16;2962:1;2972:474;2986:6;2983:1;2980:13;2972:474;;;3051:6;3045:13;3089:2;3083:9;3078:3;3071:22;-1:-1:-1;;;;;3147:4:1;3143:2;3139:13;3133:20;3129:61;3122:4;3117:3;3113:14;3106:85;3256:4;3252:2;3248:13;3242:20;3238:2;3227:36;3220:4;3215:3;3211:14;3204:60;-1:-1:-1;;;;;3318:4:1;3314:2;3310:13;3304:20;3300:61;3293:4;3288:3;3284:14;3277:85;;3391:4;3386:3;3382:14;3375:21;;3431:4;3423:6;3419:17;3409:27;;3008:1;3005;3001:9;2996:14;;2972:474;;;-1:-1:-1;3462:3:1;;2729:742;-1:-1:-1;;;;2729:742:1:o;3476:1174::-;3604:1;3600;3595:3;3591:11;3587:19;3579:5;3573:12;3569:38;3564:3;3557:51;3657:4;3650:5;3646:16;3640:23;3633:4;3628:3;3624:14;3617:47;3539:3;3710:4;3703:5;3699:16;3693:23;3748:6;3741:4;3736:3;3732:14;3725:30;3776:81;3849:6;3844:3;3840:16;3826:12;3776:81;:::i;:::-;3764:93;;3905:4;3898:5;3894:16;3888:23;3953:3;3947:4;3943:14;3936:4;3931:3;3927:14;3920:38;3981:71;4047:4;4031:14;3981:71;:::i;:::-;3967:85;;;4100:4;4093:5;4089:16;4083:23;4150:3;4142:6;4138:16;4131:4;4126:3;4122:14;4115:40;4178:73;4244:6;4228:14;4178:73;:::i;:::-;4164:87;;;4299:4;4292:5;4288:16;4282:23;4336:4;4331:3;4327:14;4419:1;4429:193;4443:4;4440:1;4437:11;4429:193;;;4519:13;;4515:2;4504:29;4490:44;;4567:4;4595:17;;;;4556:16;;;;4463:1;4456:9;4429:193;;;-1:-1:-1;4638:6:1;;3476:1174;-1:-1:-1;;;;;3476:1174:1:o;4655:859::-;4873:4;4921:2;4910:9;4906:18;4951:2;4940:9;4933:21;4974:6;5009;5003:13;5040:6;5032;5025:22;5078:2;5067:9;5063:18;5056:25;;5140:2;5130:6;5127:1;5123:14;5112:9;5108:30;5104:39;5090:53;;5178:2;5170:6;5166:15;5199:1;5209:276;5223:6;5220:1;5217:13;5209:276;;;5316:2;5312:7;5300:9;5292:6;5288:22;5284:36;5279:3;5272:49;5344:61;5398:6;5389;5383:13;5344:61;:::i;:::-;5334:71;-1:-1:-1;5440:2:1;5463:12;;;;5428:15;;;;;5245:1;5238:9;5209:276;;;-1:-1:-1;5502:6:1;;4655:859;-1:-1:-1;;;;;;4655:859:1:o;5519:297::-;5724:2;5713:9;5706:21;5687:4;5744:66;5806:2;5795:9;5791:18;5783:6;5744:66;:::i;6877:744::-;6931:5;6984:3;6977:4;6969:6;6965:17;6961:27;6951:55;;7002:1;6999;6992:12;6951:55;7042:6;7029:20;7069:64;7085:47;7125:6;7085:47;:::i;7069:64::-;7157:3;7181:6;7176:3;7169:19;7213:4;7208:3;7204:14;7197:21;;7274:4;7264:6;7261:1;7257:14;7249:6;7245:27;7241:38;7227:52;;7302:3;7294:6;7291:15;7288:35;;;7319:1;7316;7309:12;7288:35;7355:4;7347:6;7343:17;7369:221;7385:6;7380:3;7377:15;7369:221;;;7467:3;7454:17;7484:31;7509:5;7484:31;:::i;:::-;7528:18;;7575:4;7566:14;;;;7402;7369:221;;;-1:-1:-1;7608:7:1;6877:744;-1:-1:-1;;;;;6877:744:1:o;7626:1213::-;7743:6;7751;7804:2;7792:9;7783:7;7779:23;7775:32;7772:52;;;7820:1;7817;7810:12;7772:52;7860:9;7847:23;-1:-1:-1;;;;;7885:6:1;7882:30;7879:50;;;7925:1;7922;7915:12;7879:50;7948:22;;8001:4;7993:13;;7989:27;-1:-1:-1;7979:55:1;;8030:1;8027;8020:12;7979:55;8070:2;8057:16;8093:64;8109:47;8149:6;8109:47;:::i;8093:64::-;8179:3;8203:6;8198:3;8191:19;8235:4;8230:3;8226:14;8219:21;;8292:4;8282:6;8279:1;8275:14;8271:2;8267:23;8263:34;8249:48;;8320:7;8312:6;8309:19;8306:39;;;8341:1;8338;8331:12;8306:39;8373:4;8369:2;8365:13;8354:24;;8387:220;8403:6;8398:3;8395:15;8387:220;;;8485:3;8472:17;8502:30;8526:5;8502:30;:::i;:::-;8545:18;;8592:4;8420:14;;;;8583;;;;8387:220;;;8626:5;-1:-1:-1;;;;8684:4:1;8669:20;;8656:34;-1:-1:-1;;;;;8702:32:1;;8699:52;;;8747:1;8744;8737:12;8699:52;8770:63;8825:7;8814:8;8803:9;8799:24;8770:63;:::i;:::-;8760:73;;;7626:1213;;;;;:::o;8844:903::-;9092:2;9104:21;;;9174:13;;9077:18;;;9196:22;;;9044:4;;9275:15;;;9249:2;9234:18;;;9044:4;9318:403;9332:6;9329:1;9326:13;9318:403;;;9397:6;9391:13;9417:47;9460:3;9455:2;9449:9;6374:12;;6370:2;6359:28;6347:41;;6441:4;6430:16;;;6424:23;-1:-1:-1;;;;;6420:64:1;6404:14;;6397:88;6280:211;9417:47;9516:2;9508:11;;;9502:18;-1:-1:-1;;;;;9498:59:1;9493:2;9484:12;;;9477:81;;;;9604:11;;;9598:18;-1:-1:-1;;;;;9594:44:1;9587:4;9578:14;;9571:68;9696:15;;;;;9668:4;9659:14;;;;9635:1;9347:9;9318:403;;;-1:-1:-1;9738:3:1;;8844:903;-1:-1:-1;;;;;8844:903:1:o;9752:277::-;9819:6;9872:2;9860:9;9851:7;9847:23;9843:32;9840:52;;;9888:1;9885;9878:12;9840:52;9920:9;9914:16;9973:5;9966:13;9959:21;9952:5;9949:32;9939:60;;9995:1;9992;9985:12;10034:127;10095:10;10090:3;10086:20;10083:1;10076:31;10126:4;10123:1;10116:15;10150:4;10147:1;10140:15;10166:127;10227:10;10222:3;10218:20;10215:1;10208:31;10258:4;10255:1;10248:15;10282:4;10279:1;10272:15;10298:168;10371:9;;;10402;;10419:15;;;10413:22;;10399:37;10389:71;;10440:18;;:::i;10471:127::-;10532:10;10527:3;10523:20;10520:1;10513:31;10563:4;10560:1;10553:15;10587:4;10584:1;10577:15;10603:120;10643:1;10669;10659:35;;10674:18;;:::i;:::-;-1:-1:-1;10708:9:1;;10603:120::o;10728:125::-;10793:9;;;10814:10;;;10811:36;;;10827:18;;:::i;10858:243::-;-1:-1:-1;;;;;10973:42:1;;;10929;;;10925:91;;11028:44;;11025:70;;;11075:18;;:::i;11106:251::-;11176:6;11229:2;11217:9;11208:7;11204:23;11200:32;11197:52;;;11245:1;11242;11235:12;11197:52;11277:9;11271:16;11296:31;11321:5;11296:31;:::i;11362:227::-;11402:1;-1:-1:-1;;;;;11433:1:1;11429:42;11490:3;11480:37;;11497:18;;:::i;:::-;11579:3;-1:-1:-1;;;;;11539:1:1;11535:42;11531:52;11526:57;;;11362:227;;;;:::o;11594:317::-;-1:-1:-1;;;;;11679:42:1;;;11723;;;11675:91;11786:52;;;;11857:24;;;11847:58;;11885:18;;:::i;:::-;11847:58;11594:317;;;;:::o;11916:249::-;11985:6;12038:2;12026:9;12017:7;12013:23;12009:32;12006:52;;;12054:1;12051;12044:12;12006:52;12086:9;12080:16;12105:30;12129:5;12105:30;:::i;12170:241::-;12209:7;12288:1;12284:2;12273:17;12269:1;12265:2;12254:17;12250:41;12326:11;12322:2;12311:27;12300:38;;12369:11;12360:7;12357:24;12347:58;;12385:18;;:::i;12416:305::-;12455:1;12497;12493:2;12482:17;12534:1;12530:2;12519:17;12555:3;12545:37;;12562:18;;:::i;:::-;-1:-1:-1;;;;;;12598:48:1;;-1:-1:-1;;12648:15:1;;12594:70;12591:96;;;12667:18;;:::i;:::-;12701:14;;;12416:305;-1:-1:-1;;;12416:305:1:o;12726:245::-;12824:2;12794:17;;;12813;;;;12790:41;12905:34;12846:44;;-1:-1:-1;;;;;;12892:49:1;;12843:99;12840:125;;;12945:18;;:::i;13184:315::-;-1:-1:-1;;;;;13376:32:1;;;;13358:51;;-1:-1:-1;;;;;13445:47:1;13440:2;13425:18;;13418:75;13346:2;13331:18;;13184:315::o;13504:703::-;13605:6;13665:2;13653:9;13644:7;13640:23;13636:32;13680:2;13677:22;;;13695:1;13692;13685:12;13677:22;-1:-1:-1;13764:2:1;13758:9;;;13794:15;;-1:-1:-1;;;;;13824:34:1;;13860:22;;;13821:62;13818:88;;;13886:18;;:::i;:::-;13922:2;13915:22;13959:16;;13984:30;13959:16;13984:30;:::i;:::-;14023:21;;14089:2;14074:18;;14068:25;14102:33;14068:25;14102:33;:::i;:::-;14163:2;14151:15;;14144:32;14155:6;13504:703;-1:-1:-1;;;13504:703:1:o;14212:184::-;14282:6;14335:2;14323:9;14314:7;14310:23;14306:32;14303:52;;;14351:1;14348;14341:12;14303:52;-1:-1:-1;14374:16:1;;14212:184;-1:-1:-1;14212:184:1:o;14401:128::-;14468:9;;;14489:11;;;14486:37;;;14503:18;;:::i;14534:237::-;14573:3;-1:-1:-1;;;;;14610:5:1;14606:46;-1:-1:-1;;;;;14667:7:1;14664:47;14661:73;;14714:18;;:::i;:::-;14763:1;14750:15;;14534:237;-1:-1:-1;;14534:237:1:o

Swarm Source

ipfs://d93b3554b029b9083dc4d8c56a0a7db302c903c8a8c3242f10ef109191dee5f9

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.