ETH Price: $3,406.99 (+2.74%)

Contract

0xCFbFaC74C26F8647cBDb8c5caf80BB5b32E43134
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute Allowanc...214684672024-12-23 23:29:595 hrs ago1734996599IN
0xCFbFaC74...b32E43134
0 ETH0.000963710.09054094
Execute Allowanc...214681392024-12-23 22:23:476 hrs ago1734992627IN
0xCFbFaC74...b32E43134
0 ETH0.0010861111.37081938
Execute Allowanc...214678892024-12-23 21:33:237 hrs ago1734989603IN
0xCFbFaC74...b32E43134
0 ETH0.0014638417.77929781
Execute Allowanc...214671742024-12-23 19:08:479 hrs ago1734980927IN
0xCFbFaC74...b32E43134
0 ETH0.001096513.95767114
Execute Allowanc...214666922024-12-23 17:31:5911 hrs ago1734975119IN
0xCFbFaC74...b32E43134
0 ETH0.001088813.88458961
Execute Allowanc...214663162024-12-23 16:16:2312 hrs ago1734970583IN
0xCFbFaC74...b32E43134
0 ETH0.0010228617.53519379
Execute Allowanc...214661972024-12-23 15:51:5913 hrs ago1734969119IN
0xCFbFaC74...b32E43134
0 ETH0.0015347319.3
Execute Allowanc...214657112024-12-23 14:14:2314 hrs ago1734963263IN
0xCFbFaC74...b32E43134
0 ETH0.0020386334.94876604
Execute Allowanc...214651972024-12-23 12:30:4716 hrs ago1734957047IN
0xCFbFaC74...b32E43134
0 ETH0.000806547.726893
Execute Allowanc...214649122024-12-23 11:33:1117 hrs ago1734953591IN
0xCFbFaC74...b32E43134
0 ETH0.000391936.46040563
Execute Allowanc...214648562024-12-23 11:21:5917 hrs ago1734952919IN
0xCFbFaC74...b32E43134
0 ETH0.00035886.15100522
Execute Allowanc...214648492024-12-23 11:20:3517 hrs ago1734952835IN
0xCFbFaC74...b32E43134
0 ETH0.000372746.39008083
Execute Allowanc...214640012024-12-23 8:30:2320 hrs ago1734942623IN
0xCFbFaC74...b32E43134
0 ETH0.000543535.62546247
Execute Allowanc...214639382024-12-23 8:17:4720 hrs ago1734941867IN
0xCFbFaC74...b32E43134
0 ETH0.000502775.25651675
Execute Allowanc...214638022024-12-23 7:50:2321 hrs ago1734940223IN
0xCFbFaC74...b32E43134
0 ETH0.000521836.64155414
Execute Allowanc...214636592024-12-23 7:20:2321 hrs ago1734938423IN
0xCFbFaC74...b32E43134
0 ETH0.000266684.57377544
Execute Allowanc...214635802024-12-23 7:04:3521 hrs ago1734937475IN
0xCFbFaC74...b32E43134
0 ETH0.000284284.87350088
Execute Allowanc...214634462024-12-23 6:37:4722 hrs ago1734935867IN
0xCFbFaC74...b32E43134
0 ETH0.000347695.9606339
Execute Allowanc...214617942024-12-23 1:05:1127 hrs ago1734915911IN
0xCFbFaC74...b32E43134
0 ETH0.000280394.62092075
Execute Allowanc...214617812024-12-23 1:02:3528 hrs ago1734915755IN
0xCFbFaC74...b32E43134
0 ETH0.000342855.65037631
Execute Allowanc...214617582024-12-23 0:57:5928 hrs ago1734915479IN
0xCFbFaC74...b32E43134
0 ETH0.00043765.09837139
Execute Allowanc...214592392024-12-22 16:30:1136 hrs ago1734885011IN
0xCFbFaC74...b32E43134
0 ETH0.00050968.73623357
Execute Allowanc...214590152024-12-22 15:45:1137 hrs ago1734882311IN
0xCFbFaC74...b32E43134
0 ETH0.000606367.51266555
Execute Allowanc...214587452024-12-22 14:50:5938 hrs ago1734879059IN
0xCFbFaC74...b32E43134
0 ETH0.000575589.86740595
Execute Allowanc...214586812024-12-22 14:37:5938 hrs ago1734878279IN
0xCFbFaC74...b32E43134
0 ETH0.0006576711.27475265
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
111446022020-10-28 10:28:041517 days ago1603880884  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AllowanceModule

Compiler Version
v0.7.4+commit.3f05b770

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU LGPLv3 license
File 1 of 3 : AlowanceModule.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.8.0;

import "./Enum.sol";
import "./SignatureDecoder.sol";

interface GnosisSafe {
    /// @dev Allows a Module to execute a Safe transaction without any further confirmations.
    /// @param to Destination address of module transaction.
    /// @param value Ether value of module transaction.
    /// @param data Data payload of module transaction.
    /// @param operation Operation type of module transaction.
    function execTransactionFromModule(address to, uint256 value, bytes calldata data, Enum.Operation operation)
        external
        returns (bool success);
}

contract AllowanceModule is SignatureDecoder {

    string public constant NAME = "Allowance Module";
    string public constant VERSION = "0.1.0";

    bytes32 public constant DOMAIN_SEPARATOR_TYPEHASH = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218;
    // keccak256(
    //     "EIP712Domain(uint256 chainId,address verifyingContract)"
    // );

    bytes32 public constant ALLOWANCE_TRANSFER_TYPEHASH = 0x80b006280932094e7cc965863eb5118dc07e5d272c6670c4a7c87299e04fceeb;
    // keccak256(
    //     "AllowanceTransfer(address safe,address token,uint96 amount,address paymentToken,uint96 payment,uint16 nonce)"
    // );

    // Safe -> Delegate -> Allowance
    mapping(address => mapping (address => mapping(address => Allowance))) public allowances;
    // Safe -> Delegate -> Tokens
    mapping(address => mapping (address => address[])) public tokens;
    // Safe -> Delegates double linked list entry points
    mapping(address => uint48) public delegatesStart;
    // Safe -> Delegates double linked list
    mapping(address => mapping (uint48 => Delegate)) public delegates;

    // We use a double linked list for the delegates. The id is the first 6 bytes. 
    // To double check the address in case of collision, the address is part of the struct.
    struct Delegate {
        address delegate;
        uint48 prev;
        uint48 next;
    }

    // The allowance info is optimized to fit into one word of storage.
    struct Allowance {
        uint96 amount;
        uint96 spent;
        uint16 resetTimeMin; // Maximum reset time span is 65k minutes
        uint32 lastResetMin;
        uint16 nonce;
    }

    event AddDelegate(address indexed safe, address delegate);
    event RemoveDelegate(address indexed safe, address delegate);
    event ExecuteAllowanceTransfer(address indexed safe, address delegate, address token, address to, uint96 value, uint16 nonce);
    event PayAllowanceTransfer(address indexed safe, address delegate, address paymentToken, address paymentReceiver, uint96 payment);
    event SetAllowance(address indexed safe, address delegate, address token, uint96 allowanceAmount, uint16 resetTime);
    event ResetAllowance(address indexed safe, address delegate, address token);
    event DeleteAllowance(address indexed safe, address delegate, address token);

    /// @dev Allows to update the allowance for a specified token. This can only be done via a Safe transaction.
    /// @param delegate Delegate whose allowance should be updated.
    /// @param token Token contract address.
    /// @param allowanceAmount allowance in smallest token unit.
    /// @param resetTimeMin Time after which the allowance should reset
    /// @param resetBaseMin Time based on which the reset time should be increased
    function setAllowance(address delegate, address token, uint96 allowanceAmount, uint16 resetTimeMin, uint32 resetBaseMin)
        public
    {
        require(delegate != address(0), "delegate != address(0)");
        require(delegates[msg.sender][uint48(delegate)].delegate == delegate, "delegates[msg.sender][uint48(delegate)].delegate == delegate");
        Allowance memory allowance = getAllowance(msg.sender, delegate, token);
        if (allowance.nonce == 0) { // New token
            // Nonce should never be 0 once allowance has been activated
            allowance.nonce = 1;
            tokens[msg.sender][delegate].push(token);
        }
        // Divide by 60 to get current time in minutes
        // solium-disable-next-line security/no-block-members
        uint32 currentMin = uint32(block.timestamp / 60);
        if (resetBaseMin > 0) {
            require(resetBaseMin <= currentMin, "resetBaseMin <= currentMin");
            allowance.lastResetMin = currentMin - ((currentMin - resetBaseMin) % resetTimeMin);
        } else if (allowance.lastResetMin == 0) {
            allowance.lastResetMin = currentMin;
        }
        allowance.resetTimeMin = resetTimeMin;
        allowance.amount = allowanceAmount;
        updateAllowance(msg.sender, delegate, token, allowance);
        emit SetAllowance(msg.sender, delegate, token, allowanceAmount, resetTimeMin);
    }

    function getAllowance(address safe, address delegate, address token) private view returns (Allowance memory allowance) {
        allowance = allowances[safe][delegate][token];
        // solium-disable-next-line security/no-block-members
        uint32 currentMin = uint32(block.timestamp / 60);
        // Check if we should reset the time. We do this on load to minimize storage read/ writes
        if (allowance.resetTimeMin > 0 && allowance.lastResetMin <= currentMin - allowance.resetTimeMin) {
            allowance.spent = 0;
            // Resets happen in regular intervals and `lastResetMin` should be aligned to that
            allowance.lastResetMin = currentMin - ((currentMin - allowance.lastResetMin) % allowance.resetTimeMin);
        }
        return allowance;
    }

    function updateAllowance(address safe, address delegate, address token, Allowance memory allowance) private {
        allowances[safe][delegate][token] = allowance;
    }

    /// @dev Allows to reset the allowance for a specific delegate and token.
    /// @param delegate Delegate whose allowance should be updated.
    /// @param token Token contract address.
    function resetAllowance(address delegate, address token) public {
        Allowance memory allowance = getAllowance(msg.sender, delegate, token);
        allowance.spent = 0;
        updateAllowance(msg.sender, delegate, token, allowance);
        emit ResetAllowance(msg.sender, delegate, token);
    }

    /// @dev Allows to remove the allowance for a specific delegate and token. This will set all values except the `nonce` to 0.
    /// @param delegate Delegate whose allowance should be updated.
    /// @param token Token contract address.
    function deleteAllowance(address delegate, address token)
        public
    {
        Allowance memory allowance = getAllowance(msg.sender, delegate, token);
        allowance.amount = 0;
        allowance.spent = 0;
        allowance.resetTimeMin = 0;
        allowance.lastResetMin = 0;
        updateAllowance(msg.sender, delegate, token, allowance);
        emit DeleteAllowance(msg.sender, delegate, token);
    }

    /// @dev Allows to use the allowance to perform a transfer.
    /// @param safe The Safe whose funds should be used.
    /// @param token Token contract address.
    /// @param to Address that should receive the tokens.
    /// @param amount Amount that should be transferred.
    /// @param paymentToken Token that should be used to pay for the execution of the transfer.
    /// @param payment Amount to should be paid for executing the transfer.
    /// @param delegate Delegate whose allowance should be updated.
    /// @param signature Signature generated by the delegate to authorize the transfer.
    function executeAllowanceTransfer(
        GnosisSafe safe,
        address token,
        address payable to,
        uint96 amount,
        address paymentToken,
        uint96 payment,
        address delegate,
        bytes memory signature
    ) public {
        // Get current state
        Allowance memory allowance = getAllowance(address(safe), delegate, token);
        bytes memory transferHashData = generateTransferHashData(address(safe), token, to, amount, paymentToken, payment, allowance.nonce);

        // Update state
        allowance.nonce = allowance.nonce + 1;
        uint96 newSpent = allowance.spent + amount;
        // Check new spent amount and overflow
        require(newSpent > allowance.spent && newSpent <= allowance.amount, "newSpent > allowance.spent && newSpent <= allowance.amount");
        allowance.spent = newSpent;
        if (payment > 0) {
            // Use updated allowance if token and paymentToken are the same
            Allowance memory paymentAllowance = paymentToken == token ? allowance : getAllowance(address(safe), delegate, paymentToken);
            newSpent = paymentAllowance.spent + payment;
            // Check new spent amount and overflow
            require(newSpent > paymentAllowance.spent && newSpent <= paymentAllowance.amount, "newSpent > paymentAllowance.spent && newSpent <= paymentAllowance.amount");
            paymentAllowance.spent = newSpent;
            // Update payment allowance if different from allowance
            if (paymentToken != token) updateAllowance(address(safe), delegate, paymentToken, paymentAllowance);
        }
        updateAllowance(address(safe), delegate, token, allowance);

        // Perform external interactions
        // Check signature
        checkSignature(delegate, signature, transferHashData, safe);

        if (payment > 0) {
            // Transfer payment
            // solium-disable-next-line security/no-tx-origin
            transfer(safe, paymentToken, tx.origin, payment);
            // solium-disable-next-line security/no-tx-origin
            emit PayAllowanceTransfer(address(safe), delegate, paymentToken, tx.origin, payment);
        }
        // Transfer token
        transfer(safe, token, to, amount);
        emit ExecuteAllowanceTransfer(address(safe), delegate, token, to, amount, allowance.nonce - 1);
    }

    /// @dev Returns the chain id used by this contract.
    function getChainId() public pure returns (uint256) {
        uint256 id;
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            id := chainid()
        }
        return id;
    }

    /// @dev Generates the data for the transfer hash (required for signing)
    function generateTransferHashData(
        address safe,
        address token,
        address to,
        uint96 amount,
        address paymentToken,
        uint96 payment,
        uint16 nonce
    ) private view returns (bytes memory) {
        uint256 chainId = getChainId();
        bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, chainId, this));
        bytes32 transferHash = keccak256(
            abi.encode(ALLOWANCE_TRANSFER_TYPEHASH, safe, token, to, amount, paymentToken, payment, nonce)
        );
        return abi.encodePacked(byte(0x19), byte(0x01), domainSeparator, transferHash);
    }

    /// @dev Generates the transfer hash that should be signed to authorize a transfer
    function generateTransferHash(
        address safe,
        address token,
        address to,
        uint96 amount,
        address paymentToken,
        uint96 payment,
        uint16 nonce
    ) public view returns (bytes32) {
        return keccak256(generateTransferHashData(
            safe, token, to, amount, paymentToken, payment, nonce
        ));
    }

    function checkSignature(address expectedDelegate, bytes memory signature, bytes memory transferHashData, GnosisSafe safe) private view {
        address signer = recoverSignature(signature, transferHashData);
        require(
            expectedDelegate == signer && delegates[address(safe)][uint48(signer)].delegate == signer,
            "expectedDelegate == signer && delegates[address(safe)][uint48(signer)].delegate == signer"
        );
    }

    // We use the same format as used for the Safe contract, except that we only support exactly 1 signature and no contract signatures.
    function recoverSignature(bytes memory signature, bytes memory transferHashData) private view returns (address owner) {
        // If there is no signature data msg.sender should be used
        if (signature.length == 0) return msg.sender;
        // Check that the provided signature data is as long as 1 encoded ecsda signature
        require(signature.length == 65, "signatures.length == 65");
        uint8 v;
        bytes32 r;
        bytes32 s;
        (v, r, s) = signatureSplit(signature, 0);
        // If v is 0 then it is a contract signature
        if (v == 0) {
            revert("Contract signatures are not supported by this module");
        } else if (v == 1) {
            // If v is 1 we also use msg.sender, this is so that we are compatible to the GnosisSafe signature scheme
            owner = msg.sender;
        } else if (v > 30) {
            // To support eth_sign and similar we adjust v and hash the transferHashData with the Ethereum message prefix before applying ecrecover
            owner = ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(transferHashData))), v - 4, r, s);
        } else {
            // Use ecrecover with the messageHash for EOA signatures
            owner = ecrecover(keccak256(transferHashData), v, r, s);
        }
        // 0 for the recovered owner indicates that an error happened.
        require(owner != address(0), "owner != address(0)");
    }

    function transfer(GnosisSafe safe, address token, address payable to, uint96 amount) private {
        if (token == address(0)) {
            // solium-disable-next-line security/no-send
            require(safe.execTransactionFromModule(to, amount, "", Enum.Operation.Call), "Could not execute ether transfer");
        } else {
            bytes memory data = abi.encodeWithSignature("transfer(address,uint256)", to, amount);
            require(safe.execTransactionFromModule(token, 0, data, Enum.Operation.Call), "Could not execute token transfer");
        }
    }

    function getTokens(address safe, address delegate) public view returns (address[] memory) {
        return tokens[safe][delegate];
    }

    function getTokenAllowance(address safe, address delegate, address token) public view returns (uint256[5] memory) {
        Allowance memory allowance = getAllowance(safe, delegate, token);
        return [
            uint256(allowance.amount),
            uint256(allowance.spent),
            uint256(allowance.resetTimeMin),
            uint256(allowance.lastResetMin),
            uint256(allowance.nonce)
        ];
    }

    /// @dev Allows to add a delegate.
    /// @param delegate Delegate that should be added.
    function addDelegate(address delegate) public {
        uint48 index = uint48(delegate);
        require(index != uint(0), "index != uint(0)");
        address currentDelegate = delegates[msg.sender][index].delegate;
        if(currentDelegate != address(0)) {
            // We have a collision for the indices of delegates
            require(currentDelegate == delegate, "currentDelegate == delegate");
            // Delegate already exists, nothing to do
            return;
        }
        uint48 startIndex = delegatesStart[msg.sender];
        delegates[msg.sender][index] = Delegate(delegate, 0, startIndex);
        delegates[msg.sender][startIndex].prev = index;
        delegatesStart[msg.sender] = index;
        emit AddDelegate(msg.sender, delegate);
    }

    /// @dev Allows to remove a delegate.
    /// @param delegate Delegate that should be removed.
    /// @param removeAllowances Indicator if allowances should also be removed. This should be set to `true` unless this causes an out of gas, in this case the allowances should be "manually" deleted via `deleteAllowance`.
    function removeDelegate(address delegate, bool removeAllowances) public {
        Delegate memory current = delegates[msg.sender][uint48(delegate)];
        // Delegate doesn't exists, nothing to do
        if(current.delegate == address(0)) return;
        if (removeAllowances) {
            address[] storage delegateTokens = tokens[msg.sender][delegate];
            for (uint256 i = 0; i < delegateTokens.length; i++) {
                address token = delegateTokens[i];
                // Set all allowance params except the nonce to 0
                Allowance memory allowance = getAllowance(msg.sender, delegate, token);
                allowance.amount = 0;
                allowance.spent = 0;
                allowance.resetTimeMin = 0;
                allowance.lastResetMin = 0;
                updateAllowance(msg.sender, delegate, token, allowance);
                emit DeleteAllowance(msg.sender, delegate, token);
            }
        }
        if (current.prev == 0) {
            delegatesStart[msg.sender] = current.next;
        } else {
            delegates[msg.sender][current.prev].next = current.next;
        }
        if (current.next != 0) {
            delegates[msg.sender][current.next].prev = current.prev;
        }
        delete delegates[msg.sender][uint48(delegate)];
        emit RemoveDelegate(msg.sender, delegate);
    }

    function getDelegates(address safe, uint48 start, uint8 pageSize) public view returns (address[] memory results, uint48 next) {
        results = new address[](pageSize);
        uint8 i = 0;
        uint48 initialIndex = (start != 0) ? start : delegatesStart[safe];
        Delegate memory current = delegates[safe][initialIndex];
        while(current.delegate != address(0) && i < pageSize) {
            results[i] = current.delegate;
            i++;
            current = delegates[safe][current.next];
        }
        next = uint48(current.delegate);
        // Set the length of the array the number that has been used.
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            mstore(results, i)
        }
    }
}

File 2 of 3 : Enum.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.8.0;

/// @title Enum - Collection of enums
/// @author Richard Meissner - <[email protected]>
contract Enum {
    enum Operation {
        Call,
        DelegateCall
    }
}

File 3 of 3 : SignatureDecoder.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.8.0;

/// @title SignatureDecoder - Decodes signatures that a encoded as bytes
/// @author Ricardo Guilherme Schmidt (Status Research & Development GmbH)
/// @author Richard Meissner - <[email protected]>
contract SignatureDecoder {
    
    /// @dev Recovers address who signed the message
    /// @param messageHash operation ethereum signed message hash
    /// @param messageSignature message `txHash` signature
    /// @param pos which signature to read
    function recoverKey (
        bytes32 messageHash,
        bytes memory messageSignature,
        uint256 pos
    )
        internal
        pure
        returns (address)
    {
        uint8 v;
        bytes32 r;
        bytes32 s;
        (v, r, s) = signatureSplit(messageSignature, pos);
        return ecrecover(messageHash, v, r, s);
    }

    /// @dev divides bytes signature into `uint8 v, bytes32 r, bytes32 s`.
    /// @notice Make sure to peform a bounds check for @param pos, to avoid out of bounds access on @param signatures
    /// @param pos which signature to read. A prior bounds check of this parameter should be performed, to avoid out of bounds access
    /// @param signatures concatenated rsv signatures
    function signatureSplit(bytes memory signatures, uint256 pos)
        internal
        pure
        returns (uint8 v, bytes32 r, bytes32 s)
    {
        // The signature format is a compact form of:
        //   {bytes32 r}{bytes32 s}{uint8 v}
        // Compact means, uint8 is not padded to 32 bytes.
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            let signaturePos := mul(0x41, pos)
            r := mload(add(signatures, add(signaturePos, 0x20)))
            s := mload(add(signatures, add(signaturePos, 0x40)))
            // Here we are loading the last 32 bytes, including 31 bytes
            // of 's'. There is no 'mload8' to do this.
            //
            // 'byte' is not working due to the Solidity parser, so lets
            // use the second best option, 'and'
            v := and(mload(add(signatures, add(signaturePos, 0x41))), 0xff)
        }
    }
}

Settings
{
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"safe","type":"address"},{"indexed":false,"internalType":"address","name":"delegate","type":"address"}],"name":"AddDelegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"safe","type":"address"},{"indexed":false,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"DeleteAllowance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"safe","type":"address"},{"indexed":false,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint96","name":"value","type":"uint96"},{"indexed":false,"internalType":"uint16","name":"nonce","type":"uint16"}],"name":"ExecuteAllowanceTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"safe","type":"address"},{"indexed":false,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"address","name":"paymentToken","type":"address"},{"indexed":false,"internalType":"address","name":"paymentReceiver","type":"address"},{"indexed":false,"internalType":"uint96","name":"payment","type":"uint96"}],"name":"PayAllowanceTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"safe","type":"address"},{"indexed":false,"internalType":"address","name":"delegate","type":"address"}],"name":"RemoveDelegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"safe","type":"address"},{"indexed":false,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"ResetAllowance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"safe","type":"address"},{"indexed":false,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint96","name":"allowanceAmount","type":"uint96"},{"indexed":false,"internalType":"uint16","name":"resetTime","type":"uint16"}],"name":"SetAllowance","type":"event"},{"inputs":[],"name":"ALLOWANCE_TRANSFER_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"}],"name":"addDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowances","outputs":[{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"uint96","name":"spent","type":"uint96"},{"internalType":"uint16","name":"resetTimeMin","type":"uint16"},{"internalType":"uint32","name":"lastResetMin","type":"uint32"},{"internalType":"uint16","name":"nonce","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint48","name":"","type":"uint48"}],"name":"delegates","outputs":[{"internalType":"address","name":"delegate","type":"address"},{"internalType":"uint48","name":"prev","type":"uint48"},{"internalType":"uint48","name":"next","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegatesStart","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"deleteAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract GnosisSafe","name":"safe","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint96","name":"payment","type":"uint96"},{"internalType":"address","name":"delegate","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"executeAllowanceTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"safe","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"uint96","name":"payment","type":"uint96"},{"internalType":"uint16","name":"nonce","type":"uint16"}],"name":"generateTransferHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"safe","type":"address"},{"internalType":"uint48","name":"start","type":"uint48"},{"internalType":"uint8","name":"pageSize","type":"uint8"}],"name":"getDelegates","outputs":[{"internalType":"address[]","name":"results","type":"address[]"},{"internalType":"uint48","name":"next","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"safe","type":"address"},{"internalType":"address","name":"delegate","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getTokenAllowance","outputs":[{"internalType":"uint256[5]","name":"","type":"uint256[5]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"safe","type":"address"},{"internalType":"address","name":"delegate","type":"address"}],"name":"getTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"},{"internalType":"bool","name":"removeAllowances","type":"bool"}],"name":"removeDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"resetAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint96","name":"allowanceAmount","type":"uint96"},{"internalType":"uint16","name":"resetTimeMin","type":"uint16"},{"internalType":"uint32","name":"resetBaseMin","type":"uint32"}],"name":"setAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50613a9b806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c8063b713c9d4116100ad578063dd43a79f11610071578063dd43a79f1461093c578063e71bdf411461098c578063eb37abe0146109d0578063f56e81fa14610a97578063ffa1ad7414610b2f57610121565b8063b713c9d4146105cc578063beaeb388146106aa578063c19bf50e14610744578063ce60c692146107a8578063d626e0431461084657610121565b80634515641a116100f45780634515641a146101e0578063885133e31461036c5780638d0e8e1d146103d057806394b31fbd14610489578063a3f4df7e1461054957610121565b80631db61b5414610126578063310a3bb1146101445780633408e470146101a457806343abf5fe146101c2575b600080fd5b61012e610bb2565b6040518082815260200191505060405180910390f35b6101866004803603602081101561015a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bd9565b604051808265ffffffffffff16815260200191505060405180910390f35b6101ac610bfe565b6040518082815260200191505060405180910390f35b6101ca610c0b565b6040518082815260200191505060405180910390f35b61036a60048036036101008110156101f757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356bffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356bffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156102e457600080fd5b8201836020820111156102f657600080fd5b8035906020019184600183028401116401000000008311171561031857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610c32565b005b6103ce6004803603604081101561038257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110a1565b005b610432600480360360408110156103e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111c9565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561047557808201518184015260208101905061045a565b505050509050019250505060405180910390f35b61050b6004803603606081101561049f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112d4565b6040518082600560200280838360005b8381101561053657808201518184015260208101905061051b565b5050505090500191505060405180910390f35b610551611360565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610591578082015181840152602081019050610576565b50505050905090810190601f1680156105be5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61064e600480360360608110156105e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611399565b60405180866bffffffffffffffffffffffff168152602001856bffffffffffffffffffffffff1681526020018461ffff1681526020018363ffffffff1681526020018261ffff1681526020019550505050505060405180910390f35b610742600480360360a08110156106c057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356bffffffffffffffffffffffff169060200190929190803561ffff169060200190929190803563ffffffff169060200190929190505050611445565b005b6107a66004803603604081101561075a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118fe565b005b6107fc600480360360408110156107be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803565ffffffffffff1690602001909291905050506119cf565b604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018365ffffffffffff1681526020018265ffffffffffff168152602001935050505060405180910390f35b610926600480360360e081101561085c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356bffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356bffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050611a4a565b6040518082815260200191505060405180910390f35b61098a6004803603604081101561095257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611a6f565b005b6109ce600480360360208110156109a257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120ae565b005b610a31600480360360608110156109e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803565ffffffffffff169060200190929190803560ff169060200190929190505050612581565b60405180806020018365ffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b83811015610a82578082015181840152602081019050610a67565b50505050905001935050505060405180910390f35b610b0360048036036060811015610aad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061293d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b37612998565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b77578082015181840152602081019050610b5c565b50505050905090810190601f168015610ba45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b7f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b81565b60026020528060005260406000206000915054906101000a900465ffffffffffff1681565b6000804690508091505090565b7f80b006280932094e7cc965863eb5118dc07e5d272c6670c4a7c87299e04fceeb60001b81565b610c3a613858565b610c4589848a6129d1565b90506060610c5c8a8a8a8a8a8a8860800151612c2f565b90506001826080015101826080019061ffff16908161ffff1681525050600087836020015101905082602001516bffffffffffffffffffffffff16816bffffffffffffffffffffffff16118015610cd3575082600001516bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611155b610d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806139b0603a913960400191505060405180910390fd5b8083602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff16815250506000866bffffffffffffffffffffffff161115610ecd57610d6f613858565b8a73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610db257610dad8c878a6129d1565b610db4565b835b905086816020015101915080602001516bffffffffffffffffffffffff16826bffffffffffffffffffffffff16118015610e0e575080600001516bffffffffffffffffffffffff16826bffffffffffffffffffffffff1611155b610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526048815260200180613a1e6048913960600191505060405180910390fd5b8181602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff16815250508a73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610ecb57610eca8c878a84612e43565b5b505b610ed98b868c86612e43565b610ee58585848e612fe0565b6000866bffffffffffffffffffffffff161115610fbf57610f088b883289613133565b8a73ffffffffffffffffffffffffffffffffffffffff167fad71d7a737da41277b5ade17fd65b00671e3ab35f23778a98c8d925dc66e3d9d8689328a604051808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815260200194505050505060405180910390a25b610fcb8b8b8b8b613133565b8a73ffffffffffffffffffffffffffffffffffffffff167fa11cca2c2027e28ab0046aab4d4040f59d8b06e819ccd974c1e53e86aa814c19868c8c8c6001896080015103604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff1681526020018261ffff1681526020019550505050505060405180910390a25050505050505050505050565b6110a9613858565b6110b43384846129d1565b9050600081600001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff1681525050600081602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff16815250506000816040019061ffff16908161ffff16815250506000816060019063ffffffff16908163ffffffff168152505061114233848484612e43565b3373ffffffffffffffffffffffffffffffffffffffff167f9a9bc79dd7e42545ba12d5659704d73a9364d4a18e0a98ca1c992a3bc999d2718484604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a2505050565b6060600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156112c757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161127d575b5050505050905092915050565b6112dc6138b1565b6112e4613858565b6112ef8585856129d1565b90506040518060a0016040528082600001516bffffffffffffffffffffffff16815260200182602001516bffffffffffffffffffffffff168152602001826040015161ffff168152602001826060015163ffffffff168152602001826080015161ffff168152509150509392505050565b6040518060400160405280601081526020017f416c6c6f77616e6365204d6f64756c650000000000000000000000000000000081525081565b600060205282600052604060002060205281600052604060002060205280600052604060002060009250925050508060000160009054906101000a90046bffffffffffffffffffffffff169080600001600c9054906101000a90046bffffffffffffffffffffffff16908060000160189054906101000a900461ffff169080600001601a9054906101000a900463ffffffff169080600001601e9054906101000a900461ffff16905085565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f64656c656761746520213d20616464726573732830290000000000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008765ffffffffffff1665ffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061391b603c913960400191505060405180910390fd5b6115f7613858565b6116023387876129d1565b90506000816080015161ffff161415611708576001816080019061ffff16908161ffff1681525050600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020859080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000603c428161171457fe5b04905060008363ffffffff1611156117dc578063ffffffff168363ffffffff1611156117a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f7265736574426173654d696e203c3d2063757272656e744d696e00000000000081525060200191505060405180910390fd5b8361ffff1683820363ffffffff16816117bd57fe5b068103826060019063ffffffff16908163ffffffff1681525050611809565b6000826060015163ffffffff1614156118085780826060019063ffffffff16908163ffffffff16815250505b5b83826040019061ffff16908161ffff16815250508482600001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff168152505061185133888885612e43565b3373ffffffffffffffffffffffffffffffffffffffff167f49caa04c5e1e168069c09df7f88c07ca87be980b0bf4570ab77fe9aae3ca7eba88888888604051808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff1681526020018261ffff16815260200194505050505060405180910390a250505050505050565b611906613858565b6119113384846129d1565b9050600081602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff168152505061194833848484612e43565b3373ffffffffffffffffffffffffffffffffffffffff167fa39af38687a2c1e52c987a84d807fd238b83b08a9da657f184a72fcd2b71360c8484604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a2505050565b6003602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900465ffffffffffff169080600001601a9054906101000a900465ffffffffffff16905083565b6000611a5b88888888888888612c2f565b805190602001209050979650505050505050565b611a776138d3565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008465ffffffffffff1665ffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff16815260200160008201601a9054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415611bd157506120aa565b8115611dd6576000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b8180549050811015611dd3576000828281548110611c7457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611ca9613858565b611cb43388846129d1565b9050600081600001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff1681525050600081602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff16815250506000816040019061ffff16908161ffff16815250506000816060019063ffffffff16908163ffffffff1681525050611d4233888484612e43565b3373ffffffffffffffffffffffffffffffffffffffff167f9a9bc79dd7e42545ba12d5659704d73a9364d4a18e0a98ca1c992a3bc999d2718884604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a250508080600101915050611c5a565b50505b6000816020015165ffffffffffff161415611e56578060400151600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548165ffffffffffff021916908365ffffffffffff160217905550611ee5565b8060400151600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000836020015165ffffffffffff1665ffffffffffff168152602001908152602001600020600001601a6101000a81548165ffffffffffff021916908365ffffffffffff1602179055505b6000816040015165ffffffffffff1614611f88578060200151600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000836040015165ffffffffffff1665ffffffffffff16815260200190815260200160002060000160146101000a81548165ffffffffffff021916908365ffffffffffff1602179055505b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008465ffffffffffff1665ffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549065ffffffffffff021916905560008201601a6101000a81549065ffffffffffff021916905550503373ffffffffffffffffffffffffffffffffffffffff167fdccc2d936ded24d2153d2760581a7f0dcb23ec71190c9726b3584cdd700214d484604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a2505b5050565b600081905060008165ffffffffffff161415612132576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f696e64657820213d2075696e742830290000000000000000000000000000000081525060200191505060405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008365ffffffffffff1665ffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612296578273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461228f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f63757272656e7444656c6567617465203d3d2064656c6567617465000000000081525060200191505060405180910390fd5b505061257e565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900465ffffffffffff16905060405180606001604052808573ffffffffffffffffffffffffffffffffffffffff168152602001600065ffffffffffff1681526020018265ffffffffffff16815250600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008565ffffffffffff1665ffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001601a6101000a81548165ffffffffffff021916908365ffffffffffff16021790555090505082600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008365ffffffffffff1665ffffffffffff16815260200190815260200160002060000160146101000a81548165ffffffffffff021916908365ffffffffffff16021790555082600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548165ffffffffffff021916908365ffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167f2fd5b26f00131bd8ca0fc556207292b85a6bec241341df82724333227458e63085604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050505b50565b606060008260ff1667ffffffffffffffff8111801561259f57600080fd5b506040519080825280602002602001820160405280156125ce5781602001602082028036833780820191505090505b509150600080808665ffffffffffff16141561263b57600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900465ffffffffffff1661263d565b855b90506126476138d3565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008365ffffffffffff1665ffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff16815260200160008201601a9054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff168152505090505b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16141580156127a957508560ff168360ff16105b15612928578060000151858460ff16815181106127c257fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508280600101935050600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000826040015165ffffffffffff1665ffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff16815260200160008201601a9054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff16815250509050612763565b80600001519350828552505050935093915050565b6001602052826000526040600020602052816000526040600020818154811061296557600080fd5b90600052602060002001600092509250509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b6129d9613858565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815260200160008201600c9054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681526020016000820160189054906101000a900461ffff1661ffff1661ffff16815260200160008201601a9054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160008201601e9054906101000a900461ffff1661ffff1661ffff168152505090506000603c4281612b8c57fe5b0490506000826040015161ffff16118015612bc15750816040015161ffff16810363ffffffff16826060015163ffffffff1611155b15612c2757600082602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff1681525050816040015161ffff168260600151820363ffffffff1681612c0c57fe5b068103826060019063ffffffff16908163ffffffff16815250505b509392505050565b60606000612c3b610bfe565b905060007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b8230604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905060007f80b006280932094e7cc965863eb5118dc07e5d272c6670c4a7c87299e04fceeb60001b8b8b8b8b8b8b8b604051602001808981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001856bffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff1681526020018261ffff16815260200198505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b838360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529350505050979650505050505050565b806000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060408201518160000160186101000a81548161ffff021916908361ffff160217905550606082015181600001601a6101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001601e6101000a81548161ffff021916908361ffff16021790555090505050505050565b6000612fec8484613527565b90508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480156130d757508073ffffffffffffffffffffffffffffffffffffffff16600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008365ffffffffffff1665ffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61312c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260598152602001806139576059913960600191505060405180910390fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132c1578373ffffffffffffffffffffffffffffffffffffffff1663468721a7838360006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff168152602001806020018360018111156131db57fe5b8152602001828103825260008152602001602001945050505050602060405180830381600087803b15801561320f57600080fd5b505af1158015613223573d6000803e3d6000fd5b505050506040513d602081101561323957600080fd5b81019080805190602001909291905050506132bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f756c64206e6f742065786563757465206574686572207472616e7366657281525060200191505060405180910390fd5b613521565b60608282604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090508473ffffffffffffffffffffffffffffffffffffffff1663468721a78560008460006040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018360018111156133e657fe5b8152602001828103825284818151815260200191508051906020019080838360005b83811015613423578082015181840152602081019050613408565b50505050905090810190601f1680156134505780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561347257600080fd5b505af1158015613486573d6000803e3d6000fd5b505050506040513d602081101561349c57600080fd5b810190808051906020019092919050505061351f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f756c64206e6f74206578656375746520746f6b656e207472616e7366657281525060200191505060405180910390fd5b505b50505050565b6000808351141561353a57339050613823565b60418351146135b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f7369676e6174757265732e6c656e677468203d3d20363500000000000000000081525060200191505060405180910390fd5b60008060006135c1866000613829565b80935081945082955050505060008360ff16141561362a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806139ea6034913960400191505060405180910390fd5b60018360ff16141561363e5733935061377c565b601e8360ff16111561370d576001858051906020012060405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048503848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156136fc573d6000803e3d6000fd5b50505060206040510351935061377b565b6001858051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561376e573d6000803e3d6000fd5b5050506020604051035193505b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561381f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6f776e657220213d20616464726573732830290000000000000000000000000081525060200191505060405180910390fd5b5050505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b6040518060a0016040528060006bffffffffffffffffffffffff16815260200160006bffffffffffffffffffffffff168152602001600061ffff168152602001600063ffffffff168152602001600061ffff1681525090565b6040518060a00160405280600590602082028036833780820191505090505090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600065ffffffffffff168152602001600065ffffffffffff168152509056fe64656c6567617465735b6d73672e73656e6465725d5b75696e7434382864656c6567617465295d2e64656c6567617465203d3d2064656c6567617465657870656374656444656c6567617465203d3d207369676e65722026262064656c6567617465735b616464726573732873616665295d5b75696e743438287369676e6572295d2e64656c6567617465203d3d207369676e65726e65775370656e74203e20616c6c6f77616e63652e7370656e74202626206e65775370656e74203c3d20616c6c6f77616e63652e616d6f756e74436f6e7472616374207369676e61747572657320617265206e6f7420737570706f727465642062792074686973206d6f64756c656e65775370656e74203e207061796d656e74416c6c6f77616e63652e7370656e74202626206e65775370656e74203c3d207061796d656e74416c6c6f77616e63652e616d6f756e74a264697066735822122083d9f6894d7a4d179c3b27cf9fe7af6ef17e6bfc147016c85c378cea015db76964736f6c63430007040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101215760003560e01c8063b713c9d4116100ad578063dd43a79f11610071578063dd43a79f1461093c578063e71bdf411461098c578063eb37abe0146109d0578063f56e81fa14610a97578063ffa1ad7414610b2f57610121565b8063b713c9d4146105cc578063beaeb388146106aa578063c19bf50e14610744578063ce60c692146107a8578063d626e0431461084657610121565b80634515641a116100f45780634515641a146101e0578063885133e31461036c5780638d0e8e1d146103d057806394b31fbd14610489578063a3f4df7e1461054957610121565b80631db61b5414610126578063310a3bb1146101445780633408e470146101a457806343abf5fe146101c2575b600080fd5b61012e610bb2565b6040518082815260200191505060405180910390f35b6101866004803603602081101561015a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bd9565b604051808265ffffffffffff16815260200191505060405180910390f35b6101ac610bfe565b6040518082815260200191505060405180910390f35b6101ca610c0b565b6040518082815260200191505060405180910390f35b61036a60048036036101008110156101f757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356bffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356bffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156102e457600080fd5b8201836020820111156102f657600080fd5b8035906020019184600183028401116401000000008311171561031857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610c32565b005b6103ce6004803603604081101561038257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110a1565b005b610432600480360360408110156103e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506111c9565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561047557808201518184015260208101905061045a565b505050509050019250505060405180910390f35b61050b6004803603606081101561049f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112d4565b6040518082600560200280838360005b8381101561053657808201518184015260208101905061051b565b5050505090500191505060405180910390f35b610551611360565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610591578082015181840152602081019050610576565b50505050905090810190601f1680156105be5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61064e600480360360608110156105e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611399565b60405180866bffffffffffffffffffffffff168152602001856bffffffffffffffffffffffff1681526020018461ffff1681526020018363ffffffff1681526020018261ffff1681526020019550505050505060405180910390f35b610742600480360360a08110156106c057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356bffffffffffffffffffffffff169060200190929190803561ffff169060200190929190803563ffffffff169060200190929190505050611445565b005b6107a66004803603604081101561075a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118fe565b005b6107fc600480360360408110156107be57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803565ffffffffffff1690602001909291905050506119cf565b604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018365ffffffffffff1681526020018265ffffffffffff168152602001935050505060405180910390f35b610926600480360360e081101561085c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356bffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080356bffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050611a4a565b6040518082815260200191505060405180910390f35b61098a6004803603604081101561095257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611a6f565b005b6109ce600480360360208110156109a257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120ae565b005b610a31600480360360608110156109e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803565ffffffffffff169060200190929190803560ff169060200190929190505050612581565b60405180806020018365ffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b83811015610a82578082015181840152602081019050610a67565b50505050905001935050505060405180910390f35b610b0360048036036060811015610aad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061293d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b37612998565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b77578082015181840152602081019050610b5c565b50505050905090810190601f168015610ba45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b7f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b81565b60026020528060005260406000206000915054906101000a900465ffffffffffff1681565b6000804690508091505090565b7f80b006280932094e7cc965863eb5118dc07e5d272c6670c4a7c87299e04fceeb60001b81565b610c3a613858565b610c4589848a6129d1565b90506060610c5c8a8a8a8a8a8a8860800151612c2f565b90506001826080015101826080019061ffff16908161ffff1681525050600087836020015101905082602001516bffffffffffffffffffffffff16816bffffffffffffffffffffffff16118015610cd3575082600001516bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611155b610d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806139b0603a913960400191505060405180910390fd5b8083602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff16815250506000866bffffffffffffffffffffffff161115610ecd57610d6f613858565b8a73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610db257610dad8c878a6129d1565b610db4565b835b905086816020015101915080602001516bffffffffffffffffffffffff16826bffffffffffffffffffffffff16118015610e0e575080600001516bffffffffffffffffffffffff16826bffffffffffffffffffffffff1611155b610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526048815260200180613a1e6048913960600191505060405180910390fd5b8181602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff16815250508a73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610ecb57610eca8c878a84612e43565b5b505b610ed98b868c86612e43565b610ee58585848e612fe0565b6000866bffffffffffffffffffffffff161115610fbf57610f088b883289613133565b8a73ffffffffffffffffffffffffffffffffffffffff167fad71d7a737da41277b5ade17fd65b00671e3ab35f23778a98c8d925dc66e3d9d8689328a604051808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815260200194505050505060405180910390a25b610fcb8b8b8b8b613133565b8a73ffffffffffffffffffffffffffffffffffffffff167fa11cca2c2027e28ab0046aab4d4040f59d8b06e819ccd974c1e53e86aa814c19868c8c8c6001896080015103604051808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff1681526020018261ffff1681526020019550505050505060405180910390a25050505050505050505050565b6110a9613858565b6110b43384846129d1565b9050600081600001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff1681525050600081602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff16815250506000816040019061ffff16908161ffff16815250506000816060019063ffffffff16908163ffffffff168152505061114233848484612e43565b3373ffffffffffffffffffffffffffffffffffffffff167f9a9bc79dd7e42545ba12d5659704d73a9364d4a18e0a98ca1c992a3bc999d2718484604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a2505050565b6060600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156112c757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161127d575b5050505050905092915050565b6112dc6138b1565b6112e4613858565b6112ef8585856129d1565b90506040518060a0016040528082600001516bffffffffffffffffffffffff16815260200182602001516bffffffffffffffffffffffff168152602001826040015161ffff168152602001826060015163ffffffff168152602001826080015161ffff168152509150509392505050565b6040518060400160405280601081526020017f416c6c6f77616e6365204d6f64756c650000000000000000000000000000000081525081565b600060205282600052604060002060205281600052604060002060205280600052604060002060009250925050508060000160009054906101000a90046bffffffffffffffffffffffff169080600001600c9054906101000a90046bffffffffffffffffffffffff16908060000160189054906101000a900461ffff169080600001601a9054906101000a900463ffffffff169080600001601e9054906101000a900461ffff16905085565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156114e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f64656c656761746520213d20616464726573732830290000000000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008765ffffffffffff1665ffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061391b603c913960400191505060405180910390fd5b6115f7613858565b6116023387876129d1565b90506000816080015161ffff161415611708576001816080019061ffff16908161ffff1681525050600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020859080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000603c428161171457fe5b04905060008363ffffffff1611156117dc578063ffffffff168363ffffffff1611156117a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f7265736574426173654d696e203c3d2063757272656e744d696e00000000000081525060200191505060405180910390fd5b8361ffff1683820363ffffffff16816117bd57fe5b068103826060019063ffffffff16908163ffffffff1681525050611809565b6000826060015163ffffffff1614156118085780826060019063ffffffff16908163ffffffff16815250505b5b83826040019061ffff16908161ffff16815250508482600001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff168152505061185133888885612e43565b3373ffffffffffffffffffffffffffffffffffffffff167f49caa04c5e1e168069c09df7f88c07ca87be980b0bf4570ab77fe9aae3ca7eba88888888604051808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff1681526020018261ffff16815260200194505050505060405180910390a250505050505050565b611906613858565b6119113384846129d1565b9050600081602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff168152505061194833848484612e43565b3373ffffffffffffffffffffffffffffffffffffffff167fa39af38687a2c1e52c987a84d807fd238b83b08a9da657f184a72fcd2b71360c8484604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a2505050565b6003602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900465ffffffffffff169080600001601a9054906101000a900465ffffffffffff16905083565b6000611a5b88888888888888612c2f565b805190602001209050979650505050505050565b611a776138d3565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008465ffffffffffff1665ffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff16815260200160008201601a9054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415611bd157506120aa565b8115611dd6576000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b8180549050811015611dd3576000828281548110611c7457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050611ca9613858565b611cb43388846129d1565b9050600081600001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff1681525050600081602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff16815250506000816040019061ffff16908161ffff16815250506000816060019063ffffffff16908163ffffffff1681525050611d4233888484612e43565b3373ffffffffffffffffffffffffffffffffffffffff167f9a9bc79dd7e42545ba12d5659704d73a9364d4a18e0a98ca1c992a3bc999d2718884604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a250508080600101915050611c5a565b50505b6000816020015165ffffffffffff161415611e56578060400151600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548165ffffffffffff021916908365ffffffffffff160217905550611ee5565b8060400151600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000836020015165ffffffffffff1665ffffffffffff168152602001908152602001600020600001601a6101000a81548165ffffffffffff021916908365ffffffffffff1602179055505b6000816040015165ffffffffffff1614611f88578060200151600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000836040015165ffffffffffff1665ffffffffffff16815260200190815260200160002060000160146101000a81548165ffffffffffff021916908365ffffffffffff1602179055505b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008465ffffffffffff1665ffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549065ffffffffffff021916905560008201601a6101000a81549065ffffffffffff021916905550503373ffffffffffffffffffffffffffffffffffffffff167fdccc2d936ded24d2153d2760581a7f0dcb23ec71190c9726b3584cdd700214d484604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a2505b5050565b600081905060008165ffffffffffff161415612132576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f696e64657820213d2075696e742830290000000000000000000000000000000081525060200191505060405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008365ffffffffffff1665ffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612296578273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461228f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f63757272656e7444656c6567617465203d3d2064656c6567617465000000000081525060200191505060405180910390fd5b505061257e565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900465ffffffffffff16905060405180606001604052808573ffffffffffffffffffffffffffffffffffffffff168152602001600065ffffffffffff1681526020018265ffffffffffff16815250600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008565ffffffffffff1665ffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001601a6101000a81548165ffffffffffff021916908365ffffffffffff16021790555090505082600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008365ffffffffffff1665ffffffffffff16815260200190815260200160002060000160146101000a81548165ffffffffffff021916908365ffffffffffff16021790555082600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548165ffffffffffff021916908365ffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167f2fd5b26f00131bd8ca0fc556207292b85a6bec241341df82724333227458e63085604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050505b50565b606060008260ff1667ffffffffffffffff8111801561259f57600080fd5b506040519080825280602002602001820160405280156125ce5781602001602082028036833780820191505090505b509150600080808665ffffffffffff16141561263b57600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900465ffffffffffff1661263d565b855b90506126476138d3565b600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008365ffffffffffff1665ffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff16815260200160008201601a9054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff168152505090505b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16141580156127a957508560ff168360ff16105b15612928578060000151858460ff16815181106127c257fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508280600101935050600360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000826040015165ffffffffffff1665ffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff16815260200160008201601a9054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff16815250509050612763565b80600001519350828552505050935093915050565b6001602052826000526040600020602052816000526040600020818154811061296557600080fd5b90600052602060002001600092509250509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040518060400160405280600581526020017f302e312e3000000000000000000000000000000000000000000000000000000081525081565b6129d9613858565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815260200160008201600c9054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681526020016000820160189054906101000a900461ffff1661ffff1661ffff16815260200160008201601a9054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160008201601e9054906101000a900461ffff1661ffff1661ffff168152505090506000603c4281612b8c57fe5b0490506000826040015161ffff16118015612bc15750816040015161ffff16810363ffffffff16826060015163ffffffff1611155b15612c2757600082602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff1681525050816040015161ffff168260600151820363ffffffff1681612c0c57fe5b068103826060019063ffffffff16908163ffffffff16815250505b509392505050565b60606000612c3b610bfe565b905060007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921860001b8230604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405160208183030381529060405280519060200120905060007f80b006280932094e7cc965863eb5118dc07e5d272c6670c4a7c87299e04fceeb60001b8b8b8b8b8b8b8b604051602001808981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001856bffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff1681526020018261ffff16815260200198505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b838360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529350505050979650505050505050565b806000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060408201518160000160186101000a81548161ffff021916908361ffff160217905550606082015181600001601a6101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001601e6101000a81548161ffff021916908361ffff16021790555090505050505050565b6000612fec8484613527565b90508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480156130d757508073ffffffffffffffffffffffffffffffffffffffff16600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008365ffffffffffff1665ffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61312c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260598152602001806139576059913960600191505060405180910390fd5b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132c1578373ffffffffffffffffffffffffffffffffffffffff1663468721a7838360006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff168152602001806020018360018111156131db57fe5b8152602001828103825260008152602001602001945050505050602060405180830381600087803b15801561320f57600080fd5b505af1158015613223573d6000803e3d6000fd5b505050506040513d602081101561323957600080fd5b81019080805190602001909291905050506132bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f756c64206e6f742065786563757465206574686572207472616e7366657281525060200191505060405180910390fd5b613521565b60608282604051602401808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090508473ffffffffffffffffffffffffffffffffffffffff1663468721a78560008460006040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018360018111156133e657fe5b8152602001828103825284818151815260200191508051906020019080838360005b83811015613423578082015181840152602081019050613408565b50505050905090810190601f1680156134505780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561347257600080fd5b505af1158015613486573d6000803e3d6000fd5b505050506040513d602081101561349c57600080fd5b810190808051906020019092919050505061351f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f756c64206e6f74206578656375746520746f6b656e207472616e7366657281525060200191505060405180910390fd5b505b50505050565b6000808351141561353a57339050613823565b60418351146135b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f7369676e6174757265732e6c656e677468203d3d20363500000000000000000081525060200191505060405180910390fd5b60008060006135c1866000613829565b80935081945082955050505060008360ff16141561362a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806139ea6034913960400191505060405180910390fd5b60018360ff16141561363e5733935061377c565b601e8360ff16111561370d576001858051906020012060405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048503848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156136fc573d6000803e3d6000fd5b50505060206040510351935061377b565b6001858051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561376e573d6000803e3d6000fd5b5050506020604051035193505b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561381f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6f776e657220213d20616464726573732830290000000000000000000000000081525060200191505060405180910390fd5b5050505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b6040518060a0016040528060006bffffffffffffffffffffffff16815260200160006bffffffffffffffffffffffff168152602001600061ffff168152602001600063ffffffff168152602001600061ffff1681525090565b6040518060a00160405280600590602082028036833780820191505090505090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600065ffffffffffff168152602001600065ffffffffffff168152509056fe64656c6567617465735b6d73672e73656e6465725d5b75696e7434382864656c6567617465295d2e64656c6567617465203d3d2064656c6567617465657870656374656444656c6567617465203d3d207369676e65722026262064656c6567617465735b616464726573732873616665295d5b75696e743438287369676e6572295d2e64656c6567617465203d3d207369676e65726e65775370656e74203e20616c6c6f77616e63652e7370656e74202626206e65775370656e74203c3d20616c6c6f77616e63652e616d6f756e74436f6e7472616374207369676e61747572657320617265206e6f7420737570706f727465642062792074686973206d6f64756c656e65775370656e74203e207061796d656e74416c6c6f77616e63652e7370656e74202626206e65775370656e74203c3d207061796d656e74416c6c6f77616e63652e616d6f756e74a264697066735822122083d9f6894d7a4d179c3b27cf9fe7af6ef17e6bfc147016c85c378cea015db76964736f6c63430007040033

Deployed Bytecode Sourcemap

648:17265:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;801:118;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1592:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;9986:219;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1023:120;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7570:2353;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6536:419;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14011:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14153:427;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;700:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1337:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3430:1390;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5985:303;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1690:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11015:366;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15781:1365;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14680:773;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17152:759;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1465:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;754:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;801:118;853:66;801:118;;;:::o;1592:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;9986:219::-;10029:7;10048:10;10161:9;10155:15;;10196:2;10189:9;;;9986:219;:::o;1023:120::-;1077:66;1023:120;;;:::o;7570:2353::-;7867:26;;:::i;:::-;7896:44;7917:4;7924:8;7934:5;7896:12;:44::i;:::-;7867:73;;7950:29;7982:98;8015:4;8022:5;8029:2;8033:6;8041:12;8055:7;8064:9;:15;;;7982:24;:98::i;:::-;7950:130;;8151:1;8133:9;:15;;;:19;8115:9;:15;;:37;;;;;;;;;;;8162:15;8198:6;8180:9;:15;;;:24;8162:42;;8280:9;:15;;;8269:26;;:8;:26;;;:58;;;;;8311:9;:16;;;8299:28;;:8;:28;;;;8269:58;8261:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8418:8;8400:9;:15;;:26;;;;;;;;;;;8450:1;8440:7;:11;;;8436:748;;;8543:33;;:::i;:::-;8595:5;8579:21;;:12;:21;;;:87;;8615:51;8636:4;8643:8;8653:12;8615;:51::i;:::-;8579:87;;;8603:9;8579:87;8543:123;;8716:7;8691:16;:22;;;:32;8680:43;;8807:16;:22;;;8796:33;;:8;:33;;;:72;;;;;8845:16;:23;;;8833:35;;:8;:35;;;;8796:72;8788:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8984:8;8959:16;:22;;:33;;;;;;;;;;;9094:5;9078:21;;:12;:21;;;9074:99;;9101:72;9125:4;9132:8;9142:12;9156:16;9101:15;:72::i;:::-;9074:99;8436:748;;9193:58;9217:4;9224:8;9234:5;9241:9;9193:15;:58::i;:::-;9330:59;9345:8;9355:9;9366:16;9384:4;9330:14;:59::i;:::-;9414:1;9404:7;:11;;;9400:344;;;9525:48;9534:4;9540:12;9554:9;9565:7;9525:8;:48::i;:::-;9683:4;9654:79;;;9690:8;9700:12;9714:9;9725:7;9654:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9400:344;9779:33;9788:4;9794:5;9801:2;9805:6;9779:8;:33::i;:::-;9860:4;9827:89;;;9867:8;9877:5;9884:2;9888:6;9914:1;9896:9;:15;;;:19;9827:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7570:2353;;;;;;;;;;;:::o;6536:419::-;6623:26;;:::i;:::-;6652:41;6665:10;6677:8;6687:5;6652:12;:41::i;:::-;6623:70;;6722:1;6703:9;:16;;:20;;;;;;;;;;;6751:1;6733:9;:15;;:19;;;;;;;;;;;6787:1;6762:9;:22;;:26;;;;;;;;;;;6823:1;6798:9;:22;;:26;;;;;;;;;;;6834:55;6850:10;6862:8;6872:5;6879:9;6834:15;:55::i;:::-;6920:10;6904:44;;;6932:8;6942:5;6904:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;6536:419;;;:::o;14011:136::-;14083:16;14118:6;:12;14125:4;14118:12;;;;;;;;;;;;;;;:22;14131:8;14118:22;;;;;;;;;;;;;;;14111:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14011:136;;;;:::o;14153:427::-;14248:17;;:::i;:::-;14277:26;;:::i;:::-;14306:35;14319:4;14325:8;14335:5;14306:12;:35::i;:::-;14277:64;;14351:222;;;;;;;;14380:9;:16;;;14372:25;;14351:222;;;;14419:9;:15;;;14411:24;;14351:222;;;;14457:9;:22;;;14449:31;;14351:222;;;;14502:9;:22;;;14494:31;;14351:222;;;;14547:9;:15;;;14539:24;;14351:222;;;;;;14153:427;;;;;:::o;700:48::-;;;;;;;;;;;;;;;;;;;:::o;1337:88::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3430:1390::-;3608:1;3588:22;;:8;:22;;;;3580:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3707:8;3655:60;;:9;:21;3665:10;3655:21;;;;;;;;;;;;;;;:39;3684:8;3655:39;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:60;;;3647:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3790:26;;:::i;:::-;3819:41;3832:10;3844:8;3854:5;3819:12;:41::i;:::-;3790:70;;3893:1;3874:9;:15;;;:20;;;3870:210;;;4014:1;3996:9;:15;;:19;;;;;;;;;;;4029:6;:18;4036:10;4029:18;;;;;;;;;;;;;;;:28;4048:8;4029:28;;;;;;;;;;;;;;;4063:5;4029:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3870:210;4206:17;4251:2;4233:15;:20;;;;;;4206:48;;4283:1;4268:12;:16;;;4264:307;;;4324:10;4308:26;;:12;:26;;;;4300:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4448:12;4418:42;;4432:12;4419:10;:25;4418:42;;;;;;;;4404:10;:57;4379:9;:22;;:82;;;;;;;;;;;4264:307;;;4508:1;4482:9;:22;;;:27;;;4478:93;;;4550:10;4525:9;:22;;:35;;;;;;;;;;;4478:93;4264:307;4605:12;4580:9;:22;;:37;;;;;;;;;;;4646:15;4627:9;:16;;:34;;;;;;;;;;;4671:55;4687:10;4699:8;4709:5;4716:9;4671:15;:55::i;:::-;4754:10;4741:72;;;4766:8;4776:5;4783:15;4800:12;4741:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3430:1390;;;;;;;:::o;5985:303::-;6059:26;;:::i;:::-;6088:41;6101:10;6113:8;6123:5;6088:12;:41::i;:::-;6059:70;;6157:1;6139:9;:15;;:19;;;;;;;;;;;6168:55;6184:10;6196:8;6206:5;6213:9;6168:15;:55::i;:::-;6253:10;6238:43;;;6265:8;6275:5;6238:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;5985:303;;;:::o;1690:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11015:366::-;11236:7;11272:101;11310:4;11316:5;11323:2;11327:6;11335:12;11349:7;11358:5;11272:24;:101::i;:::-;11262:112;;;;;;11255:119;;11015:366;;;;;;;;;:::o;15781:1365::-;15863:23;;:::i;:::-;15889:9;:21;15899:10;15889:21;;;;;;;;;;;;;;;:39;15918:8;15889:39;;;;;;;;;;;;;;;15863:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16019:1;15991:30;;:7;:16;;;:30;;;15988:42;;;16023:7;;;15988:42;16043:16;16039:698;;;16075:32;16110:6;:18;16117:10;16110:18;;;;;;;;;;;;;;;:28;16129:8;16110:28;;;;;;;;;;;;;;;16075:63;;16157:9;16152:575;16176:14;:21;;;;16172:1;:25;16152:575;;;16222:13;16238:14;16253:1;16238:17;;;;;;;;;;;;;;;;;;;;;;;;;16222:33;;16339:26;;:::i;:::-;16368:41;16381:10;16393:8;16403:5;16368:12;:41::i;:::-;16339:70;;16446:1;16427:9;:16;;:20;;;;;;;;;;;16483:1;16465:9;:15;;:19;;;;;;;;;;;16527:1;16502:9;:22;;:26;;;;;;;;;;;16571:1;16546:9;:22;;:26;;;;;;;;;;;16590:55;16606:10;16618:8;16628:5;16635:9;16590:15;:55::i;:::-;16684:10;16668:44;;;16696:8;16706:5;16668:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;16152:575;;16199:3;;;;;;;16152:575;;;;16039:698;;16766:1;16750:7;:12;;;:17;;;16746:175;;;16812:7;:12;;;16783:14;:26;16798:10;16783:26;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;16746:175;;;16898:7;:12;;;16855:9;:21;16865:10;16855:21;;;;;;;;;;;;;;;:35;16877:7;:12;;;16855:35;;;;;;;;;;;;;;;:40;;;:55;;;;;;;;;;;;;;;;;;16746:175;16950:1;16934:7;:12;;;:17;;;16930:103;;17010:7;:12;;;16967:9;:21;16977:10;16967:21;;;;;;;;;;;;;;;:35;16989:7;:12;;;16967:35;;;;;;;;;;;;;;;:40;;;:55;;;;;;;;;;;;;;;;;;16930:103;17049:9;:21;17059:10;17049:21;;;;;;;;;;;;;;;:39;17078:8;17049:39;;;;;;;;;;;;;;;;17042:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17118:10;17103:36;;;17130:8;17103:36;;;;;;;;;;;;;;;;;;;;15781:1365;;;;:::o;14680:773::-;14736:12;14758:8;14736:31;;14799:1;14785:5;:16;;;;14777:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14832:23;14858:9;:21;14868:10;14858:21;;;;;;;;;;;;;;;:28;14880:5;14858:28;;;;;;;;;;;;;;;:37;;;;;;;;;;;;14832:63;;14935:1;14908:29;;:15;:29;;;14905:264;;15044:8;15025:27;;:15;:27;;;15017:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15152:7;;;;14905:264;15178:17;15198:14;:26;15213:10;15198:26;;;;;;;;;;;;;;;;;;;;;;;;;15178:46;;15265:33;;;;;;;;15274:8;15265:33;;;;;;15284:1;15265:33;;;;;;15287:10;15265:33;;;;;15234:9;:21;15244:10;15234:21;;;;;;;;;;;;;;;:28;15256:5;15234:28;;;;;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15349:5;15308:9;:21;15318:10;15308:21;;;;;;;;;;;;;;;:33;15330:10;15308:33;;;;;;;;;;;;;;;:38;;;:46;;;;;;;;;;;;;;;;;;15393:5;15364:14;:26;15379:10;15364:26;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;15425:10;15413:33;;;15437:8;15413:33;;;;;;;;;;;;;;;;;;;;14680:773;;;;;:::o;17152:759::-;17239:24;17265:11;17312:8;17298:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17288:33;;17331:7;17352:19;17384:1;17375:5;:10;;;;17374:43;;17397:14;:20;17412:4;17397:20;;;;;;;;;;;;;;;;;;;;;;;;;17374:43;;;17389:5;17374:43;17352:65;;17427:23;;:::i;:::-;17453:9;:15;17463:4;17453:15;;;;;;;;;;;;;;;:29;17469:12;17453:29;;;;;;;;;;;;;;;17427:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17492:178;17526:1;17498:30;;:7;:16;;;:30;;;;:46;;;;;17536:8;17532:12;;:1;:12;;;17498:46;17492:178;;;17573:7;:16;;;17560:7;17568:1;17560:10;;;;;;;;;;;;;;;:29;;;;;;;;;;;17603:3;;;;;;;17630:9;:15;17640:4;17630:15;;;;;;;;;;;;;;;:29;17646:7;:12;;;17630:29;;;;;;;;;;;;;;;17620:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17492:178;;;17693:7;:16;;;17679:31;;17893:1;17884:7;17877:18;17863:42;;;;;;;;;:::o;1465:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;754:40::-;;;;;;;;;;;;;;;;;;;:::o;4826:786::-;4917:26;;:::i;:::-;4967:10;:16;4978:4;4967:16;;;;;;;;;;;;;;;:26;4984:8;4967:26;;;;;;;;;;;;;;;:33;4994:5;4967:33;;;;;;;;;;;;;;;4955:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5072:17;5117:2;5099:15;:20;;;;;;5072:48;;5257:1;5232:9;:22;;;:26;;;:91;;;;;5301:9;:22;;;5288:35;;:10;:35;5262:61;;:9;:22;;;:61;;;;5232:91;5228:352;;;5357:1;5339:9;:15;;:19;;;;;;;;;;;5546:9;:22;;;5506:62;;5520:9;:22;;;5507:10;:35;5506:62;;;;;;;;5492:10;:77;5467:9;:22;;:102;;;;;;;;;;;5228:352;5589:16;4826:786;;;;;:::o;10288:634::-;10514:12;10538:15;10556:12;:10;:12::i;:::-;10538:30;;10578:23;853:66;10625:25;;10652:7;10661:4;10614:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10604:63;;;;;;10578:89;;10677:20;1077:66;10734:27;;10763:4;10769:5;10776:2;10780:6;10788:12;10802:7;10811:5;10723:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10700:127;;;;;;10677:150;;10866:4;10861:10;;10878:4;10873:10;;10885:15;10902:12;10844:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10837:78;;;;;10288:634;;;;;;;;;:::o;5618:170::-;5772:9;5736:10;:16;5747:4;5736:16;;;;;;;;;;;;;;;:26;5753:8;5736:26;;;;;;;;;;;;;;;:33;5763:5;5736:33;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5618:170;;;;:::o;11387:449::-;11532:14;11549:45;11566:9;11577:16;11549;:45::i;:::-;11532:62;;11645:6;11625:26;;:16;:26;;;:89;;;;;11708:6;11655:59;;:9;:24;11673:4;11655:24;;;;;;;;;;;;;;;:40;11687:6;11655:40;;;;;;;;;;;;;;;:49;;;;;;;;;;;;:59;;;11625:89;11604:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11387:449;;;;;:::o;13436:569::-;13560:1;13543:19;;:5;:19;;;13539:460;;;13643:4;:30;;;13674:2;13678:6;13690:19;13643:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13635:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13539:460;;;13778:17;13851:2;13855:6;13798:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13778:84;;13884:4;:30;;;13915:5;13922:1;13925:4;13931:19;13884:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13876:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13539:460;;13436:569;;;;:::o;11979:1451::-;12082:13;12198:1;12178:9;:16;:21;12174:44;;;12208:10;12201:17;;;;12174:44;12346:2;12326:9;:16;:22;12318:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12386:7;12403:9;12422;12453:28;12468:9;12479:1;12453:14;:28::i;:::-;12441:40;;;;;;;;;;;;12553:1;12548;:6;;;12544:748;;;12570:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12544:748;12658:1;12653;:6;;;12649:643;;;12801:10;12793:18;;12649:643;;;12836:2;12832:1;:6;;;12828:464;;;13010:116;13093:16;13083:27;;;;;;13030:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13020:92;;;;;;13118:1;13114;:5;13121:1;13124;13010:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13002:124;;12828:464;;;13234:47;13254:16;13244:27;;;;;;13273:1;13276;13279;13234:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13226:55;;12828:464;12649:643;13397:1;13380:19;;:5;:19;;;;13372:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11979:1451;;;;;;;;:::o;1264:921:2:-;1373:7;1382:9;1393;1693:3;1687:4;1683:14;1755:4;1741:12;1737:23;1725:10;1721:40;1715:47;1710:52;;1820:4;1806:12;1802:23;1790:10;1786:40;1780:47;1775:52;;2164:4;2155;2141:12;2137:23;2125:10;2121:40;2115:47;2111:58;2106:63;;1649:530;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://83d9f6894d7a4d179c3b27cf9fe7af6ef17e6bfc147016c85c378cea015db769

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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.