Contract 0x3d08ce1f9609bb02f47192ff620634d9eb0e7b56 8

Contract Overview

StellaSwap: BICO Trusted Forwarder V1
Balance:
0 GLMR

GLMR Value:
$0.00
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x06fdcd6fee36c4a18c8b42fa8208760d73385dab6f0351c3d15de4c76837d41d0x8171e63244031492023-09-10 7:49:2411 days 3 hrs ago0xc7aef72ebe28c68383cf33319163c3d996aad1ba IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.017505644157
0x5a68cc957c48668d9552cbc0ced25a5910f7b73f7de81e158e9f097a323d5e400x41706c4e43254032023-08-30 9:24:4222 days 1 hr ago0x327d372f9b1d7ada2565c777b51f6f73b7b9279a IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.026485915583
0xeb5b041b4d2bdf0700e6ebfa7dfb4ba5ad1c6a965bc30f4ed77f355689752bbb0x41706c4e43249232023-08-30 7:47:1822 days 3 hrs ago0xe84cb8e785f0e6b37663f00ac0d76f14753b622f IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.02711325
0xf405f723ce0dfea9fa1958310ffb1d5d14b8017fbf719bde3b6d9d1ae3e2c2910x41706c4e43214522023-08-29 20:06:3622 days 15 hrs ago0x0a57012d1378a8a25e03dd1d66215557458bb241 IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.027276
0x6c28b76259001e715fac8746221b55948ff84f44b95cc4877f6a3f5b3a452cd60x41706c4e42656042023-08-22 0:15:0030 days 10 hrs ago0xb1fb216d94a6409308aa919d1aafc7feb13a345b IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.026969375
0xdb36192562bb0f7feb3c78f93b8de26b7280ed298a7591df74c346d24724d07c0x41706c4e42655882023-08-22 0:11:4830 days 11 hrs ago0x2ea96239e348e28c0a2edf22aaacc547c2ebce55 IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.023478625
0x515eeed8c21478fa646273998138b8d641bc6dd0a4c31587cf319c0ca5ab75220x41706c4e40447472023-07-22 0:57:1861 days 10 hrs ago0xc2cbad9f0cba3b871e8a160cc945d720e75252ff IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.023151916879
0x74f09834d429ddf6c6b476907b7de4ed28c95baf9728c3078c6c9efaee55e7420x41706c4e40447372023-07-22 0:55:1861 days 10 hrs ago0x2ea96239e348e28c0a2edf22aaacc547c2ebce55 IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.03542636953
0x557dca78a0c719a5501354b320e45ff7657f6d3907e070c08016a1f1cae7432d0x41706c4e40217872023-07-18 19:11:1864 days 16 hrs ago0x026a2b839b96b1d97c09efce6e0d982976d4c4de IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.026753249498
0x5a54adf3e26ae23242972c19a6295831f2303f7762841a9ddd4070403a4b54160x41706c4e40217742023-07-18 19:07:4264 days 16 hrs ago0xc2cbad9f0cba3b871e8a160cc945d720e75252ff IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.037027841412
0x52463b012288358fd00a6c41574770f32c48dd449ea432452eec21d5d71d0f8f0x41706c4e40144482023-07-17 18:09:3065 days 17 hrs ago0x026a2b839b96b1d97c09efce6e0d982976d4c4de IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.031250733797
0x27c69fcf71d811332e8e75afb7b6f66268c9694eb79a984c7c3cbb52a9ef45770x41706c4e40142702023-07-17 17:32:3665 days 17 hrs ago0x7208deb6f9e75dab52a6e8ecb872fc32d3afbde8 IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.0431559183
0x44dfeab0dc00c9097a4437fb2083c5a44ba382bb4b48f87905b318eb6ba780d30x41706c4e40072052023-07-16 17:33:3666 days 17 hrs ago0x2ea96239e348e28c0a2edf22aaacc547c2ebce55 IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.027256923001
0xfd5b8238d5ae35a9c4ebdc1c899df9a8d34a65c49b0bd8e28dc600fef0ed28880x41706c4e40071922023-07-16 17:30:5466 days 17 hrs ago0x0a57012d1378a8a25e03dd1d66215557458bb241 IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.036589813381
0xe3e5a5283439d7a37e9286661f90c634f33b8ed6ce5c8db294131adb467c33f50x41706c4e39917712023-07-14 13:13:1268 days 22 hrs ago0xd3c3c84c55905834fb374c4379f8cf6636a233a8 IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.026161375
0x7b36e9c8b9d50198f5fe9f2f166fcc4e3e9d1b9e3f740a50df499f364c254e850x41706c4e39917612023-07-14 13:11:1268 days 22 hrs ago0xb1fb216d94a6409308aa919d1aafc7feb13a345b IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.03538425
0xd32f60667f5768fdef4a8e7adc3cc334237cf9e4eda91da26fb2e66cbdc003280x41706c4e39916112023-07-14 12:40:5468 days 22 hrs ago0x659f2ed8dfd6a354e0d8afa567c51280f65fb7a4 IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.0351605
0xc37bde43c6863dc3367384c9b7dcbf595af96319b34306412f6efd08659dd7a20x41706c4e39700582023-07-11 11:50:4871 days 23 hrs ago0x9bc6af5583b5278f3c50ed238e5c0fe8c126eb36 IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.028382402252
0x235876d2e287590bbba47bd440a6a803ec7e39d84642ca9b8d111775a40ff1350x41706c4e39700512023-07-11 11:49:2471 days 23 hrs ago0x7208deb6f9e75dab52a6e8ecb872fc32d3afbde8 IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.02826377954
0x6b0967b83cfdfb29922887098f475c31736841b35e7fc8be14b8f04b0dd92ecb0x41706c4e39017892023-07-01 21:41:1881 days 13 hrs ago0x7b031f4da991b412734b46877486088a385c2912 IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.026715
0xf4ea3339b027863c72e04cbf887b1135bc9667f77016e9c565386e29835dbd530x41706c4e39017882023-07-01 21:41:0681 days 13 hrs ago0x30a33432858db2728e622f86609c1a1edc0da750 IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.0271815
0x17ec7b9fcb75f10a4b41e8d02b0a0faeb68071314f8a73de248225eebd81f0800x41706c4e39017792023-07-01 21:39:1881 days 13 hrs ago0xacb2da78ef2f4f36247553ff01d77591aeb6ce0c IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.03752325
0xe33aaf14d3c05c20a15e11647d3cc92ba352f19d1b9845be67296219663f138f0x41706c4e39017772023-07-01 21:38:5481 days 13 hrs ago0xf0584bbeda83798a8680d145c1b5a805f9659df1 IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.040003
0x879d83bd3a573002f9b0daf515fcc360895f62ea08f71f1c64374eaf0f7172510x41706c4e38389472023-06-23 0:26:3090 days 10 hrs ago0x30a33432858db2728e622f86609c1a1edc0da750 IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.026190790109
0x3be067d1e7e11635ac169960b40d510530f2235a1b0a0c5b2c052a406cb676d50x41706c4e38389322023-06-23 0:23:3090 days 10 hrs ago0xacb2da78ef2f4f36247553ff01d77591aeb6ce0c IN  StellaSwap: BICO Trusted Forwarder V10 GLMR0.037668273749
[ Download CSV Export 

OVERVIEW

Biconomy's trusted forwarder to enable meta transactions for swap for gas.

Parent Txn Hash Block From To Value
Index Block
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BiconomyForwarder

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at moonbeam.moonscan.io on 2022-01-28
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.4;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


// File contracts/forward-v2/forwarder/ForwardRequestTypes.sol


pragma solidity 0.8.4;


/* deadline can be removed : GSN reference https://github.com/opengsn/gsn/blob/master/contracts/forwarder/IForwarder.sol (Saves 250 more gas)*/
/**
* @title ForwardRequestTypes 
* @notice specifies structures required by Forwarders to verify structured signatures.
* @notice This contract defines a struct which both ERC20Forwarder and BiconomyForwarder inherit. ERC20ForwardRequest includes all the fields present in the GSN V2 ForwardRequest struct, 
* but adds the following :
* address token : address of the token to pay for gas fees. For gasless transactions token address will be 0 address
* uint256 tokenGasPrice : gas price in the context of fee token
* uint256 txGas : gas to be supplied for recipient method call
* uint256 batchNonce : used for 2D nonces
* uint256 deadline 
* @dev Fields are placed in type order, to minimise storage used when executing transactions.
*/
contract ForwardRequestTypes {

/*allow the EVM to optimize for this, 
ensure that you try to order your storage variables and struct members such that they can be packed tightly*/

    struct ERC20ForwardRequest {
        address from; 
        address to; 
        address token; 
        uint256 txGas;
        uint256 tokenGasPrice;
        uint256 batchId; 
        uint256 batchNonce; 
        uint256 deadline; 
        bytes data;
    }

    //@review
    //should be SandBox Forward Request?
    struct ForwardRequest {
        string info;
        string warning; //optional
        string action;
        ERC20ForwardRequest request;
    }

     //For DAI and EIP2612 type Permits
     struct PermitRequest {
        address holder; 
        address spender;  
        uint256 value;
        uint256 nonce;
        uint256 expiry;
        bool allowed; 
        uint8 v;
        bytes32 r; 
        bytes32 s; 
    }

}


// File @openzeppelin/contracts/utils/[email protected]





/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


// File @openzeppelin/contracts/access/[email protected]





/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File contracts/forward-v2/forwarder/BiconomyForwarder.sol


pragma solidity 0.8.4;



/**
 *
 * @title BiconomyForwarder
 *
 * @notice A trusted forwarder for Biconomy relayed meta transactions
 *
 * @dev - Inherits Forward Request structs from Forward Request Types
 * @dev - Verifies EIP712 signatures
 * @dev - Verifies traditional personalSign signatures
 * @dev - Implements 2D nonces... each Tx has a BatchId and a BatchNonce
 * @dev - Keeps track of highest BatchId used by a given address, to assist in encoding of transactions client-side
 * @dev - maintains a list of verified domain seperators
 *
 */

 //@review if experimental abiCoder is necessary for structs we need in calldata
 contract BiconomyForwarder is ForwardRequestTypes, Ownable {
    using ECDSA for bytes32;

    mapping(bytes32 => bool) public domains;

    uint256 chainId;

    string public constant EIP712_DOMAIN_TYPE = "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)";

    //@review and rename
    bytes32 public constant REQUEST_TYPEHASH = keccak256(bytes("ERC20ForwardRequest(address from,address to,address token,uint256 txGas,uint256 tokenGasPrice,uint256 batchId,uint256 batchNonce,uint256 deadline,bytes data)"));

    //@review
    //Could add more type hash and rename above one if multiple executeEIP712 is planned to be supported

    mapping(address => mapping(uint256 => uint256)) nonces;

    constructor(
    ) public {
        uint256 id;
        assembly {
            id := chainid()
        }
        chainId = id;
    }

    /**
     * @dev registers domain seperators, maintaining that all domain seperators used for EIP712 forward requests use...
     * ... the address of this contract and the chainId of the chain this contract is deployed to
     * @param name : name of dApp/dApp fee proxy
     * @param version : version of dApp/dApp fee proxy
     */
    function registerDomainSeparator(string calldata name, string calldata version) external onlyOwner{
        uint256 id;
        /* solhint-disable-next-line no-inline-assembly */
        assembly {
            id := chainid()
        }

        bytes memory domainValue = abi.encode(
            keccak256(bytes(EIP712_DOMAIN_TYPE)),
            keccak256(bytes(name)),
            keccak256(bytes(version)),
            address(this),
            bytes32(id));

        bytes32 domainHash = keccak256(domainValue);

        domains[domainHash] = true;
        emit DomainRegistered(domainHash, domainValue);
    }

    event DomainRegistered(bytes32 indexed domainSeparator, bytes domainValue);

    event MetaTransactionExecuted(address indexed userAddress, address indexed relayerAddress, bytes indexed functionSignature);

    /**
     * @dev returns a value from the nonces 2d mapping
     * @param from : the user address
     * @param batchId : the key of the user's batch being queried
     * @return nonce : the number of transaction made within said batch
     */
    function getNonce(address from, uint256 batchId)
    public view
    returns (uint256) {
        return nonces[from][batchId];
    }

    /**
     * @dev an external function which exposes the internal _verifySigEIP712 method
     * @param req : request being verified
     * @param domainSeparator : the domain separator presented to the user when signing
     * @param sig : the signature generated by the user's wallet
     */
    function verifyEIP712(
        ERC20ForwardRequest calldata req,
        bytes32 domainSeparator,
        bytes calldata sig)
    external view {
        _verifySigEIP712(req, domainSeparator, sig);
    }

    /**
     * @dev verifies the call is valid by calling _verifySigEIP712
     * @dev executes the forwarded call if valid
     * @dev updates the nonce after
     * @param req : request being executed
     * @param domainSeparator : the domain separator presented to the user when signing
     * @param sig : the signature generated by the user's wallet
     * @return success : false if call fails. true otherwise
     * @return ret : any return data from the call
     */
    function executeEIP712(
        ERC20ForwardRequest calldata req,
        bytes32 domainSeparator,
        bytes calldata sig
    )
    external 
    returns (bool success, bytes memory ret) {
        _verifySigEIP712(req,domainSeparator,sig);
        _updateNonce(req);
        /* solhint-disable-next-line avoid-low-level-calls */
         (success,ret) = req.to.call{gas : req.txGas}(abi.encodePacked(req.data, req.from));
         // Validate that the relayer has sent enough gas for the call.
        // See https://ronan.eth.link/blog/ethereum-gas-dangers/
        assert(gasleft() > req.txGas / 63);
        _verifyCallResult(success,ret,"Forwarded call to destination did not succeed");
        emit MetaTransactionExecuted(req.from, msg.sender, req.data);
    }

    /**
     * @dev an external function which exposes the internal _verifySigPersonSign method
     * @param req : request being verified
     * @param sig : the signature generated by the user's wallet
     */
    function verifyPersonalSign(
        ERC20ForwardRequest calldata req,
        bytes calldata sig)
    external view {
        _verifySigPersonalSign(req, sig);
    }

    /**
     * @dev verifies the call is valid by calling _verifySigPersonalSign
     * @dev executes the forwarded call if valid
     * @dev updates the nonce after
     * @param req : request being executed
     * @param sig : the signature generated by the user's wallet
     * @return success : false if call fails. true otherwise
     * @return ret : any return data from the call
     */
    function executePersonalSign(ERC20ForwardRequest calldata req,bytes calldata sig)
    external 
    returns(bool success, bytes memory ret){
        _verifySigPersonalSign(req, sig);
        _updateNonce(req);
        (success,ret) = req.to.call{gas : req.txGas}(abi.encodePacked(req.data, req.from));
        // Validate that the relayer has sent enough gas for the call.
        // See https://ronan.eth.link/blog/ethereum-gas-dangers/
        assert(gasleft() > req.txGas / 63);
        _verifyCallResult(success,ret,"Forwarded call to destination did not succeed");
        emit MetaTransactionExecuted(req.from, msg.sender, req.data);
    }

    /**
     * @dev Increments the nonce of given user/batch pair
     * @dev Updates the highestBatchId of the given user if the request's batchId > current highest
     * @dev only intended to be called post call execution
     * @param req : request that was executed
     */
    function _updateNonce(ERC20ForwardRequest calldata req) internal {
        nonces[req.from][req.batchId]++;
    }

    /**
     * @dev verifies the domain separator used has been registered via registerDomainSeparator()
     * @dev recreates the 32 byte hash signed by the user's wallet (as per EIP712 specifications)
     * @dev verifies the signature using Open Zeppelin's ECDSA library
     * @dev signature valid if call doesn't throw
     *
     * @param req : request being executed
     * @param domainSeparator : the domain separator presented to the user when signing
     * @param sig : the signature generated by the user's wallet
     *
     */
    function _verifySigEIP712(
        ERC20ForwardRequest calldata req,
        bytes32 domainSeparator,
        bytes memory sig)
    internal
    view
    {   
        uint256 id;
        /* solhint-disable-next-line no-inline-assembly */
        assembly {
            id := chainid()
        }
        require(req.deadline == 0 || block.timestamp + 20 <= req.deadline, "request expired");
        require(domains[domainSeparator], "unregistered domain separator");
        require(chainId == id, "potential replay attack on the fork");
        bytes32 digest =
            keccak256(abi.encodePacked(
                "\x19\x01",
                domainSeparator,
                keccak256(abi.encode(REQUEST_TYPEHASH,
                            req.from,
                            req.to,
                            req.token,
                            req.txGas,
                            req.tokenGasPrice,
                            req.batchId,
                            nonces[req.from][req.batchId],
                            req.deadline,
                            keccak256(req.data)
                        ))));
        require(digest.recover(sig) == req.from, "signature mismatch");
    }

    /**
     * @dev encodes a 32 byte data string (presumably a hash of encoded data) as per eth_sign
     *
     * @param hash : hash of encoded data that signed by user's wallet using eth_sign
     * @return input hash encoded to matched what is signed by the user's key when using eth_sign*/
    function prefixed(bytes32 hash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev recreates the 32 byte hash signed by the user's wallet
     * @dev verifies the signature using Open Zeppelin's ECDSA library
     * @dev signature valid if call doesn't throw
     *
     * @param req : request being executed
     * @param sig : the signature generated by the user's wallet
     *
     */
    function _verifySigPersonalSign(
        ERC20ForwardRequest calldata req,
        bytes memory sig)
    internal
    view
    {
        require(req.deadline == 0 || block.timestamp + 20 <= req.deadline, "request expired");
        bytes32 digest = prefixed(keccak256(abi.encodePacked(
            req.from,
            req.to,
            req.token,
            req.txGas,
            req.tokenGasPrice,
            req.batchId,
            nonces[req.from][req.batchId],
            req.deadline,
            keccak256(req.data)
        )));
        require(digest.recover(sig) == req.from, "signature mismatch");
    }

    /**
     * @dev verifies the call result and bubbles up revert reason for failed calls
     *
     * @param success : outcome of forwarded call
     * @param returndata : returned data from the frowarded call
     * @param errorMessage : fallback error message to show 
     */
     function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure {
        if (!success) {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"domainSeparator","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"domainValue","type":"bytes"}],"name":"DomainRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":true,"internalType":"address","name":"relayerAddress","type":"address"},{"indexed":true,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"EIP712_DOMAIN_TYPE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REQUEST_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"domains","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"txGas","type":"uint256"},{"internalType":"uint256","name":"tokenGasPrice","type":"uint256"},{"internalType":"uint256","name":"batchId","type":"uint256"},{"internalType":"uint256","name":"batchNonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ForwardRequestTypes.ERC20ForwardRequest","name":"req","type":"tuple"},{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"executeEIP712","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"ret","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"txGas","type":"uint256"},{"internalType":"uint256","name":"tokenGasPrice","type":"uint256"},{"internalType":"uint256","name":"batchId","type":"uint256"},{"internalType":"uint256","name":"batchNonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ForwardRequestTypes.ERC20ForwardRequest","name":"req","type":"tuple"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"executePersonalSign","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"ret","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"batchId","type":"uint256"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"}],"name":"registerDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"txGas","type":"uint256"},{"internalType":"uint256","name":"tokenGasPrice","type":"uint256"},{"internalType":"uint256","name":"batchId","type":"uint256"},{"internalType":"uint256","name":"batchNonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ForwardRequestTypes.ERC20ForwardRequest","name":"req","type":"tuple"},{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"verifyEIP712","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"txGas","type":"uint256"},{"internalType":"uint256","name":"tokenGasPrice","type":"uint256"},{"internalType":"uint256","name":"batchId","type":"uint256"},{"internalType":"uint256","name":"batchNonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ForwardRequestTypes.ERC20ForwardRequest","name":"req","type":"tuple"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"verifyPersonalSign","outputs":[],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b5061001a33610023565b46600255610073565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611706806100826000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80639c7b4592116100715780639c7b4592146101725780639e39b73e14610185578063a41a03f21461018d578063c3f28abd146101a0578063c722f177146101b5578063f2fde38b146101e857600080fd5b806341706c4e146100b95780636e4cb075146100e3578063715018a6146100f85780638171e6321461010057806389535803146101135780638da5cb5b14610157575b600080fd5b6100cc6100c736600461133a565b6101fb565b6040516100da929190611472565b60405180910390f35b6100f66100f136600461138e565b6103b6565b005b6100f66103fb565b6100cc61010e36600461138e565b61043a565b610149610121366004611290565b6001600160a01b03919091166000908152600360209081526040808320938352929052205490565b6040519081526020016100da565b6000546040516001600160a01b0390911681526020016100da565b6100f66101803660046112d1565b6105f3565b610149610714565b6100f661019b36600461133a565b610737565b6101a861077e565b6040516100da9190611495565b6101d86101c33660046112b9565b60016020526000908152604090205460ff1681565b60405190151581526020016100da565b6100f66101f636600461126f565b61079a565b60006060610240868686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061083592505050565b61024986610b47565b610259604087016020880161126f565b6001600160a01b031660608701356102756101008901896114dd565b61028260208b018b61126f565b60405160200161029493929190611430565b60408051601f19818403018152908290526102ae91611456565b60006040518083038160008787f1925050503d80600081146102ec576040519150601f19603f3d011682016040523d82523d6000602084013e6102f1565b606091505b509092509050610306603f606088013561153a565b5a1161032257634e487b7160e01b600052600160045260246000fd5b61034582826040518060600160405280602d81526020016116a4602d9139610b96565b6103536101008701876114dd565b604051610361929190611420565b60405190819003902033610378602089018961126f565b6001600160a01b03167f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b60405160405180910390a494509492505050565b6103f68383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610bc592505050565b505050565b6000546001600160a01b0316331461042e5760405162461bcd60e51b8152600401610425906114a8565b60405180910390fd5b6104386000610dfa565b565b6000606061047e8585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610bc592505050565b61048785610b47565b610497604086016020870161126f565b6001600160a01b031660608601356104b36101008801886114dd565b6104c060208a018a61126f565b6040516020016104d293929190611430565b60408051601f19818403018152908290526104ec91611456565b60006040518083038160008787f1925050503d806000811461052a576040519150601f19603f3d011682016040523d82523d6000602084013e61052f565b606091505b509092509050610544603f606087013561153a565b5a1161056057634e487b7160e01b600052600160045260246000fd5b61058382826040518060600160405280602d81526020016116a4602d9139610b96565b6105916101008601866114dd565b60405161059f929190611420565b604051908190039020336105b6602088018861126f565b6001600160a01b03167f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b60405160405180910390a4935093915050565b6000546001600160a01b0316331461061d5760405162461bcd60e51b8152600401610425906114a8565b600046905060006040518060800160405280604f81526020016115b8604f9139805190602001208686604051610654929190611420565b6040518091039020858560405161066c929190611420565b604080519182900382206020830194909452810191909152606081019190915230608082015260a0810183905260c00160408051601f198184030181528282528051602080830191909120600081815260019283905293909320805460ff1916909117905592509081907f4bc68689cbe89a4a6333a3ab0a70093874da3e5bfb71e93102027f3f073687d890610703908590611495565b60405180910390a250505050505050565b6040518060c00160405280609d8152602001611607609d91398051906020012081565b610778848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061083592505050565b50505050565b6040518060800160405280604f81526020016115b8604f913981565b6000546001600160a01b031633146107c45760405162461bcd60e51b8152600401610425906114a8565b6001600160a01b0381166108295760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610425565b61083281610dfa565b50565b4660e08401351580610855575060e0840135610852426014611522565b11155b6108935760405162461bcd60e51b815260206004820152600f60248201526e1c995c5d595cdd08195e1c1a5c9959608a1b6044820152606401610425565b60008381526001602052604090205460ff166108f15760405162461bcd60e51b815260206004820152601d60248201527f756e7265676973746572656420646f6d61696e20736570617261746f720000006044820152606401610425565b806002541461094e5760405162461bcd60e51b815260206004820152602360248201527f706f74656e7469616c207265706c61792061747461636b206f6e2074686520666044820152626f726b60e81b6064820152608401610425565b6000836040518060c00160405280609d8152602001611607609d913980516020918201209061097f9088018861126f565b61098f6040890160208a0161126f565b61099f60608a0160408b0161126f565b89606001358a608001358b60a00135600360008e60000160208101906109c5919061126f565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008e60a001358152602001908152602001600020548d60e001358e806101000190610a1191906114dd565b604051610a1f929190611420565b60408051918290038220602083019b909b526001600160a01b03998a1690820152968816606088015296909416608086015260a085019290925260c084015260e08301526101008201526101208101919091526101408101919091526101600160405160208183030381529060405280519060200120604051602001610abc92919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815291905280516020918201209150610ae29086018661126f565b6001600160a01b0316610af58285610e4a565b6001600160a01b031614610b405760405162461bcd60e51b81526020600482015260126024820152710e6d2cedcc2e8eae4ca40dad2e6dac2e8c6d60731b6044820152606401610425565b5050505050565b60036000610b58602084018461126f565b6001600160a01b031681526020808201929092526040908101600090812060a085013582529092528120805491610b8e83611586565b919050555050565b826103f657815115610bab5781518083602001fd5b8060405162461bcd60e51b81526004016104259190611495565b60e08201351580610be4575060e0820135610be1426014611522565b11155b610c225760405162461bcd60e51b815260206004820152600f60248201526e1c995c5d595cdd08195e1c1a5c9959608a1b6044820152606401610425565b6000610d8d610c34602085018561126f565b610c44604086016020870161126f565b610c54606087016040880161126f565b6060870135608088013560a089013560036000610c7460208d018d61126f565b6001600160a01b031681526020808201929092526040908101600090812060a08e0135825290925290205460e08b0135610cb26101008d018d6114dd565b604051610cc0929190611420565b6040519081900381206bffffffffffffffffffffffff1960609a8b1b81166020840152988a1b891660348301529690981b9096166048880152605c870193909352607c860191909152609c85015260bc84015260dc83019190915260fc82015261011c01604051602081830303815290604052805190602001206040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050610d9c602084018461126f565b6001600160a01b0316610daf8284610e4a565b6001600160a01b0316146103f65760405162461bcd60e51b81526020600482015260126024820152710e6d2cedcc2e8eae4ca40dad2e6dac2e8c6d60731b6044820152606401610425565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000610e598585610e6e565b91509150610e6681610ede565b509392505050565b600080825160411415610ea55760208301516040840151606085015160001a610e99878285856110df565b94509450505050610ed7565b825160401415610ecf5760208301516040840151610ec48683836111cc565b935093505050610ed7565b506000905060025b9250929050565b6000816004811115610f0057634e487b7160e01b600052602160045260246000fd5b1415610f095750565b6001816004811115610f2b57634e487b7160e01b600052602160045260246000fd5b1415610f795760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610425565b6002816004811115610f9b57634e487b7160e01b600052602160045260246000fd5b1415610fe95760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610425565b600381600481111561100b57634e487b7160e01b600052602160045260246000fd5b14156110645760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610425565b600481600481111561108657634e487b7160e01b600052602160045260246000fd5b14156108325760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610425565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561111657506000905060036111c3565b8460ff16601b1415801561112e57508460ff16601c14155b1561113f57506000905060046111c3565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611193573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111bc576000600192509250506111c3565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016111ed878288856110df565b935093505050935093915050565b80356001600160a01b038116811461121257600080fd5b919050565b60008083601f840112611228578182fd5b50813567ffffffffffffffff81111561123f578182fd5b602083019150836020828501011115610ed757600080fd5b60006101208284031215611269578081fd5b50919050565b600060208284031215611280578081fd5b611289826111fb565b9392505050565b600080604083850312156112a2578081fd5b6112ab836111fb565b946020939093013593505050565b6000602082840312156112ca578081fd5b5035919050565b600080600080604085870312156112e6578182fd5b843567ffffffffffffffff808211156112fd578384fd5b61130988838901611217565b90965094506020870135915080821115611321578384fd5b5061132e87828801611217565b95989497509550505050565b6000806000806060858703121561134f578384fd5b843567ffffffffffffffff80821115611366578586fd5b61137288838901611257565b9550602087013594506040870135915080821115611321578384fd5b6000806000604084860312156113a2578283fd5b833567ffffffffffffffff808211156113b9578485fd5b6113c587838801611257565b945060208601359150808211156113da578384fd5b506113e786828701611217565b9497909650939450505050565b6000815180845261140c81602086016020860161155a565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b6000825161146881846020870161155a565b9190910192915050565b821515815260406020820152600061148d60408301846113f4565b949350505050565b60208152600061128960208301846113f4565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000808335601e198436030181126114f3578283fd5b83018035915067ffffffffffffffff82111561150d578283fd5b602001915036819003821315610ed757600080fd5b60008219821115611535576115356115a1565b500190565b60008261155557634e487b7160e01b81526012600452602481fd5b500490565b60005b8381101561157557818101518382015260200161155d565b838111156107785750506000910152565b600060001982141561159a5761159a6115a1565b5060010190565b634e487b7160e01b600052601160045260246000fdfe454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c74294552433230466f72776172645265717565737428616464726573732066726f6d2c6164647265737320746f2c6164647265737320746f6b656e2c75696e743235362074784761732c75696e7432353620746f6b656e47617350726963652c75696e7432353620626174636849642c75696e743235362062617463684e6f6e63652c75696e7432353620646561646c696e652c6279746573206461746129466f727761726465642063616c6c20746f2064657374696e6174696f6e20646964206e6f742073756363656564a26469706673582212202097c91bd976061fd913789ee0f58acc962494c391c5d4a2eda20081b94ff02264736f6c63430008040033

Deployed ByteCode Sourcemap

14746:10381:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18240:786;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;19251:171;;;;;;:::i;:::-;;:::i;:::-;;13394:94;;;:::i;19833:656::-;;;;;;:::i;:::-;;:::i;17090:136::-;;;;;;:::i;:::-;-1:-1:-1;;;;;17197:12:0;;;;17170:7;17197:12;;;:6;:12;;;;;;;;:21;;;;;;;;;17090:136;;;;7339:25:1;;;7327:2;7312:18;17090:136:0;7294:76:1;12743:87:0;12789:7;12816:6;12743:87;;-1:-1:-1;;;;;12816:6:0;;;6636:51:1;;6624:2;6609:18;12743:87:0;6591:102:1;15982:632:0;;;;;;:::i;:::-;;:::i;15076:220::-;;;:::i;17536:210::-;;;;;;:::i;:::-;;:::i;14916:125::-;;;:::i;:::-;;;;;;;:::i;14844:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6863:14:1;;6856:22;6838:41;;6826:2;6811:18;14844:39:0;6793:92:1;13643:192:0;;;;;;:::i;:::-;;:::i;18240:786::-;18405:12;18419:16;18448:41;18465:3;18469:15;18485:3;;18448:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18448:16:0;;-1:-1:-1;;;18448:41:0:i;:::-;18500:17;18513:3;18500:12;:17::i;:::-;18608:6;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18608:11:0;18626:9;;;;18654:8;;;;18626:3;18654:8;:::i;:::-;18664;;;;:3;:8;:::i;:::-;18637:36;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;18637:36:0;;;;;;;;;;18608:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18592:82:0;;-1:-1:-1;18592:82:0;-1:-1:-1;18843:14:0;18855:2;18843:9;;;;:14;:::i;:::-;18831:9;:26;18824:34;;-1:-1:-1;;;18824:34:0;;;;;;;;;18869:78;18887:7;18895:3;18869:78;;;;;;;;;;;;;;;;;:17;:78::i;:::-;19009:8;;;;:3;:8;:::i;:::-;18963:55;;;;;;;:::i;:::-;;;;;;;;;18997:10;18987:8;;;;:3;:8;:::i;:::-;-1:-1:-1;;;;;18963:55:0;;;;;;;;;;;18240:786;;;;;;;:::o;19251:171::-;19382:32;19405:3;19410;;19382:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19382:22:0;;-1:-1:-1;;;19382:32:0:i;:::-;19251:171;;;:::o;13394:94::-;12789:7;12816:6;-1:-1:-1;;;;;12816:6:0;11628:10;12963:23;12955:68;;;;-1:-1:-1;;;12955:68:0;;;;;;;:::i;:::-;;;;;;;;;13459:21:::1;13477:1;13459:9;:21::i;:::-;13394:94::o:0;19833:656::-;19943:12;19957:16;19985:32;20008:3;20013;;19985:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19985:22:0;;-1:-1:-1;;;19985:32:0:i;:::-;20028:17;20041:3;20028:12;:17::i;:::-;20072:6;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20072:11:0;20090:9;;;;20118:8;;;;20090:3;20118:8;:::i;:::-;20128;;;;:3;:8;:::i;:::-;20101:36;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;20101:36:0;;;;;;;;;;20072:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20056:82:0;;-1:-1:-1;20056:82:0;-1:-1:-1;20306:14:0;20318:2;20306:9;;;;:14;:::i;:::-;20294:9;:26;20287:34;;-1:-1:-1;;;20287:34:0;;;;;;;;;20332:78;20350:7;20358:3;20332:78;;;;;;;;;;;;;;;;;:17;:78::i;:::-;20472:8;;;;:3;:8;:::i;:::-;20426:55;;;;;;;:::i;:::-;;;;;;;;;20460:10;20450:8;;;;:3;:8;:::i;:::-;-1:-1:-1;;;;;20426:55:0;;;;;;;;;;;19833:656;;;;;;:::o;15982:632::-;12789:7;12816:6;-1:-1:-1;;;;;12816:6:0;11628:10;12963:23;12955:68;;;;-1:-1:-1;;;12955:68:0;;;;;;;:::i;:::-;16091:10:::1;16202:9;16196:15;;16234:24;16302:18;;;;;;;;;;;;;;;;;16286:36;;;;;;16353:4;;16337:22;;;;;;;:::i;:::-;;;;;;;;16390:7;;16374:25;;;;;;;:::i;:::-;;::::0;;;;;::::1;::::0;;16261:193:::1;::::0;::::1;8527:25:1::0;;;;8568:18;;8561:34;;;;8611:18;;;8604:34;;;;16422:4:0::1;8654:18:1::0;;;8647:60;8723:19;;;8716:35;;;8499:19;;16261:193:0::1;::::0;;-1:-1:-1;;16261:193:0;;::::1;::::0;;;;;;16488:22;;16261:193:::1;16488:22:::0;;::::1;::::0;;;;16467:18:::1;16523:19:::0;;;16545:4:::1;16523:19:::0;;;;;;;;:26;;-1:-1:-1;;16523:26:0::1;::::0;;::::1;::::0;;16261:193;-1:-1:-1;16488:22:0;;;16565:41:::1;::::0;::::1;::::0;16261:193;;16565:41:::1;:::i;:::-;;;;;;;;13034:1;;;15982:632:::0;;;;:::o;15076:220::-;15129:166;;;;;;;;;;;;;;;;;15119:177;;;;;;15076:220;:::o;17536:210::-;17695:43;17712:3;17717:15;17734:3;;17695:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17695:16:0;;-1:-1:-1;;;17695:43:0:i;:::-;17536:210;;;;:::o;14916:125::-;;;;;;;;;;;;;;;;;;;:::o;13643:192::-;12789:7;12816:6;-1:-1:-1;;;;;12816:6:0;11628:10;12963:23;12955:68;;;;-1:-1:-1;;;12955:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13732:22:0;::::1;13724:73;;;::::0;-1:-1:-1;;;13724:73:0;;10870:2:1;13724:73:0::1;::::0;::::1;10852:21:1::0;10909:2;10889:18;;;10882:30;10948:34;10928:18;;;10921:62;-1:-1:-1;;;10999:18:1;;;10992:36;11045:19;;13724:73:0::1;10842:228:1::0;13724:73:0::1;13808:19;13818:8;13808:9;:19::i;:::-;13643:192:::0;:::o;21458:1245::-;21743:9;21781:12;;;;:17;;:57;;-1:-1:-1;21826:12:0;;;;21802:20;:15;21820:2;21802:20;:::i;:::-;:36;;21781:57;21773:85;;;;-1:-1:-1;;;21773:85:0;;10166:2:1;21773:85:0;;;10148:21:1;10205:2;10185:18;;;10178:30;-1:-1:-1;;;10224:18:1;;;10217:45;10279:18;;21773:85:0;10138:165:1;21773:85:0;21877:24;;;;:7;:24;;;;;;;;21869:66;;;;-1:-1:-1;;;21869:66:0;;11680:2:1;21869:66:0;;;11662:21:1;11719:2;11699:18;;;11692:30;11758:31;11738:18;;;11731:59;11807:18;;21869:66:0;11652:179:1;21869:66:0;21965:2;21954:7;;:13;21946:61;;;;-1:-1:-1;;;21946:61:0;;12802:2:1;21946:61:0;;;12784:21:1;12841:2;12821:18;;;12814:30;12880:34;12860:18;;;12853:62;-1:-1:-1;;;12931:18:1;;;12924:33;12974:19;;21946:61:0;12774:225:1;21946:61:0;22018:14;22122:15;15129:166;;;;;;;;;;;;;;;;;15119:177;;;;;;;;22224:8;;;;:3;:8;:::i;:::-;22263:6;;;;;;;;:::i;:::-;22300:9;;;;;;;;:::i;:::-;22340:3;:9;;;22380:3;:17;;;22428:3;:11;;;22470:6;:16;22477:3;:8;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22470:16:0;-1:-1:-1;;;;;22470:16:0;;;;;;;;;;;;:29;22487:3;:11;;;22470:29;;;;;;;;;;;;22530:3;:12;;;22583:3;:8;;;;;;;;:::i;:::-;22573:19;;;;;;;:::i;:::-;;;;;;;;;;22166:453;;;7774:25:1;;;;-1:-1:-1;;;;;7873:15:1;;;7853:18;;;7846:43;7925:15;;;7905:18;;;7898:43;7977:15;;;;7957:18;;;7950:43;8009:19;;;8002:35;;;;8053:19;;;8046:35;8097:19;;;8090:35;8141:19;;;8134:35;8185:19;;;8178:35;;;;8229:19;;;8222:35;;;;7746:19;;22166:453:0;;;;;;;;;;;;22156:464;;;;;;22058:563;;;;;;;;-1:-1:-1;;;6351:27:1;;6403:1;6394:11;;6387:27;;;;6439:2;6430:12;;6423:28;6476:2;6467:12;;6341:144;22058:563:0;;;;-1:-1:-1;;22058:563:0;;;;;;;;;22048:574;;22058:563;22048:574;;;;;-1:-1:-1;22664:8:0;;;;:3;:8;:::i;:::-;-1:-1:-1;;;;;22641:31:0;:19;:6;22656:3;22641:14;:19::i;:::-;-1:-1:-1;;;;;22641:31:0;;22633:62;;;;-1:-1:-1;;;22633:62:0;;13206:2:1;22633:62:0;;;13188:21:1;13245:2;13225:18;;;13218:30;-1:-1:-1;;;13264:18:1;;;13257:48;13322:18;;22633:62:0;13178:168:1;22633:62:0;21458:1245;;;;;:::o;20782:115::-;20858:6;:16;20865:8;;;;:3;:8;:::i;:::-;-1:-1:-1;;;;;20858:16:0;;;;;;;;;;;;;;;-1:-1:-1;20858:16:0;;;20875:11;;;;20858:29;;;;;;;:31;;;;;;:::i;:::-;;;;;;20782:115;:::o;24451:671::-;24574:7;24569:546;;24669:17;;:21;24665:439;;24932:10;24926:17;24993:15;24980:10;24976:2;24972:19;24965:44;24880:148;25075:12;25068:20;;-1:-1:-1;;;25068:20:0;;;;;;;;:::i;23513:640::-;23664:12;;;;:17;;:57;;-1:-1:-1;23709:12:0;;;;23685:20;:15;23703:2;23685:20;:::i;:::-;:36;;23664:57;23656:85;;;;-1:-1:-1;;;23656:85:0;;10166:2:1;23656:85:0;;;10148:21:1;10205:2;10185:18;;;10178:30;-1:-1:-1;;;10224:18:1;;;10217:45;10279:18;;23656:85:0;10138:165:1;23656:85:0;23752:14;23769:303;23819:8;;;;:3;:8;:::i;:::-;23842:6;;;;;;;;:::i;:::-;23863:9;;;;;;;;:::i;:::-;23887;;;;23911:17;;;;23943:11;;;;23969:6;:16;23976:8;;;;23887:3;23976:8;:::i;:::-;-1:-1:-1;;;;;23969:16:0;;;;;;;;;;;;;;;-1:-1:-1;23969:16:0;;;23986:11;;;;23969:29;;;;;;;;24013:12;;;;24050:8;;;;23986:3;24050:8;:::i;:::-;24040:19;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;4369:2:1;4365:15;;;4361:24;;23788:282:0;;;4349:37:1;4420:15;;;4416:24;;4402:12;;;4395:46;4475:15;;;;4471:24;;;4457:12;;;4450:46;4512:12;;;4505:28;;;;4549:12;;;4542:28;;;;4586:13;;;4579:29;4624:13;;;4617:29;4662:13;;;4655:29;;;;4700:13;;;4693:29;4738:13;;23788:282:0;;;;;;;;;;;;23778:293;;;;;;23103:58;;5950:66:1;23103:58:0;;;5938:79:1;6033:12;;;6026:28;;;23066:7:0;;6070:12:1;;23103:58:0;;;;;;;;;;;;23093:69;;;;;;23086:76;;23011:159;;;;23769:303;23752:320;-1:-1:-1;24114:8:0;;;;:3;:8;:::i;:::-;-1:-1:-1;;;;;24091:31:0;:19;:6;24106:3;24091:14;:19::i;:::-;-1:-1:-1;;;;;24091:31:0;;24083:62;;;;-1:-1:-1;;;24083:62:0;;13206:2:1;24083:62:0;;;13188:21:1;13245:2;13225:18;;;13218:30;-1:-1:-1;;;13264:18:1;;;13257:48;13322:18;;24083:62:0;13178:168:1;13843:173:0;13899:16;13918:6;;-1:-1:-1;;;;;13935:17:0;;;-1:-1:-1;;;;;;13935:17:0;;;;;;13968:40;;13918:6;;;;;;;13968:40;;13899:16;13968:40;13843:173;;:::o;4300:231::-;4378:7;4399:17;4418:18;4440:27;4451:4;4457:9;4440:10;:27::i;:::-;4398:69;;;;4478:18;4490:5;4478:11;:18::i;:::-;-1:-1:-1;4514:9:0;4300:231;-1:-1:-1;;;4300:231:0:o;2190:1308::-;2271:7;2280:12;2505:9;:16;2525:2;2505:22;2501:990;;;2801:4;2786:20;;2780:27;2851:4;2836:20;;2830:27;2909:4;2894:20;;2888:27;2544:9;2880:36;2952:25;2963:4;2880:36;2780:27;2830;2952:10;:25::i;:::-;2945:32;;;;;;;;;2501:990;2999:9;:16;3019:2;2999:22;2995:496;;;3274:4;3259:20;;3253:27;3325:4;3310:20;;3304:27;3367:23;3378:4;3253:27;3304;3367:10;:23::i;:::-;3360:30;;;;;;;;2995:496;-1:-1:-1;3439:1:0;;-1:-1:-1;3443:35:0;2995:496;2190:1308;;;;;:::o;461:643::-;539:20;530:5;:29;;;;;;-1:-1:-1;;;530:29:0;;;;;;;;;;526:571;;;461:643;:::o;526:571::-;637:29;628:5;:38;;;;;;-1:-1:-1;;;628:38:0;;;;;;;;;;624:473;;;683:34;;-1:-1:-1;;;683:34:0;;9813:2:1;683:34:0;;;9795:21:1;9852:2;9832:18;;;9825:30;9891:26;9871:18;;;9864:54;9935:18;;683:34:0;9785:174:1;624:473:0;748:35;739:5;:44;;;;;;-1:-1:-1;;;739:44:0;;;;;;;;;;735:362;;;800:41;;-1:-1:-1;;;800:41:0;;10510:2:1;800:41:0;;;10492:21:1;10549:2;10529:18;;;10522:30;10588:33;10568:18;;;10561:61;10639:18;;800:41:0;10482:181:1;735:362:0;872:30;863:5;:39;;;;;;-1:-1:-1;;;863:39:0;;;;;;;;;;859:238;;;919:44;;-1:-1:-1;;;919:44:0;;11277:2:1;919:44:0;;;11259:21:1;11316:2;11296:18;;;11289:30;11355:34;11335:18;;;11328:62;-1:-1:-1;;;11406:18:1;;;11399:32;11448:19;;919:44:0;11249:224:1;859:238:0;994:30;985:5;:39;;;;;;-1:-1:-1;;;985:39:0;;;;;;;;;;981:116;;;1041:44;;-1:-1:-1;;;1041:44:0;;12038:2:1;1041:44:0;;;12020:21:1;12077:2;12057:18;;;12050:30;12116:34;12096:18;;;12089:62;-1:-1:-1;;;12167:18:1;;;12160:32;12209:19;;1041:44:0;12010:224:1;5799:1632:0;5930:7;;6864:66;6851:79;;6847:163;;;-1:-1:-1;6963:1:0;;-1:-1:-1;6967:30:0;6947:51;;6847:163;7024:1;:7;;7029:2;7024:7;;:18;;;;;7035:1;:7;;7040:2;7035:7;;7024:18;7020:102;;;-1:-1:-1;7075:1:0;;-1:-1:-1;7079:30:0;7059:51;;7020:102;7236:24;;;7219:14;7236:24;;;;;;;;;8989:25:1;;;9062:4;9050:17;;9030:18;;;9023:45;;;;9084:18;;;9077:34;;;9127:18;;;9120:34;;;7236:24:0;;8961:19:1;;7236:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7236:24:0;;-1:-1:-1;;7236:24:0;;;-1:-1:-1;;;;;;;7275:20:0;;7271:103;;7328:1;7332:29;7312:50;;;;;;;7271:103;7394:6;-1:-1:-1;7402:20:0;;-1:-1:-1;5799:1632:0;;;;;;;;:::o;4794:391::-;4908:7;;-1:-1:-1;;;;;5009:75:0;;5111:3;5107:12;;;5121:2;5103:21;5152:25;5163:4;5103:21;5172:1;5009:75;5152:10;:25::i;:::-;5145:32;;;;;;4794:391;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:375::-;243:8;253:6;307:3;300:4;292:6;288:17;284:27;274:2;;332:8;322;315:26;274:2;-1:-1:-1;362:20:1;;405:18;394:30;;391:2;;;444:8;434;427:26;391:2;488:4;480:6;476:17;464:29;;540:3;533:4;524:6;516;512:19;508:30;505:39;502:2;;;557:1;554;547:12;572:176;644:5;689:3;680:6;675:3;671:16;667:26;664:2;;;710:5;703;696:20;664:2;-1:-1:-1;736:6:1;654:94;-1:-1:-1;654:94:1:o;753:196::-;812:6;865:2;853:9;844:7;840:23;836:32;833:2;;;886:6;878;871:22;833:2;914:29;933:9;914:29;:::i;:::-;904:39;823:126;-1:-1:-1;;;823:126:1:o;954:264::-;1022:6;1030;1083:2;1071:9;1062:7;1058:23;1054:32;1051:2;;;1104:6;1096;1089:22;1051:2;1132:29;1151:9;1132:29;:::i;:::-;1122:39;1208:2;1193:18;;;;1180:32;;-1:-1:-1;;;1041:177:1:o;1223:190::-;1282:6;1335:2;1323:9;1314:7;1310:23;1306:32;1303:2;;;1356:6;1348;1341:22;1303:2;-1:-1:-1;1384:23:1;;1293:120;-1:-1:-1;1293:120:1:o;1418:749::-;1510:6;1518;1526;1534;1587:2;1575:9;1566:7;1562:23;1558:32;1555:2;;;1608:6;1600;1593:22;1555:2;1653:9;1640:23;1682:18;1723:2;1715:6;1712:14;1709:2;;;1744:6;1736;1729:22;1709:2;1788:58;1838:7;1829:6;1818:9;1814:22;1788:58;:::i;:::-;1865:8;;-1:-1:-1;1762:84:1;-1:-1:-1;1953:2:1;1938:18;;1925:32;;-1:-1:-1;1969:16:1;;;1966:2;;;2003:6;1995;1988:22;1966:2;;2047:60;2099:7;2088:8;2077:9;2073:24;2047:60;:::i;:::-;1545:622;;;;-1:-1:-1;2126:8:1;-1:-1:-1;;;;1545:622:1:o;2172:785::-;2298:6;2306;2314;2322;2375:2;2363:9;2354:7;2350:23;2346:32;2343:2;;;2396:6;2388;2381:22;2343:2;2441:9;2428:23;2470:18;2511:2;2503:6;2500:14;2497:2;;;2532:6;2524;2517:22;2497:2;2560:79;2631:7;2622:6;2611:9;2607:22;2560:79;:::i;:::-;2550:89;;2686:2;2675:9;2671:18;2658:32;2648:42;;2743:2;2732:9;2728:18;2715:32;2699:48;;2772:2;2762:8;2759:16;2756:2;;;2793:6;2785;2778:22;2962:717;3079:6;3087;3095;3148:2;3136:9;3127:7;3123:23;3119:32;3116:2;;;3169:6;3161;3154:22;3116:2;3214:9;3201:23;3243:18;3284:2;3276:6;3273:14;3270:2;;;3305:6;3297;3290:22;3270:2;3333:79;3404:7;3395:6;3384:9;3380:22;3333:79;:::i;:::-;3323:89;;3465:2;3454:9;3450:18;3437:32;3421:48;;3494:2;3484:8;3481:16;3478:2;;;3515:6;3507;3500:22;3478:2;;3559:60;3611:7;3600:8;3589:9;3585:24;3559:60;:::i;:::-;3106:573;;3638:8;;-1:-1:-1;3533:86:1;;-1:-1:-1;;;;3106:573:1:o;3684:257::-;3725:3;3763:5;3757:12;3790:6;3785:3;3778:19;3806:63;3862:6;3855:4;3850:3;3846:14;3839:4;3832:5;3828:16;3806:63;:::i;:::-;3923:2;3902:15;-1:-1:-1;;3898:29:1;3889:39;;;;3930:4;3885:50;;3733:208;-1:-1:-1;;3733:208:1:o;4762:273::-;4945:6;4937;4932:3;4919:33;4901:3;4971:16;;4996:15;;;4971:16;4909:126;-1:-1:-1;4909:126:1:o;5040:384::-;5251:6;5243;5238:3;5225:33;5345:2;5341:15;;;;-1:-1:-1;;5337:53:1;5277:16;;5326:65;;;5415:2;5407:11;;5215:209;-1:-1:-1;5215:209:1:o;5429:274::-;5558:3;5596:6;5590:13;5612:53;5658:6;5653:3;5646:4;5638:6;5634:17;5612:53;:::i;:::-;5681:16;;;;;5566:137;-1:-1:-1;;5566:137:1:o;6890:298::-;7073:6;7066:14;7059:22;7048:9;7041:41;7118:2;7113;7102:9;7098:18;7091:30;7022:4;7138:44;7178:2;7167:9;7163:18;7155:6;7138:44;:::i;:::-;7130:52;7031:157;-1:-1:-1;;;;7031:157:1:o;9165:217::-;9312:2;9301:9;9294:21;9275:4;9332:44;9372:2;9361:9;9357:18;9349:6;9332:44;:::i;12239:356::-;12441:2;12423:21;;;12460:18;;;12453:30;12519:34;12514:2;12499:18;;12492:62;12586:2;12571:18;;12413:182::o;13533:533::-;13610:4;13616:6;13676:11;13663:25;13770:2;13766:7;13755:8;13739:14;13735:29;13731:43;13711:18;13707:68;13697:2;;13792:4;13786;13779:18;13697:2;13822:33;;13874:20;;;-1:-1:-1;13917:18:1;13906:30;;13903:2;;;13952:4;13946;13939:18;13903:2;13988:4;13976:17;;-1:-1:-1;14019:14:1;14015:27;;;14005:38;;14002:2;;;14056:1;14053;14046:12;14071:128;14111:3;14142:1;14138:6;14135:1;14132:13;14129:2;;;14148:18;;:::i;:::-;-1:-1:-1;14184:9:1;;14119:80::o;14204:217::-;14244:1;14270;14260:2;;-1:-1:-1;;;14295:31:1;;14349:4;14346:1;14339:15;14377:4;14302:1;14367:15;14260:2;-1:-1:-1;14406:9:1;;14250:171::o;14426:258::-;14498:1;14508:113;14522:6;14519:1;14516:13;14508:113;;;14598:11;;;14592:18;14579:11;;;14572:39;14544:2;14537:10;14508:113;;;14639:6;14636:1;14633:13;14630:2;;;-1:-1:-1;;14674:1:1;14656:16;;14649:27;14479:205::o;14689:135::-;14728:3;-1:-1:-1;;14749:17:1;;14746:2;;;14769:18;;:::i;:::-;-1:-1:-1;14816:1:1;14805:13;;14736:88::o;14829:127::-;14890:10;14885:3;14881:20;14878:1;14871:31;14921:4;14918:1;14911:15;14945:4;14942:1;14935:15

Swarm Source

ipfs://2097c91bd976061fd913789ee0f58acc962494c391c5d4a2eda20081b94ff022
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.