Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
GelatoPineCore
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity Multiple files format)
// 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 ); } }
/** *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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.