Contract 0x38c4092b28dab7f3d98ee6524549571c283cdfa5 5

 

Contract Overview

Balance:
72,581.033494146356506038 MATIC

MATIC Value:
$67,565.68 (@ $0.93/MATIC)
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x20b4924fc28050ae05863b16c50bc10afa1462a3919d08f24776dbb71b8fc626Cancel Order432269142023-05-27 23:07:485 hrs 18 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.011736200779 141.6167
0x920d6ab45c1c60dfdc9ddeb24753780abb3bd058e72fd71dd9573672032f6f5eCancel Order432228492023-05-27 20:40:347 hrs 45 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.013077661614 159.341825139
0xd2a0d4bfb958cddd1e540269091eb14c93d913a28cf4d8a876b8a94e2487b5f7Cancel Order432228492023-05-27 20:40:347 hrs 45 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.012295144357 148.36128
0xef9f1592d8df77a7e1747968df91d566703ce999016bb03620d9b46dd11541ddCancel Order432219282023-05-27 20:06:138 hrs 20 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.01215504448 148.100404276
0x42823030ca20d2d23c4c5b00e683d0ee221f3142b483da9905170501e720171aCancel Order432219282023-05-27 20:06:138 hrs 20 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.011515880776 138.958174276
0x11850ff35e1e2471658e08ab5b67faf7bfb99736a63cc2051a7bd931baca43acCancel Order432159552023-05-27 16:20:1412 hrs 6 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.014223523653 171.63037
0x47b9de6079f590a4d5abc8be2e88efb44fa142237b3eb1de1317ec8a0ceab563Cancel Order432157462023-05-27 16:11:5112 hrs 14 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.013794306982 166.45116
0x61031b64e1d10e1e18cf0b9fc577d6d4d24dc10326a9acc32ff61aa44aac1602Cancel Order432156482023-05-27 16:07:4112 hrs 18 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.012285137971 149.685499147
0xb929e185a26f4cfd9728a9773ef57b10f8f03dcfbc2817703a9647ddd99765acCancel Order432156482023-05-27 16:07:4112 hrs 18 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.011985241531 144.621789147
0x211a970bb9e5c2f7648e73a04e43f7ad516d11326161e5219e61cb12d46557e0Cancel Order432147822023-05-27 15:35:5012 hrs 50 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.012575245981 151.74117
0xc2b25e6ee8374e08fb9f48e33837cc5f14c5fd95920c4800574d2e5f9ed00a9fCancel Order432140482023-05-27 15:08:1413 hrs 18 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.012422903068 151.364066975
0xfc98165921a156972822b70179873e66cd1376c51f1b7c2410c8a647a9178cddCancel Order432140482023-05-27 15:08:1413 hrs 18 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.012354280622 149.074856975
0x691f3f63bc079f5794f00041c47103eca826d0c375074881b5c665396e559580Cancel Order432131982023-05-27 14:38:0413 hrs 48 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.011939949021 144.07526
0x1105a44b21099303a188c62613b136dfb4b5d9fb39043797b405810669b37c76Cancel Order432131912023-05-27 14:37:5013 hrs 48 mins ago0xaecd8f8a9747fd1c1a803a16a8a7fb68d556253a IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.015711015622 147.337274786
0x667e573974a2196d1d24f233f61c07929073ffbac6267eaa3b282cd44f704e7eCancel Order432131342023-05-27 14:35:4813 hrs 50 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.016875362325 203.62919558
0xf6bb11cfe551973d68fefda0171c23dc71cf47d62a0a02f65584380cca6de817Cancel Order432130562023-05-27 14:33:0413 hrs 53 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.012421656972 149.887864228
0xcd90bde7f77275a33dec1b196b8c84776db395ba512befd47dd1db4a88ee6c31Cancel Order432128812023-05-27 14:26:5213 hrs 59 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.014010756341 169.06298
0x7a6c40a7223bce6ac3295c13085e15f2ffd909625801fc5ff7e46f75fb6d8b4fCancel Order432127922023-05-27 14:23:4214 hrs 2 mins ago0x2639dfe08e0f4ee6885d1e9d840c34bab76847a4 IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.015387639215 153.91795
0x50eba586e3a61b47263dea1dda453eb26b2e5a773d4b9faca9c2e0091670f77bCancel Order432074862023-05-27 11:14:2017 hrs 11 mins ago0xade6c956dd6b68a65629f2b70a77eab3a607b8cd IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.012273879712 137.051036908
0x9bcc6c0bd634a4c2e08ddd3d3251eacd157ae56dfb6f77e7f7fed8debe2ac764Cancel Order432074712023-05-27 11:13:4817 hrs 12 mins ago0xade6c956dd6b68a65629f2b70a77eab3a607b8cd IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.011540025857 128.856771195
0x6e8a5e535cd4fe6a5e2d7e9e1fcec988e98e5e2107f35ffd79a71b21d640c058Cancel Order432074632023-05-27 11:13:3217 hrs 12 mins ago0xade6c956dd6b68a65629f2b70a77eab3a607b8cd IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.011771362291 131.439890704
0xe73b1f1d68804a0c206be903bb84f1865440a8674a5838326426ea16067dceeeCancel Order432074402023-05-27 11:12:4417 hrs 13 mins ago0xade6c956dd6b68a65629f2b70a77eab3a607b8cd IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.012582400286 140.496000157
0x2fa80c3d1d18da87808748b22d476ceaef18115b3e36c136f1db70745e0d5a65Cancel Order432074262023-05-27 11:12:1417 hrs 14 mins ago0xade6c956dd6b68a65629f2b70a77eab3a607b8cd IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.012623100759 140.950464611
0x881b6b9a68e5ca43d1e384d2aed0a13af63c9e27e29aaf0d527cf9b3ac3e0cceCancel Order432074162023-05-27 11:11:5217 hrs 14 mins ago0xade6c956dd6b68a65629f2b70a77eab3a607b8cd IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.012540156857 140.024306953
0x179f478b28dcc21330e1b6eea68c842fb76cfbbc531ac5f9fe037421bcf87da5Cancel Order432074072023-05-27 11:11:3217 hrs 14 mins ago0xade6c956dd6b68a65629f2b70a77eab3a607b8cd IN  0x38c4092b28dab7f3d98ee6524549571c283cdfa50 MATIC0.012569571822 140.352756594
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc7acb8894cba4587d1ab515a45f5906ec1724eb586bb607c4c67d8e6988d3cfb432330992023-05-28 2:52:371 hr 33 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5 0x5a36178e38864f5e724a2daf5f9cd9ba473f790391.58 MATIC
0xbae7b25c003bfff96ead746c5371c4e8f5178fcbe61aa588005e4af414c08200432328312023-05-28 2:42:031 hr 44 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5 0x5a36178e38864f5e724a2daf5f9cd9ba473f79035 MATIC
0x20b4924fc28050ae05863b16c50bc10afa1462a3919d08f24776dbb71b8fc626432269142023-05-27 23:07:485 hrs 18 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0x920d6ab45c1c60dfdc9ddeb24753780abb3bd058e72fd71dd9573672032f6f5e432228492023-05-27 20:40:347 hrs 45 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0xd2a0d4bfb958cddd1e540269091eb14c93d913a28cf4d8a876b8a94e2487b5f7432228492023-05-27 20:40:347 hrs 45 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0xef9f1592d8df77a7e1747968df91d566703ce999016bb03620d9b46dd11541dd432219282023-05-27 20:06:138 hrs 20 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0x42823030ca20d2d23c4c5b00e683d0ee221f3142b483da9905170501e720171a432219282023-05-27 20:06:138 hrs 20 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0x11850ff35e1e2471658e08ab5b67faf7bfb99736a63cc2051a7bd931baca43ac432159552023-05-27 16:20:1412 hrs 6 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0x47b9de6079f590a4d5abc8be2e88efb44fa142237b3eb1de1317ec8a0ceab563432157462023-05-27 16:11:5112 hrs 14 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0x61031b64e1d10e1e18cf0b9fc577d6d4d24dc10326a9acc32ff61aa44aac1602432156482023-05-27 16:07:4112 hrs 18 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0xb929e185a26f4cfd9728a9773ef57b10f8f03dcfbc2817703a9647ddd99765ac432156482023-05-27 16:07:4112 hrs 18 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0x211a970bb9e5c2f7648e73a04e43f7ad516d11326161e5219e61cb12d46557e0432147822023-05-27 15:35:5012 hrs 50 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0xc2b25e6ee8374e08fb9f48e33837cc5f14c5fd95920c4800574d2e5f9ed00a9f432140482023-05-27 15:08:1413 hrs 18 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0xfc98165921a156972822b70179873e66cd1376c51f1b7c2410c8a647a9178cdd432140482023-05-27 15:08:1413 hrs 18 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0x691f3f63bc079f5794f00041c47103eca826d0c375074881b5c665396e559580432131982023-05-27 14:38:0413 hrs 48 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0x1105a44b21099303a188c62613b136dfb4b5d9fb39043797b405810669b37c76432131912023-05-27 14:37:5013 hrs 48 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0x667e573974a2196d1d24f233f61c07929073ffbac6267eaa3b282cd44f704e7e432131342023-05-27 14:35:4813 hrs 50 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0xf6bb11cfe551973d68fefda0171c23dc71cf47d62a0a02f65584380cca6de817432130562023-05-27 14:33:0413 hrs 53 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0xcd90bde7f77275a33dec1b196b8c84776db395ba512befd47dd1db4a88ee6c31432128812023-05-27 14:26:5213 hrs 59 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0x7a6c40a7223bce6ac3295c13085e15f2ffd909625801fc5ff7e46f75fb6d8b4f432127922023-05-27 14:23:4214 hrs 2 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0x50eba586e3a61b47263dea1dda453eb26b2e5a773d4b9faca9c2e0091670f77b432074862023-05-27 11:14:2017 hrs 11 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0x9bcc6c0bd634a4c2e08ddd3d3251eacd157ae56dfb6f77e7f7fed8debe2ac764432074712023-05-27 11:13:4817 hrs 12 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0x6e8a5e535cd4fe6a5e2d7e9e1fcec988e98e5e2107f35ffd79a71b21d640c058432074632023-05-27 11:13:3217 hrs 12 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0xe73b1f1d68804a0c206be903bb84f1865440a8674a5838326426ea16067dceee432074402023-05-27 11:12:4417 hrs 13 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
0x2fa80c3d1d18da87808748b22d476ceaef18115b3e36c136f1db70745e0d5a65432074262023-05-27 11:12:1417 hrs 14 mins ago 0x38c4092b28dab7f3d98ee6524549571c283cdfa5  Contract Creation0 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GelatoPineCore

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 1 of 2: GelatoPineCore.sol
// SPDX-License-Identifier: GPL-3.0

//
// Original work by Pine.Finance
//  - https://github.com/pine-finance
//
// Authors:
//  - Ignacio Mazzara <@nachomazzara>
//  - Agustin Aguilar <@agusx1211>

// solhint-disable-next-line
pragma solidity 0.6.12;

import {PineCore, IModule, IERC20} from "./PineCore.sol";

contract GelatoPineCore is PineCore {
    // solhint-disable-next-line var-name-mixedcase
    address public immutable GELATO;

    constructor(address _gelato) public {
        GELATO = _gelato;
    }

    modifier onlyGelato {
        require(GELATO == msg.sender, "GelatoPineCore: onlyGelato");
        _;
    }

    function executeOrder(
        IModule _module,
        IERC20 _inputToken,
        address payable _owner,
        bytes calldata _data,
        bytes calldata _signature,
        bytes calldata _auxData
    ) public override onlyGelato {
        super.executeOrder(
            _module,
            _inputToken,
            _owner,
            _data,
            _signature,
            _auxData
        );
    }
}

File 2 of 2: PineCore.sol
/**
 *Submitted for verification at Etherscan.io on 2020-08-30
 */

/**
 *Submitted for verification at Etherscan.io on 2020-08-30
 */

// SPDX-License-Identifier: GPL-3.0
//
// Original work by Pine.Finance
//  - https://github.com/pine-finance
//
// Authors:
//  - Ignacio Mazzara <@nachomazzara>
//  - Agustin Aguilar <@agusx1211>

//
//
//                                                /
//                                                @,
//                                               /&&
//                                              &&%%&/
//                                            &%%%%&%%,..
//                                         */%&,*&&&&&&%%&*
//                                           /&%%%%%%%#.
//                                    ./%&%%%&#/%%%%&#&%%%&#(*.
//                                         .%%%%%%%&&%&/ ..,...
//                                       .*,%%%%%%%%%&&%%%%(
//                                     ,&&%%%&&*%%%%%%%%.*(#%&/
//                                  ./,(*,*,#%%%%%%%%%%%%%%%(,
//                                 ,(%%%%%%%%%%%%&%%%%%%%%%#&&%%%#/(*
//                                     *#%%%%%%%&%%%&%%#%%%%%%(
//                              .(####%%&%&#*&%%##%%%%%%%%%%%#.,,
//                                      ,&%%%%%###%%%%%%%%%%%%#&&.
//                             ..,(&%%%%%%%%%%%%%%%%%%&&%%%%#%&&%&%%%%&&#,
//                           ,##//%((#*/#%%%%%%%%%%%%%%%%%%%%%&(.
//                                  (%%%%%%%%%%%%%%%%%%%#%%%%%%%%%&&&&#(*,
//                                   ./%%%%&%%%%#%&%%%%%%##%%&&&&%%(*,
//                                #%%%%%%&&%%%#%%%%%%%%%%%%%%%&#,*&&#.
//                            /%##%(%&/ #%%%%%%%%%%%%%%%%%%%%%%%%%&%%%.
//                                 *&%%%%&%%%%%%%%#%%%%%%%%%%%%%%%%%&%%%#%#%%,
//                        .*(#&%%%%%%%%&&%%%%%%%%%%#%%%%%%%%%%%%%%%(,
//                    ./#%%%%%%%%%%%%%%%%%%%%%%%#%&%#%%%%%%%%%%%%%%%%%%%%&%%%#####(.
//                          .,,*#%%%%%%%%%%%%%##%%&&%#%%%%%%%%&&%%%%%%(&*#&**/(*
//                        .,(&%%%%%#((%%%%%%#%%%%%%%%%#%%%%%%%&&&&&%%%%&%*
//                         ,,,,,..*&%%%%%%%%%%%%%%%%%%%%%%%&%%%%%%%%%#/*.
//                           ,#&%%%%%%%%%%%%%%%%%%%%%%%%&%%%%%%%%%%%%%%%%%%/,
//           .     .,*(#%%%%%%%%%&&&&%%%%%%&&&%%%%%%%%%&&%##%%%%%#,(%%%%%%%%%%%(((*
//             ,/((%%%%%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%%%%%%%&#  . . ...
//                      .,.,,**(%%%%%%%%&%##%%%%%%%%%%%%%%%%%%###%%%%%%%%%&*
//                       ,%&%%%%%&&%%%%%%%#%%%%%%%%%%%%%%%%%%&%%%%##%%%%%%%%%%%%%%%%&&#.
//              .(&&&%%%%%%&#&&%&%%%%%%%##%%%%&&%%%#%%%%%%&%%%%%%&&%%%%&&&/*(,(#(,,.
//                         ..&%%%%%%#%#%%%%%%%%%%%##%%%%%%%&%%%%%%%%%%%%%%%%&&(.
//                      ,%%%%%%%%%##%%%&%%%%%%%%&%%#%%&&%%%%&%%%%%%&%%%%%&(#%%%#,
//              ./%&%%%%%%%%%%%%%%%%%%%%%%%%%&&&%%%##%%%%%%%%%%%%%&&&%%%%%%%%&#.//*/,..
//      ,#%%%%%%%%%%%%%%%%%%&&%%%%%&&&&%%%%%&&&%%%%%#%%%%#%%%%%%%%%%%%%%%%%%%%%%%%%%&&(,..
//            ,#* ,&&&%,.,*(%%%%%%%%%&%%%%&&&%%%%%&%%%%#%%%%##%%%%%%%&&%%%%%%%%%%%#%%%%%%%%&%(*.
//          .,,/((#%&%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&%#%%%%%%%%%%%%%%%%%#%%%%%%%((*
// *,//**,...,/#%%%%%%%%%%%&&&&%%%%%%%%%%%%%#%%%%%%&&&%%%%&&&&%%%#%%#%%%%%%%%%%%%%%%#*.       .,(#%&@*
//  .*%%(*(%%%%%%%%%%&&&&&&&&%%%%%%%&&%%%%%%%%%%%%%&&&%%%%%%%%%##%%%%%%%%%%%%%%%%%%%%%%%%%%%&%%%/..
//      .,/%&%%%%%%@#(&%&%%%%%%%%%#&&%%##%#%%%#%%%%&&&%%%%%%%%###%%%%%&&&%%%%%%%%%%%%%%%%&(//%%/
//          ,..     .(%%%%##%%%#%%%%%%#%%%%%##%%%%%&&&&%%%%%%%#&%#%%%%%%&&&%%%%%##//  ,,.
//            .,(%#%%##%%%#%%%#%%%#%%*,.*%%%%%%%%%&.,/&%%%%%%% #&%%#%%%%%&%(&%((%&&&(*
//                        ,/#/(%%,    ,&%%#%/.//         %*&(%#    .(,(%%%.

pragma solidity 0.6.12;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: contracts/libs/ECDSA.sol

/**
 * @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 {
    /**
     * @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)
    {
        // Check the signature length
        if (signature.length != 65) {
            revert("ECDSA: invalid signature length");
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        // 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 (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): 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
        ) {
            revert("ECDSA: invalid signature 's' value");
        }

        if (v != 27 && v != 28) {
            revert("ECDSA: invalid signature 'v' value");
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
     * JSON-RPC method.
     *
     * 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)
            );
    }
}

// File: contracts/interfaces/IERC20.sol

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

// File: contracts/libs/Fabric.sol

/**
 * @title Fabric
 * @dev Create deterministics vaults.
 *
 * Original work by Pine.Finance
 * - https://github.com/pine-finance
 *
 * Authors:
 * - Agustin Aguilar <agusx1211>
 * - Ignacio Mazzara <nachomazzara>
 */
library Fabric {
    /*Vault bytecode

        def _fallback() payable:
            call cd[56] with:
                funct call.data[0 len 4]
                gas cd[56] wei
                args call.data[4 len 64]
            selfdestruct(tx.origin)

        // Constructor bytecode
        0x6012600081600A8239f3

        0x60 12 - PUSH1 12           // Size of the contract to return
        0x60 00 - PUSH1 00           // Memory offset to return stored code
        0x81    - DUP2  12           // Size of code to copy
        0x60 0a - PUSH1 0A           // Start of the code to copy
        0x82    - DUP3  00           // Dest memory for code copy
        0x39    - CODECOPY 00 0A 12  // Code copy to memory
        0xf3    - RETURN 00 12       // Return code to store

        // Deployed contract bytecode
        0x60008060448082803781806038355AF132FF

        0x60 00 - PUSH1 00                    // Size for the call output
        0x80    - DUP1  00                    // Offset for the call output
        0x60 44 - PUSH1 44                    // Size for the call input
        0x80    - DUP1  44                    // Size for copying calldata to memory
        0x82    - DUP3  00                    // Offset for calldata copy
        0x80    - DUP1  00                    // Offset for destination of calldata copy
        0x37    - CALLDATACOPY 00 00 44       // Execute calldata copy, is going to be used for next call
        0x81    - DUP2  00                    // Offset for call input
        0x80    - DUP1  00                    // Amount of ETH to send during call
        0x60 38 - PUSH1 38                    // calldata pointer to load value into stack
        0x35    - CALLDATALOAD 38 (A)         // Load value (A), address to call
        0x5a    - GAS                         // Remaining gas
        0xf1    - CALL (A) (A) 00 00 44 00 00 // Execute call to address (A) with calldata mem[0:64]
        0x32    - ORIGIN (B)                  // Dest funds for selfdestruct
        0xff    - SELFDESTRUCT (B)            // selfdestruct contract, end of execution
    */
    bytes public constant code =
        hex"6012600081600A8239F360008060448082803781806038355AF132FF";
    bytes32 public constant vaultCodeHash =
        bytes32(
            0xfa3da1081bc86587310fce8f3a5309785fc567b9b20875900cb289302d6bfa97
        );

    /**
     * @dev Get a deterministics vault.
     */
    function getVault(bytes32 _key) internal view returns (address) {
        return
            address(
                uint256(
                    keccak256(
                        abi.encodePacked(
                            bytes1(0xff),
                            address(this),
                            _key,
                            vaultCodeHash
                        )
                    )
                )
            );
    }

    /**
     * @dev Create deterministic vault.
     */
    function executeVault(
        bytes32 _key,
        IERC20 _token,
        address _to
    ) internal returns (uint256 value) {
        address addr;
        bytes memory slotcode = code;

        /* solium-disable-next-line */
        assembly {
            // Create the contract arguments for the constructor
            addr := create2(0, add(slotcode, 0x20), mload(slotcode), _key)
        }

        value = _token.balanceOf(addr);
        /* solium-disable-next-line */
        (bool success, ) =
            addr.call(
                abi.encodePacked(
                    abi.encodeWithSelector(
                        _token.transfer.selector,
                        _to,
                        value
                    ),
                    address(_token)
                )
            );

        require(success, "Error pulling tokens");
    }
}

// File: contracts/interfaces/IModule.sol

/**
 * Original work by Pine.Finance
 * - https://github.com/pine-finance
 *
 * Authors:
 * - Ignacio Mazzara <nachomazzara>
 * - Agustin Aguilar <agusx1211>
 */
interface IModule {
    /// @notice receive ETH
    receive() external payable;

    /**
     * @notice Executes an order
     * @param _inputToken - Address of the input token
     * @param _inputAmount - uint256 of the input token amount (order amount)
     * @param _owner - Address of the order's owner
     * @param _data - Bytes of the order's data
     * @param _auxData - Bytes of the auxiliar data used for the handlers to execute the order
     * @return bought - amount of output token bought
     */
    function execute(
        IERC20 _inputToken,
        uint256 _inputAmount,
        address payable _owner,
        bytes calldata _data,
        bytes calldata _auxData
    ) external returns (uint256 bought);

    /**
     * @notice Check whether an order can be executed or not
     * @param _inputToken - Address of the input token
     * @param _inputAmount - uint256 of the input token amount (order amount)
     * @param _data - Bytes of the order's data
     * @param _auxData - Bytes of the auxiliar data used for the handlers to execute the order
     * @return bool - whether the order can be executed or not
     */
    function canExecute(
        IERC20 _inputToken,
        uint256 _inputAmount,
        bytes calldata _data,
        bytes calldata _auxData
    ) external view returns (bool);
}

// File: contracts/commons/Order.sol

contract Order {
    address public constant ETH_ADDRESS =
        address(0x00eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee);
}

// File: contracts/PineCore.sol

/**
 * Original work by Pine.Finance
 * - https://github.com/pine-finance
 *
 * Authors:
 * - Ignacio Mazzara <nachomazzara>
 * - Agustin Aguilar <agusx1211>
 */
abstract contract PineCore is Order {
    using SafeMath for uint256;
    using Fabric for bytes32;

    // ETH orders
    mapping(bytes32 => uint256) public ethDeposits;

    // Events
    event DepositETH(
        bytes32 indexed _key,
        address indexed _caller,
        uint256 _amount,
        bytes _data
    );

    event OrderExecuted(
        bytes32 indexed _key,
        address _inputToken,
        address _owner,
        address _witness,
        bytes _data,
        bytes _auxData,
        uint256 _amount,
        uint256 _bought
    );

    event OrderCancelled(
        bytes32 indexed _key,
        address _inputToken,
        address _owner,
        address _witness,
        bytes _data,
        uint256 _amount
    );

    /**
     * @dev Prevent users to send Ether directly to this contract
     */
    receive() external payable {
        require(
            msg.sender != tx.origin,
            "PineCore#receive: NO_SEND_ETH_PLEASE"
        );
    }

    /**
     * @notice Create an ETH to token order
     * @param _data - Bytes of an ETH to token order. See `encodeEthOrder` for more info
     */
    function depositEth(bytes calldata _data) external payable {
        require(msg.value > 0, "PineCore#depositEth: VALUE_IS_0");

        (
            address module,
            address inputToken,
            address payable owner,
            address witness,
            bytes memory data,

        ) = decodeOrder(_data);

        require(
            inputToken == ETH_ADDRESS,
            "PineCore#depositEth: WRONG_INPUT_TOKEN"
        );

        bytes32 key =
            keyOf(
                IModule(uint160(module)),
                IERC20(inputToken),
                owner,
                witness,
                data
            );

        ethDeposits[key] = ethDeposits[key].add(msg.value);
        emit DepositETH(key, msg.sender, msg.value, _data);
    }

    /**
     * @notice Cancel order
     * @dev The params should be the same used for the order creation
     * @param _module - Address of the module to use for the order execution
     * @param _inputToken - Address of the input token
     * @param _owner - Address of the order's owner
     * @param _witness - Address of the witness
     * @param _data - Bytes of the order's data
     */
    function cancelOrder(
        IModule _module,
        IERC20 _inputToken,
        address payable _owner,
        address _witness,
        bytes calldata _data
    ) external {
        require(msg.sender == _owner, "PineCore#cancelOrder: INVALID_OWNER");
        bytes32 key = keyOf(_module, _inputToken, _owner, _witness, _data);

        uint256 amount = _pullOrder(_inputToken, key, msg.sender);

        emit OrderCancelled(
            key,
            address(_inputToken),
            _owner,
            _witness,
            _data,
            amount
        );
    }

    /**
     * @notice Get the calldata needed to create a token to token/ETH order
     * @dev Returns the input data that the user needs to use to create the order
     * The _secret is used to prevent a front-running at the order execution
     * The _amount is used as the param `_value` for the ERC20 `transfer` function
     * @param _module - Address of the module to use for the order execution
     * @param _inputToken - Address of the input token
     * @param _owner - Address of the order's owner
     * @param _witness - Address of the witness
     * @param _data - Bytes of the order's data
     * @param _secret - Private key of the _witness
     * @param _amount - uint256 of the order amount
     * @return bytes - input data to send the transaction
     */
    function encodeTokenOrder(
        IModule _module,
        IERC20 _inputToken,
        address payable _owner,
        address _witness,
        bytes calldata _data,
        bytes32 _secret,
        uint256 _amount
    ) external view returns (bytes memory) {
        return
            abi.encodeWithSelector(
                _inputToken.transfer.selector,
                vaultOfOrder(_module, _inputToken, _owner, _witness, _data),
                _amount,
                abi.encode(
                    _module,
                    _inputToken,
                    _owner,
                    _witness,
                    _data,
                    _secret
                )
            );
    }

    /**
     * @notice Get the calldata needed to create a ETH to token order
     * @dev Returns the input data that the user needs to use to create the order
     * The _secret is used to prevent a front-running at the order execution
     * @param _module - Address of the module to use for the order execution
     * @param _inputToken - Address of the input token
     * @param _owner - Address of the order's owner
     * @param _witness - Address of the witness
     * @param _data - Bytes of the order's data
     * @param _secret -  Private key of the _witness
     * @return bytes - input data to send the transaction
     */
    function encodeEthOrder(
        address _module,
        address _inputToken,
        address payable _owner,
        address _witness,
        bytes calldata _data,
        bytes32 _secret
    ) external pure returns (bytes memory) {
        return
            abi.encode(_module, _inputToken, _owner, _witness, _data, _secret);
    }

    /**
     * @notice Get order's properties
     * @param _data - Bytes of the order
     * @return module - Address of the module to use for the order execution
     * @return inputToken - Address of the input token
     * @return owner - Address of the order's owner
     * @return witness - Address of the witness
     * @return data - Bytes of the order's data
     * @return secret -  Private key of the _witness
     */
    function decodeOrder(bytes memory _data)
        public
        pure
        returns (
            address module,
            address inputToken,
            address payable owner,
            address witness,
            bytes memory data,
            bytes32 secret
        )
    {
        (module, inputToken, owner, witness, data, secret) = abi.decode(
            _data,
            (address, address, address, address, bytes, bytes32)
        );
    }

    /**
     * @notice Get the vault's address of a token to token/ETH order
     * @param _module - Address of the module to use for the order execution
     * @param _inputToken - Address of the input token
     * @param _owner - Address of the order's owner
     * @param _witness - Address of the witness
     * @param _data - Bytes of the order's data
     * @return address - The address of the vault
     */
    function vaultOfOrder(
        IModule _module,
        IERC20 _inputToken,
        address payable _owner,
        address _witness,
        bytes memory _data
    ) public view returns (address) {
        return keyOf(_module, _inputToken, _owner, _witness, _data).getVault();
    }

    /**
     * @notice Executes an order
     * @dev The sender should use the _secret to sign its own address
     * to prevent front-runnings
     * @param _module - Address of the module to use for the order execution
     * @param _inputToken - Address of the input token
     * @param _owner - Address of the order's owner
     * @param _data - Bytes of the order's data
     * @param _signature - Signature to calculate the witness
     * @param _auxData - Bytes of the auxiliar data used for the handlers to execute the order
     */
    function executeOrder(
        IModule _module,
        IERC20 _inputToken,
        address payable _owner,
        bytes calldata _data,
        bytes calldata _signature,
        bytes calldata _auxData
    ) public virtual {
        // Calculate witness using signature
        address witness =
            ECDSA.recover(keccak256(abi.encodePacked(msg.sender)), _signature);

        bytes32 key = keyOf(_module, _inputToken, _owner, witness, _data);

        // Pull amount
        uint256 amount = _pullOrder(_inputToken, key, address(_module));
        require(amount > 0, "PineCore#executeOrder: INVALID_ORDER");

        uint256 bought =
            _module.execute(_inputToken, amount, _owner, _data, _auxData);

        emit OrderExecuted(
            key,
            address(_inputToken),
            _owner,
            witness,
            _data,
            _auxData,
            amount,
            bought
        );
    }

    /**
     * @notice Check whether an order exists or not
     * @dev Check the balance of the order
     * @param _module - Address of the module to use for the order execution
     * @param _inputToken - Address of the input token
     * @param _owner - Address of the order's owner
     * @param _witness - Address of the witness
     * @param _data - Bytes of the order's data
     * @return bool - whether the order exists or not
     */
    function existOrder(
        IModule _module,
        IERC20 _inputToken,
        address payable _owner,
        address _witness,
        bytes calldata _data
    ) external view returns (bool) {
        bytes32 key = keyOf(_module, _inputToken, _owner, _witness, _data);

        if (address(_inputToken) == ETH_ADDRESS) {
            return ethDeposits[key] != 0;
        } else {
            return _inputToken.balanceOf(key.getVault()) != 0;
        }
    }

    /**
     * @notice Check whether an order can be executed or not
     * @param _module - Address of the module to use for the order execution
     * @param _inputToken - Address of the input token
     * @param _owner - Address of the order's owner
     * @param _witness - Address of the witness
     * @param _data - Bytes of the order's data
     * @param _auxData - Bytes of the auxiliar data used for the handlers to execute the order
     * @return bool - whether the order can be executed or not
     */
    function canExecuteOrder(
        IModule _module,
        IERC20 _inputToken,
        address payable _owner,
        address _witness,
        bytes calldata _data,
        bytes calldata _auxData
    ) external view returns (bool) {
        bytes32 key = keyOf(_module, _inputToken, _owner, _witness, _data);

        // Pull amount
        uint256 amount;
        if (address(_inputToken) == ETH_ADDRESS) {
            amount = ethDeposits[key];
        } else {
            amount = _inputToken.balanceOf(key.getVault());
        }

        return _module.canExecute(_inputToken, amount, _data, _auxData);
    }

    /**
     * @notice Transfer the order amount to a recipient.
     * @dev For an ETH order, the ETH will be transferred from this contract
     * For a token order, its vault will be executed transferring the amount of tokens to
     * the recipient
     * @param _inputToken - Address of the input token
     * @param _key - Order's key
     * @param _to - Address of the recipient
     * @return amount - amount transferred
     */
    function _pullOrder(
        IERC20 _inputToken,
        bytes32 _key,
        address payable _to
    ) private returns (uint256 amount) {
        if (address(_inputToken) == ETH_ADDRESS) {
            amount = ethDeposits[_key];
            ethDeposits[_key] = 0;
            (bool success, ) = _to.call{value: amount}("");
            require(success, "PineCore#_pullOrder: PULL_ETHER_FAILED");
        } else {
            amount = _key.executeVault(_inputToken, _to);
        }
    }

    /**
     * @notice Get the order's key
     * @param _module - Address of the module to use for the order execution
     * @param _inputToken - Address of the input token
     * @param _owner - Address of the order's owner
     * @param _witness - Address of the witness
     * @param _data - Bytes of the order's data
     * @return bytes32 - order's key
     */
    function keyOf(
        IModule _module,
        IERC20 _inputToken,
        address payable _owner,
        address _witness,
        bytes memory _data
    ) public pure returns (bytes32) {
        return
            keccak256(
                abi.encode(_module, _inputToken, _owner, _witness, _data)
            );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_gelato","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_data","type":"bytes"}],"name":"DepositETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_inputToken","type":"address"},{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"address","name":"_witness","type":"address"},{"indexed":false,"internalType":"bytes","name":"_data","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"OrderCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_inputToken","type":"address"},{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"address","name":"_witness","type":"address"},{"indexed":false,"internalType":"bytes","name":"_data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_auxData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_bought","type":"uint256"}],"name":"OrderExecuted","type":"event"},{"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GELATO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IModule","name":"_module","type":"address"},{"internalType":"contract IERC20","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"_auxData","type":"bytes"}],"name":"canExecuteOrder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IModule","name":"_module","type":"address"},{"internalType":"contract IERC20","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"cancelOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"decodeOrder","outputs":[{"internalType":"address","name":"module","type":"address"},{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"address payable","name":"owner","type":"address"},{"internalType":"address","name":"witness","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes32","name":"secret","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"depositEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_module","type":"address"},{"internalType":"address","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes32","name":"_secret","type":"bytes32"}],"name":"encodeEthOrder","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"contract IModule","name":"_module","type":"address"},{"internalType":"contract IERC20","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes32","name":"_secret","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"encodeTokenOrder","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"ethDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IModule","name":"_module","type":"address"},{"internalType":"contract IERC20","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"bytes","name":"_auxData","type":"bytes"}],"name":"executeOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IModule","name":"_module","type":"address"},{"internalType":"contract IERC20","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"existOrder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IModule","name":"_module","type":"address"},{"internalType":"contract IERC20","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"keyOf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"contract IModule","name":"_module","type":"address"},{"internalType":"contract IERC20","name":"_inputToken","type":"address"},{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_witness","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"vaultOfOrder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a060405234801561001057600080fd5b506040516120443803806120448339818101604052602081101561003357600080fd5b5051606081901b6001600160601b0319166080526001600160a01b0316611fd861006c600039806113ce528061158a5250611fd86000f3fe6080604052600436106100c55760003560e01c8063b4c075471161007f578063e55060c511610059578063e55060c51461084e578063e8ecb1301461098a578063ebd9c39c14610a2d578063eff557a714610a575761010b565b8063b4c0754714610534578063d6fc0263146106a4578063d7665a48146107ab5761010b565b806286f48f146101105780630d7cf2ad1461020557806313a76c4c146102f05780632bd470d31461035e57806345d0508b14610476578063a734f06e1461051f5761010b565b3661010b57333214156101095760405162461bcd60e51b8152600401808060200182810382526024815260200180611f7f6024913960400191505060405180910390fd5b005b600080fd5b34801561011c57600080fd5b506101e9600480360360a081101561013357600080fd5b6001600160a01b03823581169260208101358216926040820135831692606083013516919081019060a081016080820135600160201b81111561017557600080fd5b82018360208201111561018757600080fd5b803590602001918460018302840111600160201b831117156101a857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a6c945050505050565b604080516001600160a01b039092168252519081900360200190f35b34801561021157600080fd5b506102de600480360360a081101561022857600080fd5b6001600160a01b03823581169260208101358216926040820135831692606083013516919081019060a081016080820135600160201b81111561026a57600080fd5b82018360208201111561027c57600080fd5b803590602001918460018302840111600160201b8311171561029d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a8d945050505050565b60408051918252519081900360200190f35b6101096004803603602081101561030657600080fd5b810190602081018135600160201b81111561032057600080fd5b82018360208201111561033257600080fd5b803590602001918460018302840111600160201b8311171561035357600080fd5b509092509050610b67565b34801561036a57600080fd5b50610401600480360360c081101561038157600080fd5b6001600160a01b03823581169260208101358216926040820135831692606083013516919081019060a081016080820135600160201b8111156103c357600080fd5b8201836020820111156103d557600080fd5b803590602001918460018302840111600160201b831117156103f657600080fd5b919350915035610d24565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561043b578181015183820152602001610423565b50505050905090810190601f1680156104685780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561048257600080fd5b50610401600480360360e081101561049957600080fd5b6001600160a01b03823581169260208101358216926040820135831692606083013516919081019060a081016080820135600160201b8111156104db57600080fd5b8201836020820111156104ed57600080fd5b803590602001918460018302840111600160201b8311171561050e57600080fd5b919350915080359060200135610dc9565b34801561052b57600080fd5b506101e9610f78565b34801561054057600080fd5b506105e56004803603602081101561055757600080fd5b810190602081018135600160201b81111561057157600080fd5b82018360208201111561058357600080fd5b803590602001918460018302840111600160201b831117156105a457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610f90945050505050565b60405180876001600160a01b03168152602001866001600160a01b03168152602001856001600160a01b03168152602001846001600160a01b0316815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561066457818101518382015260200161064c565b50505050905090810190601f1680156106915780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b3480156106b057600080fd5b50610797600480360360c08110156106c757600080fd5b6001600160a01b03823581169260208101358216926040820135831692606083013516919081019060a081016080820135600160201b81111561070957600080fd5b82018360208201111561071b57600080fd5b803590602001918460018302840111600160201b8311171561073c57600080fd5b919390929091602081019035600160201b81111561075957600080fd5b82018360208201111561076b57600080fd5b803590602001918460018302840111600160201b8311171561078c57600080fd5b509092509050611091565b604080519115158252519081900360200190f35b3480156107b757600080fd5b50610109600480360360a08110156107ce57600080fd5b6001600160a01b03823581169260208101358216926040820135831692606083013516919081019060a081016080820135600160201b81111561081057600080fd5b82018360208201111561082257600080fd5b803590602001918460018302840111600160201b8311171561084357600080fd5b509092509050611289565b34801561085a57600080fd5b50610109600480360360c081101561087157600080fd5b6001600160a01b0382358116926020810135821692604082013590921691810190608081016060820135600160201b8111156108ac57600080fd5b8201836020820111156108be57600080fd5b803590602001918460018302840111600160201b831117156108df57600080fd5b919390929091602081019035600160201b8111156108fc57600080fd5b82018360208201111561090e57600080fd5b803590602001918460018302840111600160201b8311171561092f57600080fd5b919390929091602081019035600160201b81111561094c57600080fd5b82018360208201111561095e57600080fd5b803590602001918460018302840111600160201b8311171561097f57600080fd5b5090925090506113cc565b34801561099657600080fd5b50610797600480360360a08110156109ad57600080fd5b6001600160a01b03823581169260208101358216926040820135831692606083013516919081019060a081016080820135600160201b8111156109ef57600080fd5b820183602082011115610a0157600080fd5b803590602001918460018302840111600160201b83111715610a2257600080fd5b509092509050611465565b348015610a3957600080fd5b506102de60048036036020811015610a5057600080fd5b5035611576565b348015610a6357600080fd5b506101e9611588565b6000610a83610a7e8787878787610a8d565b6115ac565b9695505050505050565b6000858585858560405160200180866001600160a01b03168152602001856001600160a01b03168152602001846001600160a01b03168152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610b10578181015183820152602001610af8565b50505050905090810190601f168015610b3d5780820380516001836020036101000a031916815260200191505b50965050505050505060405160208183030381529060405280519060200120905095945050505050565b60003411610bbc576040805162461bcd60e51b815260206004820152601f60248201527f50696e65436f7265236465706f7369744574683a2056414c55455f49535f3000604482015290519081900360640190fd5b6000806000806060610c0387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610f9092505050565b509450945094509450945073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0316846001600160a01b031614610c725760405162461bcd60e51b8152600401808060200182810382526026815260200180611eee6026913960400191505060405180910390fd5b6000610c818686868686610a8d565b600081815260208190526040902054909150610c9d9034611617565b60008281526020818152604091829020929092558051348082529281018281529181018a9052339284927f294738b98bcebacf616fd72532d3d8d8d229807bf03b68b25681bfbbdb3d3fe5928d918d919060608201848480828437600083820152604051601f909101601f1916909201829003965090945050505050a35050505050505050565b60608787878787878760405160200180886001600160a01b03168152602001876001600160a01b03168152602001866001600160a01b03168152602001856001600160a01b0316815260200180602001838152602001828103825285858281815260200192508082843760008382015260408051601f909201601f19908116909401828103909401825292909252509950505050505050505050979650505050505050565b606063a9059cbb60e01b610e168a8a8a8a8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a6c92505050565b838b8b8b8b8b8b8b60405160200180886001600160a01b03168152602001876001600160a01b03168152602001866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925080828437600081840152601f19601f8201169050808301925050509850505050505050505060405160208183030381529060405260405160240180846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610f04578181015183820152602001610eec565b50505050905090810190601f168015610f315780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990981697909717909652509394505050505098975050505050505050565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b600080600080606060008680602001905160c0811015610faf57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b821115610fe957600080fd5b908301906020820185811115610ffe57600080fd5b8251600160201b81118282018810171561101757600080fd5b82525081516020918201929091019080838360005b8381101561104457818101518382015260200161102c565b50505050905090810190601f1680156110715780820380516001836020036101000a031916815260200191505b5060405260200151969e959d50939b509199509750929550909350505050565b6000806110d78a8a8a8a8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a8d92505050565b905060006001600160a01b038a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156111155750600081815260208190526040902054611199565b896001600160a01b03166370a0823161112d846115ac565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561116a57600080fd5b505afa15801561117e573d6000803e3d6000fd5b505050506040513d602081101561119457600080fd5b505190505b8a6001600160a01b031663fd516dab8b838a8a8a8a6040518763ffffffff1660e01b815260040180876001600160a01b0316815260200186815260200180602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600081840152601f19601f8201169050808301925050509850505050505050505060206040518083038186803b15801561124e57600080fd5b505afa158015611262573d6000803e3d6000fd5b505050506040513d602081101561127857600080fd5b50519b9a5050505050505050505050565b336001600160a01b038516146112d05760405162461bcd60e51b8152600401808060200182810382526023815260200180611f3a6023913960400191505060405180910390fd5b60006113158787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a8d92505050565b90506000611324878333611678565b9050817f2063eea53914d2615730712acb14000b23d3e8ae6ab97b9beff35f05b7bba15188888888888760405180876001600160a01b03168152602001866001600160a01b03168152602001856001600160a01b03168152602001806020018381526020018281038252858582818152602001925080828437600083820152604051601f909101601f1916909201829003995090975050505050505050a25050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163314611449576040805162461bcd60e51b815260206004820152601a60248201527f47656c61746f50696e65436f72653a206f6e6c7947656c61746f000000000000604482015290519081900360640190fd5b61145a89898989898989898961175d565b505050505050505050565b6000806114ab8888888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a8d92505050565b90506001600160a01b03871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156114ea5760009081526020819052604090205415159050610a83565b866001600160a01b03166370a08231611502836115ac565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561153f57600080fd5b505afa158015611553573d6000803e3d6000fd5b505050506040513d602081101561156957600080fd5b505115159150610a839050565b60006020819052908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b604080516001600160f81b03196020808301919091523060601b602183015260358201939093527ffa3da1081bc86587310fce8f3a5309785fc567b9b20875900cb289302d6bfa97605580830191909152825180830390910181526075909101909152805191012090565b600082820183811015611671576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561174a575060008281526020819052604080822080549083905590519091906001600160a01b0384169083908381818185875af1925050503d80600081146116ff576040519150601f19603f3d011682016040523d82523d6000602084013e611704565b606091505b50509050806117445760405162461bcd60e51b8152600401808060200182810382526026815260200180611f146026913960400191505060405180910390fd5b50611671565b611755838584611a4e565b949350505050565b60006117d13360405160200180826001600160a01b031660601b81526014019150506040516020818303038152906040528051906020012086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cc692505050565b905060006118188b8b8b858c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a8d92505050565b905060006118278b838e611678565b9050600081116118685760405162461bcd60e51b8152600401808060200182810382526024815260200180611ea86024913960400191505060405180910390fd5b60008c6001600160a01b031663e7ed35e38d848e8e8e8c8c6040518863ffffffff1660e01b815260040180886001600160a01b03168152602001878152602001866001600160a01b0316815260200180602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600081840152601f19601f8201169050808301925050509950505050505050505050602060405180830381600087803b15801561193257600080fd5b505af1158015611946573d6000803e3d6000fd5b505050506040513d602081101561195c57600080fd5b81019080805190602001909291905050509050827f56afc5839271b796eaa6426e31b9ad823d483abb96183586e52970a9602b39058d8d878e8e8c8c8a8a604051808a6001600160a01b03168152602001896001600160a01b03168152602001886001600160a01b0316815260200180602001806020018581526020018481526020018381038352898982818152602001925080828437600083820152601f01601f191690910184810383528781526020019050878780828437600083820152604051601f909101601f19169092018290039d50909b505050505050505050505050a250505050505050505050505050565b60008060606040518060400160405280601c81526020017f6012600081600a8239f360008060448082803781806038355af132ff000000008152509050858151602083016000f59150846001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ae457600080fd5b505afa158015611af8573d6000803e3d6000fd5b505050506040513d6020811015611b0e57600080fd5b5051604080516001600160a01b03878116602483015260448083018590528351808403909101815260649092018352602082810180516001600160e01b031663a9059cbb60e01b17815293518351959850600095928816948b93919092019182918083835b60208310611b925780518252601f199092019160209182019101611b73565b6001836020036101000a038019825116818451168082178552505050505050905001826001600160a01b031660601b8152601401925050506040516020818303038152906040526040518082805190602001908083835b60208310611c085780518252601f199092019160209182019101611be9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611c6a576040519150601f19603f3d011682016040523d82523d6000602084013e611c6f565b606091505b5050905080611cbc576040805162461bcd60e51b81526020600482015260146024820152734572726f722070756c6c696e6720746f6b656e7360601b604482015290519081900360640190fd5b5050509392505050565b60008151604114611d1e576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611d8f5760405162461bcd60e51b8152600401808060200182810382526022815260200180611ecc6022913960400191505060405180910390fd5b8060ff16601b14158015611da757508060ff16601c14155b15611de35760405162461bcd60e51b8152600401808060200182810382526022815260200180611f5d6022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611e3f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610a83576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fdfe50696e65436f726523657865637574654f726465723a20494e56414c49445f4f5244455245434453413a20696e76616c6964207369676e6174757265202773272076616c756550696e65436f7265236465706f7369744574683a2057524f4e475f494e5055545f544f4b454e50696e65436f7265235f70756c6c4f726465723a2050554c4c5f45544845525f4641494c454450696e65436f72652363616e63656c4f726465723a20494e56414c49445f4f574e455245434453413a20696e76616c6964207369676e6174757265202776272076616c756550696e65436f726523726563656976653a204e4f5f53454e445f4554485f504c45415345a264697066735822122039c94aae189c78d2bbe1139a3c9dcaf0c37268b05ac68626127e715bf1466ab564736f6c634300060c00330000000000000000000000007598e84b2e114ab62cab288ce5f7d5f6bad35bba

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

0000000000000000000000007598e84b2e114ab62cab288ce5f7d5f6bad35bba

-----Decoded View---------------
Arg [0] : _gelato (address): 0x7598e84b2e114ab62cab288ce5f7d5f6bad35bba

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007598e84b2e114ab62cab288ce5f7d5f6bad35bba


Deployed ByteCode Sourcemap

313:736:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22457:10:1;22471:9;22457:23;;22436:106;;;;-1:-1:-1;;;22436:106:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;313:736:0;;;;;28236:284:1;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28236:284:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28236:284:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28236:284:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28236:284:1;;-1:-1:-1;28236:284:1;;-1:-1:-1;;;;;28236:284:1:i;:::-;;;;-1:-1:-1;;;;;28236:284:1;;;;;;;;;;;;;;33362:324;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33362:324:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33362:324:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33362:324:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33362:324:1;;-1:-1:-1;33362:324:1;;-1:-1:-1;;;;;33362:324:1:i;:::-;;;;;;;;;;;;;;;;22704:778;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22704:778:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22704:778:1;;;;;;;;;;-1:-1:-1;22704:778:1;;-1:-1:-1;22704:778:1;-1:-1:-1;22704:778:1;:::i;26587:336::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26587:336:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26587:336:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26587:336:1;;;;;;;;;;;;-1:-1:-1;26587:336:1;-1:-1:-1;26587:336:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25242:703;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25242:703:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25242:703:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25242:703:1;;;;;;;;;;;;-1:-1:-1;25242:703:1;-1:-1:-1;25242:703:1;;;;;;;:::i;21266:99::-;;;;;;;;;;;;;:::i;27357:458::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27357:458:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27357:458:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27357:458:1;;-1:-1:-1;27357:458:1;;-1:-1:-1;;;;;27357:458:1:i;:::-;;;;;-1:-1:-1;;;;;27357:458:1;;;;;;-1:-1:-1;;;;;27357:458:1;;;;;;-1:-1:-1;;;;;27357:458:1;;;;;;-1:-1:-1;;;;;27357:458:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31441:616;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31441:616:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31441:616:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31441:616:1;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31441:616:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31441:616:1;;;;;;;;;;-1:-1:-1;31441:616:1;;-1:-1:-1;31441:616:1;-1:-1:-1;31441:616:1;:::i;:::-;;;;;;;;;;;;;;;;;;23882:578;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23882:578:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23882:578:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23882:578:1;;;;;;;;;;-1:-1:-1;23882:578:1;;-1:-1:-1;23882:578:1;-1:-1:-1;23882:578:1;:::i;633:414:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;633:414:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;633:414:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;633:414:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;633:414:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;633:414:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;633:414:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;633:414:0;;;;;;;;;;-1:-1:-1;633:414:0;;-1:-1:-1;633:414:0;-1:-1:-1;633:414:0;:::i;30457:463:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30457:463:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30457:463:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30457:463:1;;;;;;;;;;-1:-1:-1;30457:463:1;;-1:-1:-1;30457:463:1;-1:-1:-1;30457:463:1;:::i;21688:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21688:46:1;;:::i;407:31:0:-;;;;;;;;;;;;;:::i;28236:284:1:-;28424:7;28450:63;:52;28456:7;28465:11;28478:6;28486:8;28496:5;28450;:52::i;:::-;:61;:63::i;:::-;28443:70;28236:284;-1:-1:-1;;;;;;28236:284:1:o;33362:324::-;33543:7;33619;33628:11;33641:6;33649:8;33659:5;33608:57;;;;;;-1:-1:-1;;;;;33608:57:1;;;;;;-1:-1:-1;;;;;33608:57:1;;;;;;-1:-1:-1;;;;;33608:57:1;;;;;;-1:-1:-1;;;;;33608:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33581:98;;;;;;33562:117;;33362:324;;;;;;;:::o;22704:778::-;22793:1;22781:9;:13;22773:57;;;;;-1:-1:-1;;;22773:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;22855:14;22883:18;22915:21;22950:15;22979:17;23011:18;23023:5;;23011:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23011:11:1;;-1:-1:-1;;;23011:18:1:i;:::-;22841:188;;;;;;;;;;;21320:44;-1:-1:-1;;;;;23061:25:1;:10;-1:-1:-1;;;;;23061:25:1;;23040:110;;;;-1:-1:-1;;;23040:110:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23161:11;23187:167;23226:6;23259:10;23288:5;23311:7;23336:4;23187:5;:167::i;:::-;23384:11;:16;;;;;;;;;;;23161:193;;-1:-1:-1;23384:31:1;;23405:9;23384:20;:31::i;:::-;23365:11;:16;;;;;;;;;;;;:50;;;;23430:45;;23458:9;23430:45;;;;;;;;;;;;;;;23446:10;;23377:3;;23430:45;;23469:5;;;;23430:45;;;;23469:5;;;;23430:45;;;;;;;;;;;;;-1:-1:-1;;23430:45:1;;;;;;;;-1:-1:-1;23430:45:1;;-1:-1:-1;;;;;23430:45:1;22704:778;;;;;;;;:::o;26587:336::-;26807:12;26861:7;26870:11;26883:6;26891:8;26901:5;;26908:7;26850:66;;;;;;-1:-1:-1;;;;;26850:66:1;;;;;;-1:-1:-1;;;;;26850:66:1;;;;;;-1:-1:-1;;;;;26850:66:1;;;;;;-1:-1:-1;;;;;26850:66:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26850:66:1;;;;;;;;;;;;;;;;;;-1:-1:-1;26850:66:1;-1:-1:-1;;;;;;;;;;26587:336:1;;;;;;;;;:::o;25242:703::-;25488:12;25571:29;;;25618:59;25631:7;25640:11;25653:6;25661:8;25671:5;;25618:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25618:12:1;;-1:-1:-1;;;25618:59:1:i;:::-;25695:7;25752;25781:11;25814:6;25842:8;25872:5;;25899:7;25720:204;;;;;;-1:-1:-1;;;;;25720:204:1;;;;;;-1:-1:-1;;;;;25720:204:1;;;;;;-1:-1:-1;;;;;25720:204:1;;;;;;-1:-1:-1;;;;;25720:204:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25531:407;;;;;;-1:-1:-1;;;;;25531:407:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25531:407:1;;;-1:-1:-1;;25531:407:1;;;;;;;;;;;;;;-1:-1:-1;;;;;25531:407:1;-1:-1:-1;;;;;;25531:407:1;;;;;;;;;;-1:-1:-1;25531:407:1;;-1:-1:-1;;;;;25242:703:1;;;;;;;;;;:::o;21266:99::-;21320:44;21266:99;:::o;27357:458::-;27456:14;27484:18;27516:21;27551:15;27580:17;27611:14;27727:5;27703:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27703:105:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27703:105:1;;;;;;-1:-1:-1;27703:105:1;;;;;;;;;;-1:-1:-1;27703:105:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27703:105:1;;;;;27650:158;;;;-1:-1:-1;27650:158:1;;-1:-1:-1;27650:158:1;;-1:-1:-1;27650:158:1;-1:-1:-1;27703:105:1;;-1:-1:-1;27357:458:1;;-1:-1:-1;;;;27357:458:1:o;31441:616::-;31669:4;31685:11;31699:52;31705:7;31714:11;31727:6;31735:8;31745:5;;31699:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31699:5:1;;-1:-1:-1;;;31699:52:1:i;:::-;31685:66;-1:-1:-1;31785:14:1;-1:-1:-1;;;;;31813:35:1;;21320:44;31813:35;31809:168;;;-1:-1:-1;31873:11:1;:16;;;;;;;;;;;31809:168;;;31929:11;-1:-1:-1;;;;;31929:21:1;;31951:14;:3;:12;:14::i;:::-;31929:37;;;;;;;;;;;;;-1:-1:-1;;;;;31929:37:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31929:37:1;;-1:-1:-1;31809:168:1;31994:7;-1:-1:-1;;;;;31994:18:1;;32013:11;32026:6;32034:5;;32041:8;;31994:56;;;;;;;;;;;;;-1:-1:-1;;;;;31994:56:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31994:56:1;;;;;;;;;;;;;;;-1:-1:-1;31994:56:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31994:56:1;;31441:616;-1:-1:-1;;;;;;;;;;;31441:616:1:o;23882:578::-;24077:10;-1:-1:-1;;;;;24077:20:1;;;24069:68;;;;-1:-1:-1;;;24069:68:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24147:11;24161:52;24167:7;24176:11;24189:6;24197:8;24207:5;;24161:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24161:5:1;;-1:-1:-1;;;24161:52:1:i;:::-;24147:66;;24224:14;24241:40;24252:11;24265:3;24270:10;24241;:40::i;:::-;24224:57;;24325:3;24297:156;24350:11;24376:6;24396:8;24418:5;;24437:6;24297:156;;;;-1:-1:-1;;;;;24297:156:1;;;;;;-1:-1:-1;;;;;24297:156:1;;;;;;-1:-1:-1;;;;;24297:156:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24297:156:1;;;;;;;;-1:-1:-1;24297:156:1;;-1:-1:-1;;;;;;;;24297:156:1;23882:578;;;;;;;;:::o;633:414:0:-;558:6;-1:-1:-1;;;;;558:20:0;568:10;558:20;550:59;;;;;-1:-1:-1;;;550:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;881:159:::1;913:7;934:11;959:6;979:5;;998:10;;1022:8;;881:18;:159::i;:::-;633:414:::0;;;;;;;;;:::o;30457:463:1:-;30647:4;30663:11;30677:52;30683:7;30692:11;30705:6;30713:8;30723:5;;30677:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30677:5:1;;-1:-1:-1;;;30677:52:1:i;:::-;30663:66;-1:-1:-1;;;;;;30744:35:1;;21320:44;30744:35;30740:174;;;30802:11;:16;;;;;;;;;;;:21;;;-1:-1:-1;30795:28:1;;30740:174;30861:11;-1:-1:-1;;;;;30861:21:1;;30883:14;:3;:12;:14::i;:::-;30861:37;;;;;;;;;;;;;-1:-1:-1;;;;;30861:37:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30861:37:1;:42;;;-1:-1:-1;30854:49:1;;-1:-1:-1;30854:49:1;21688:46;;;;;;;;;;;;;;:::o;407:31:0:-;;;:::o;18298:447:1:-;18480:204;;;-1:-1:-1;;;;;;18480:204:1;;;;;;;;18576:4;18480:204;;;;;;;;;;;;;18159:66;18480:204;;;;;;;;;;;;;;;;;;;;;;;;;18445:261;;;;;;18298:447::o;4618:176::-;4676:7;4707:5;;;4730:6;;;;4722:46;;;;;-1:-1:-1;;;4722:46:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;4786:1;4618:176;-1:-1:-1;;;4618:176:1:o;32500:488::-;32622:14;-1:-1:-1;;;;;32652:35:1;;21320:44;32652:35;32648:334;;;-1:-1:-1;32712:11:1;:17;;;;;;;;;;;;;32743:21;;;;32797:27;;32712:17;;:11;-1:-1:-1;;;;;32797:8:1;;;32712:17;;:11;32797:27;32712:11;32797:27;32712:17;32797:8;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32778:46;;;32846:7;32838:58;;;;-1:-1:-1;;;32838:58:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32648:334;;;;32936:35;:4;32954:11;32967:3;32936:17;:35::i;:::-;32927:44;32500:488;-1:-1:-1;;;;32500:488:1:o;29067:939::-;29348:15;29378:66;29419:10;29402:28;;;;;;-1:-1:-1;;;;;29402:28:1;;;;;;;;;;;;;;;;;;;;;;29392:39;;;;;;29433:10;;29378:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29378:13:1;;-1:-1:-1;;;29378:66:1:i;:::-;29348:96;;29455:11;29469:51;29475:7;29484:11;29497:6;29505:7;29514:5;;29469:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29469:5:1;;-1:-1:-1;;;29469:51:1:i;:::-;29455:65;;29554:14;29571:46;29582:11;29595:3;29608:7;29571:10;:46::i;:::-;29554:63;;29644:1;29635:6;:10;29627:59;;;;-1:-1:-1;;;29627:59:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29697:14;29726:7;-1:-1:-1;;;;;29726:15:1;;29742:11;29755:6;29763;29771:5;;29778:8;;29726:61;;;;;;;;;;;;;-1:-1:-1;;;;;29726:61:1;;;;;;;;;;;-1:-1:-1;;;;;29726:61:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29726:61:1;;;;;;;;;;;;;;;-1:-1:-1;29726:61:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29697:90;;29830:3;29803:196;29855:11;29881:6;29901:7;29922:5;;29941:8;;29963:6;29983;29803:196;;;;-1:-1:-1;;;;;29803:196:1;;;;;;-1:-1:-1;;;;;29803:196:1;;;;;;-1:-1:-1;;;;;29803:196:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29803:196:1;;;;;;;;;;;;;;;-1:-1:-1;29803:196:1;;;;;;;;;;;;;;;;;-1:-1:-1;;29803:196:1;;;;;;;;-1:-1:-1;29803:196:1;;-1:-1:-1;;;;;;;;;;;;29803:196:1;29067:939;;;;;;;;;;;;;:::o;18807:863::-;18919:13;18944:12;18966:21;18990:4;;;;;;;;;;;;;;;;;18966:28;;19189:4;19178:8;19172:15;19165:4;19155:8;19151:19;19148:1;19140:54;19132:62;;19222:6;-1:-1:-1;;;;;19222:16:1;;19239:4;19222:22;;;;;;;;;;;;;-1:-1:-1;;;;;19222:22:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19222:22:1;19389:154;;;-1:-1:-1;;;;;19389:154:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19222:22;19389:154;;;;;-1:-1:-1;;;;;19389:154:1;-1:-1:-1;;;19389:154:1;;;19351:247;;;;19222:22;;-1:-1:-1;19294:12:1;;19324:9;;;;19573:6;;19351:247;;;;;;;;;19389:154;19351:247;;;;;;;;;;-1:-1:-1;;19351:247:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19351:247:1;;;;;;;;;;;;;;;;;;;;;;;19324:288;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19324:288:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19293:319;;;19631:7;19623:40;;;;;-1:-1:-1;;;19623:40:1;;;;;;;;;;;;-1:-1:-1;;;19623:40:1;;;;;;;;;;;;;;;18807:863;;;;;;;;:::o;10028:2130::-;10130:7;10195:9;:16;10215:2;10195:22;10191:94;;10233:41;;;-1:-1:-1;;;10233:41:1;;;;;;;;;;;;;;;;;;;;;;;;;;;10191:94;10635:4;10620:20;;10614:27;10680:4;10665:20;;10659:27;10733:4;10718:20;;10712:27;10351:9;10704:36;11676:66;11651:91;;11634:188;;;11767:44;;-1:-1:-1;;;11767:44:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11634:188;11836:1;:7;;11841:2;11836:7;;:18;;;;;11847:1;:7;;11852:2;11847:7;;11836:18;11832:93;;;11870:44;;-1:-1:-1;;;11870:44:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11832:93;12019:14;12036:24;12046:4;12052:1;12055;12058;12036:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12036:24:1;;-1:-1:-1;;12036:24:1;;;-1:-1:-1;;;;;;;12078:20:1;;12070:57;;;;;-1:-1:-1;;;12070:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://39c94aae189c78d2bbe1139a3c9dcaf0c37268b05ac68626127e715bf1466ab5
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.