Contract Overview
Balance:
0 MATIC
MATIC Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x36cd20cdd0542a309754958ea5fa8f58503fd6b200a334f9b4ac059fc64d4fb0 | Register As Prov... | 24461874 | 491 days 23 hrs ago | 0xfdec0386011d085a6b4f0e37fab5d7f2601acb33 | IN | 0x5e9405888255c142207ab692c72a8cd6fc85c3a2 | 0 MATIC | 0.000049848701 | |
0x6db764353fc0328bf0317da5bd057198c2874c669313fc9bd3910aaf92cd6435 | 0x60a06040 | 24460663 | 491 days 23 hrs ago | 0x42c1bbf9c3a2daaec18c78eb68847693d5279968 | IN | Create: Router | 0 MATIC | 0.05646904 |
[ Download CSV Export ]
Contract Name:
Router
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-02-02 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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); } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards 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). * * 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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))) } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { // 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. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "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 * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } interface IConsumerBase { function rawReceiveData(uint256 _price, bytes32 _requestId) external; } /** * @title RequestIdBase * * @dev A contract used by ConsumerBase and Router to generate requestIds * */ contract RequestIdBase { /** * @dev makeRequestId generates a requestId * * @param _dataConsumer address of consumer contract * @param _dataProvider address of provider * @param _router address of Router contract * @param _requestNonce uint256 request nonce * @param _data bytes32 hex encoded data endpoint * * @return bytes32 requestId */ function makeRequestId( address _dataConsumer, address _dataProvider, address _router, uint256 _requestNonce, bytes32 _data) internal pure returns (bytes32) { return keccak256(abi.encodePacked(_dataConsumer, _dataProvider, _router, _requestNonce, _data)); } } /** * @title Router smart contract * * @dev Routes requests for data from Consumers to data providers. * Data providers listen for requests and process data, sending it back to the * Consumer's smart contract. * * An ERC-20 Token fee is charged by the provider, and paid for by the consumer * */ contract Router is RequestIdBase, ReentrancyGuard { using SafeMath for uint256; using Address for address; /* * CONSTANTS */ uint8 public constant REQUEST_STATUS_NOT_SET = 0; uint8 public constant REQUEST_STATUS_REQUESTED = 1; /* * STRUCTURES */ struct DataRequest { address consumer; address provider; uint256 fee; uint8 status; } struct DataProvider { uint256 minFee; mapping(address => uint256) granularFees; // Per consumer fees if required } /* * STATE VARS */ // Contract address of ERC-20 Token being used to pay for data IERC20 private immutable token; // Mapping to hold registered providers mapping(address => DataProvider) private dataProviders; // Mapping to hold open data requests mapping(bytes32 => DataRequest) public dataRequests; // nonces for generating requestIds. Must be in sync with the consumer's // nonces defined in ConsumerBase.sol. mapping(address => mapping(address => uint256)) private nonces; // Mapping to track accumulated provider earnings upon request fulfillment. mapping(address => uint256) private withdrawableTokens; /* * EVENTS */ /** * @dev DataRequested. Emitted when a data request is sent by a Consumer. * @param consumer address of the Consumer's contract * @param provider address of the data provider * @param fee amount of xFUND paid for data request * @param data data being requested * @param requestId the request ID */ event DataRequested( address indexed consumer, address indexed provider, uint256 fee, bytes32 data, bytes32 indexed requestId ); /** * @dev RequestFulfilled. Emitted when a provider fulfils a data request * @param consumer address of the Consumer's contract * @param provider address of the data provider * @param requestId the request ID being fulfilled * @param requestedData the data sent to the Consumer's contract */ event RequestFulfilled( address indexed consumer, address indexed provider, bytes32 indexed requestId, uint256 requestedData ); /** * @dev TokenSet. Emitted once during contract construction * @param tokenAddress contract address of token being used to pay fees */ event TokenSet(address tokenAddress); /** * @dev ProviderRegistered. Emitted when a provider registers * @param provider address of the provider * @param minFee new fee value */ event ProviderRegistered(address indexed provider, uint256 minFee); /** * @dev SetProviderMinFee. Emitted when a provider changes their minimum token fee for providing data * @param provider address of the provider * @param oldMinFee old fee value * @param newMinFee new fee value */ event SetProviderMinFee(address indexed provider, uint256 oldMinFee, uint256 newMinFee); /** * @dev SetProviderGranularFee. Emitted when a provider changes their token fee for providing data * to a selected consumer contract * @param provider address of the provider * @param consumer address of the consumer * @param oldFee old fee value * @param newFee new fee value */ event SetProviderGranularFee(address indexed provider, address indexed consumer, uint256 oldFee, uint256 newFee); /** * @dev WithdrawFees. Emitted when a provider withdraws their accumulated fees * @param provider address of the provider withdrawing * @param recipient address of the recipient * @param amount uint256 amount being withdrawn */ event WithdrawFees(address indexed provider, address indexed recipient, uint256 amount); /* * FUNCTIONS */ /** * @dev Contract constructor. Accepts the address for a Token smart contract. * @param _token address must be for an ERC-20 token (e.g. xFUND) */ constructor(address _token) { require(_token != address(0), "token cannot be zero address"); require(_token.isContract(), "token address must be a contract"); token = IERC20(_token); emit TokenSet(_token); } /** * @dev registerAsProvider - register as a provider * @param _minFee uint256 - minimum fee provider will accept to fulfill request * @return success */ function registerAsProvider(uint256 _minFee) external returns (bool success) { require(_minFee > 0, "fee must be > 0"); require(dataProviders[msg.sender].minFee == 0, "already registered"); dataProviders[msg.sender].minFee = _minFee; emit ProviderRegistered(msg.sender, _minFee); return true; } /** * @dev setProviderMinFee - provider calls for setting its minimum fee * @param _newMinFee uint256 - minimum fee provider will accept to fulfill request * @return success */ function setProviderMinFee(uint256 _newMinFee) external returns (bool success) { require(_newMinFee > 0, "fee must be > 0"); require(dataProviders[msg.sender].minFee > 0, "not registered yet"); uint256 oldMinFee = dataProviders[msg.sender].minFee; dataProviders[msg.sender].minFee = _newMinFee; emit SetProviderMinFee(msg.sender, oldMinFee, _newMinFee); return true; } /** * @dev setProviderGranularFee - provider calls for setting its fee for the selected consumer * @param _consumer address of consumer contract * @param _newFee uint256 - minimum fee provider will accept to fulfill request * @return success */ function setProviderGranularFee(address _consumer, uint256 _newFee) external returns (bool success) { require(_newFee > 0, "fee must be > 0"); require(dataProviders[msg.sender].minFee > 0, "not registered yet"); uint256 oldFee = dataProviders[msg.sender].granularFees[_consumer]; dataProviders[msg.sender].granularFees[_consumer] = _newFee; emit SetProviderGranularFee(msg.sender, _consumer, oldFee, _newFee); return true; } /** * @dev Allows the provider to withdraw their xFUND * @param _recipient is the address the funds will be sent to * @param _amount is the amount of xFUND transferred from the Coordinator contract */ function withdraw(address _recipient, uint256 _amount) external hasAvailableTokens(_amount) { withdrawableTokens[msg.sender] = withdrawableTokens[msg.sender].sub(_amount); emit WithdrawFees(msg.sender, _recipient, _amount); assert(token.transfer(_recipient, _amount)); } /** * @dev initialiseRequest - called by Consumer contract to initialise a data request. Can only be called by * a contract. Daata providers can watch for the DataRequested being emitted, and act on any requests * for the provider. Only the provider specified in the request may fulfil the request. * @param _provider address of the data provider. * @param _fee amount of Tokens to pay for data * @param _data type of data being requested. E.g. PRICE.BTC.USD.AVG requests average price for BTC/USD pair * @return success if the execution was successful. Status is checked in the Consumer contract */ function initialiseRequest( address _provider, uint256 _fee, bytes32 _data ) external paidSufficientFee(_fee, _provider) nonReentrant returns (bool success) { address consumer = msg.sender; // msg.sender is the address of the Consumer's smart contract require(address(consumer).isContract(), "only a contract can initialise"); require(dataProviders[_provider].minFee > 0, "provider not registered"); token.transferFrom(consumer, address(this), _fee); uint256 nonce = nonces[_provider][consumer]; // recreate request ID from params sent bytes32 requestId = makeRequestId(consumer, _provider, address(this), nonce, _data); dataRequests[requestId].consumer = consumer; dataRequests[requestId].provider = _provider; dataRequests[requestId].fee = _fee; dataRequests[requestId].status = REQUEST_STATUS_REQUESTED; // Transfer successful - emit the DataRequested event emit DataRequested( consumer, _provider, _fee, _data, requestId ); nonces[_provider][consumer] = nonces[_provider][consumer].add(1); return true; } /** * @dev fulfillRequest - called by data provider to forward data to the Consumer. Only the specified provider * may fulfil the data request. * @param _requestId the request the provider is sending data for * @param _requestedData the data to send * @param _signature data provider's signature of the _requestId, _requestedData and Consumer's address * this will used to validate the data's origin in the Consumer's contract * @return success if the execution was successful. */ function fulfillRequest(bytes32 _requestId, uint256 _requestedData, bytes memory _signature) external nonReentrant returns (bool){ require(dataProviders[msg.sender].minFee > 0, "provider not registered"); require(dataRequests[_requestId].status == REQUEST_STATUS_REQUESTED, "request does not exist"); address consumer = dataRequests[_requestId].consumer; address provider = dataRequests[_requestId].provider; uint256 fee = dataRequests[_requestId].fee; // signature must be valid. msg.sender must match // 1. the provider in the request // 2. the address recovered from the signature bytes32 message = ECDSA.toEthSignedMessageHash(keccak256(abi.encodePacked(_requestId, _requestedData, consumer))); address recoveredProvider = ECDSA.recover(message, _signature); // msg.sender is the address of the data provider require(msg.sender == provider && msg.sender == recoveredProvider && recoveredProvider == provider, "ECDSA.recover mismatch - correct provider and data?" ); emit RequestFulfilled( consumer, msg.sender, _requestId, _requestedData ); delete dataRequests[_requestId]; withdrawableTokens[provider] = withdrawableTokens[provider].add(fee); // All checks have passed - send the data to the consumer contract // consumer will see msg.sender as the Router's contract address // using functionCall from OZ's Address library IConsumerBase cb; // just used to get the rawReceiveData function's selector require(gasleft() >= 400000, "not enough gas"); consumer.functionCall(abi.encodeWithSelector(cb.rawReceiveData.selector, _requestedData, _requestId)); return true; } /** * @dev getTokenAddress - get the contract address of the Token being used for paying fees * @return address of the token smart contract */ function getTokenAddress() external view returns (address) { return address(token); } /** * @dev getDataRequestConsumer - get the consumer for a request * @param _requestId bytes32 request id * @return address data consumer contract address */ function getDataRequestConsumer(bytes32 _requestId) external view returns (address) { return dataRequests[_requestId].consumer; } /** * @dev getDataRequestProvider - get the consumer for a request * @param _requestId bytes32 request id * @return address data provider address */ function getDataRequestProvider(bytes32 _requestId) external view returns (address) { return dataRequests[_requestId].provider; } /** * @dev requestExists - check a request ID exists * @param _requestId bytes32 request id * @return bool */ function requestExists(bytes32 _requestId) external view returns (bool) { return dataRequests[_requestId].status != REQUEST_STATUS_NOT_SET; } /** * @dev getRequestStatus - check a request status * 0 = does not exist/not yet initialised * 1 = Request initialised * @param _requestId bytes32 request id * @return bool */ function getRequestStatus(bytes32 _requestId) external view returns (uint8) { return dataRequests[_requestId].status; } /** * @dev getProviderMinFee - returns minimum fee provider will accept to fulfill data request * @param _provider address of data provider * @return uint256 */ function getProviderMinFee(address _provider) external view returns (uint256) { return dataProviders[_provider].minFee; } /** * @dev getProviderGranularFee - returns fee provider will accept to fulfill data request * for the given consumer * @param _provider address of data provider * @param _consumer address of consumer contract * @return uint256 */ function getProviderGranularFee(address _provider, address _consumer) external view returns (uint256) { if(dataProviders[_provider].granularFees[_consumer] > 0) { return dataProviders[_provider].granularFees[_consumer]; } else { return dataProviders[_provider].minFee; } } /** * @dev getWithdrawableTokens - returns withdrawable tokens for the given provider * @param _provider address of data provider * @return uint256 */ function getWithdrawableTokens(address _provider) external view returns (uint256) { return withdrawableTokens[_provider]; } /** * @dev Reverts if amount is not at least what the provider has set as their min fee * @param _feePaid The payment for the request * @param _provider address of the provider */ modifier paidSufficientFee(uint256 _feePaid, address _provider) { require(_feePaid > 0, "fee cannot be zero"); if(dataProviders[_provider].granularFees[msg.sender] > 0) { require(_feePaid >= dataProviders[_provider].granularFees[msg.sender], "below agreed granular fee"); } else { require(_feePaid >= dataProviders[_provider].minFee, "below agreed min fee"); } _; } /** * @dev Reverts if amount requested is greater than withdrawable balance * @param _amount The given amount to compare to `withdrawableTokens` */ modifier hasAvailableTokens(uint256 _amount) { require(withdrawableTokens[msg.sender] >= _amount, "can't withdraw more than balance"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"consumer","type":"address"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"data","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"DataRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"minFee","type":"uint256"}],"name":"ProviderRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"consumer","type":"address"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"requestedData","type":"uint256"}],"name":"RequestFulfilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":true,"internalType":"address","name":"consumer","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"SetProviderGranularFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldMinFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMinFee","type":"uint256"}],"name":"SetProviderMinFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawFees","type":"event"},{"inputs":[],"name":"REQUEST_STATUS_NOT_SET","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REQUEST_STATUS_REQUESTED","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"dataRequests","outputs":[{"internalType":"address","name":"consumer","type":"address"},{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_requestId","type":"bytes32"},{"internalType":"uint256","name":"_requestedData","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"fulfillRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_requestId","type":"bytes32"}],"name":"getDataRequestConsumer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_requestId","type":"bytes32"}],"name":"getDataRequestProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_provider","type":"address"},{"internalType":"address","name":"_consumer","type":"address"}],"name":"getProviderGranularFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_provider","type":"address"}],"name":"getProviderMinFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_requestId","type":"bytes32"}],"name":"getRequestStatus","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_provider","type":"address"}],"name":"getWithdrawableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_provider","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"initialiseRequest","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minFee","type":"uint256"}],"name":"registerAsProvider","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_requestId","type":"bytes32"}],"name":"requestExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_consumer","type":"address"},{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setProviderGranularFee","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMinFee","type":"uint256"}],"name":"setProviderMinFee","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b50604051620019ba380380620019ba83398101604081905262000034916200015d565b60016000556001600160a01b038116620000955760405162461bcd60e51b815260206004820152601c60248201527f746f6b656e2063616e6e6f74206265207a65726f20616464726573730000000060448201526064015b60405180910390fd5b620000b4816001600160a01b03166200015760201b6200110f1760201c565b620001025760405162461bcd60e51b815260206004820181905260248201527f746f6b656e2061646472657373206d757374206265206120636f6e747261637460448201526064016200008c565b606081901b6001600160601b0319166080526040516001600160a01b03821681527fa07c91c183e42229e705a9795a1c06d76528b673788b849597364528c96eefb79060200160405180910390a1506200018d565b3b151590565b6000602082840312156200016f578081fd5b81516001600160a01b038116811462000186578182fd5b9392505050565b60805160601c611800620001ba60003960008181610138015281816109c50152610e8801526118006000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806345d07664116100a2578063f1bbc76a11610071578063f1bbc76a14610309578063f3fef3a31461031c578063f515b60014610331578063f530411a14610344578063ffe0982e146103575761010b565b806345d07664146102ae5780635232ef42146102e65780636f171812146102ee5780637ff28fa7146103015761010b565b80631b74d046116100de5780631b74d046146101ac57806328e7d709146101e45780632de0cd241461025957806338dcb96f146102855761010b565b806301f1432d1461011057806310fe9ae81461013657806311f8edd9146101705780631a5d147314610183575b600080fd5b61012361011e366004611543565b61036a565b6040519081526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b03909116815260200161012d565b61012361017e366004611529565b6103ea565b6101586101913660046115f0565b6000908152600260205260409020546001600160a01b031690565b6101d46101ba3660046115f0565b60009081526002602052604090206003015460ff16151590565b604051901515815260200161012d565b61022b6101f23660046115f0565b600260208190526000918252604090912080546001820154928201546003909201546001600160a01b0391821693909116919060ff1684565b604080516001600160a01b0395861681529490931660208501529183015260ff16606082015260800161012d565b6101586102673660046115f0565b6000908152600260205260409020600101546001600160a01b031690565b610123610293366004611529565b6001600160a01b031660009081526004602052604090205490565b6102d46102bc3660046115f0565b60009081526002602052604090206003015460ff1690565b60405160ff909116815260200161012d565b6102d4600181565b6101d46102fc366004611608565b610409565b6102d4600081565b6101d46103173660046115f0565b610807565b61032f61032a366004611575565b6108d3565b005b6101d461033f3660046115f0565b610a60565b6101d4610352366004611575565b610b27565b6101d461036536600461159e565b610c09565b6001600160a01b038083166000908152600160208181526040808420948616845293909101905290812054156103c957506001600160a01b038083166000908152600160208181526040808420948616845293909101905220546103e4565b506001600160a01b0382166000908152600160205260409020545b92915050565b6001600160a01b0381166000908152600160205260409020545b919050565b6000600260005414156104635760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000908155338152600160205260409020546104bd5760405162461bcd60e51b81526020600482015260176024820152761c1c9bdd9a59195c881b9bdd081c9959da5cdd195c9959604a1b604482015260640161045a565b60008481526002602052604090206003015460ff1660011461051a5760405162461bcd60e51b81526020600482015260166024820152751c995c5d595cdd08191bd95cc81b9bdd08195e1a5cdd60521b604482015260640161045a565b600084815260026020818152604080842080546001820154919094015482519384018a9052918301889052606084811b6bffffffffffffffffffffffff1916908401526001600160a01b039384169493169290916105de90607401604051602081830303815290604052805190602001206040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b905060006105ec8288611115565b9050336001600160a01b03851614801561060e5750336001600160a01b038216145b801561062b5750836001600160a01b0316816001600160a01b0316145b6106935760405162461bcd60e51b815260206004820152603360248201527f45434453412e7265636f766572206d69736d61746368202d20636f72726563746044820152722070726f766964657220616e6420646174613f60681b606482015260840161045a565b88336001600160a01b0316866001600160a01b03167ff583670c1cbc98b1818384b70c30a178114600cb3ae010c993699941635ddc128b6040516106d991815260200190565b60405180910390a4600089815260026020818152604080842080546001600160a01b0319908116825560018201805490911690559283018490556003909201805460ff191690556001600160a01b03871683526004905290205461073d9084611190565b6001600160a01b03851660009081526004602052604081209190915562061a805a101561079d5760405162461bcd60e51b815260206004820152600e60248201526d6e6f7420656e6f7567682067617360901b604482015260640161045a565b60408051602481018b905260448082018d90528251808303909101815260649091019091526020810180516001600160e01b03166325a6243960e21b1790526107f0906001600160a01b038816906111a3565b506001965050505050505060016000559392505050565b60008082116108285760405162461bcd60e51b815260040161045a90611716565b336000908152600160205260409020546108795760405162461bcd60e51b81526020600482015260126024820152711b9bdd081c9959da5cdd195c9959081e595d60721b604482015260640161045a565b33600081815260016020908152604091829020805490869055825181815291820186905292917fdd72a509f9596098442d5d8b5404752e038a5c99e14fe53b8a285f15cc20e757910160405180910390a250600192915050565b3360009081526004602052604090205481908111156109345760405162461bcd60e51b815260206004820181905260248201527f63616e2774207769746864726177206d6f7265207468616e2062616c616e6365604482015260640161045a565b3360009081526004602052604090205461094e90836111e5565b3360008181526004602090815260409182902093909355518481526001600160a01b038616927f4f1b51dd7a2fcb861aa2670f668be66835c4ee12b4bbbf037e4d0018f39819e4910160405180910390a360405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b158015610a0957600080fd5b505af1158015610a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4191906115d0565b610a5b57634e487b7160e01b600052600160045260246000fd5b505050565b6000808211610a815760405162461bcd60e51b815260040161045a90611716565b3360009081526001602052604090205415610ad35760405162461bcd60e51b8152602060048201526012602482015271185b1c9958591e481c9959da5cdd195c995960721b604482015260640161045a565b3360008181526001602052604090819020849055517f90c9734131c1e4fb36cde2d71e6feb93fb258f71be8a85411c173d25e1516e8090610b179085815260200190565b60405180910390a2506001919050565b6000808211610b485760405162461bcd60e51b815260040161045a90611716565b33600090815260016020526040902054610b995760405162461bcd60e51b81526020600482015260126024820152711b9bdd081c9959da5cdd195c9959081e595d60721b604482015260640161045a565b3360008181526001602081815260408084206001600160a01b038916808652930182529283902080549087905583518181529182018790529391927f36c5f9c4314e16078da10914c2c4431b9ca89c620da3c581bb73d402a01da06d910160405180910390a35060019392505050565b6000828460008211610c525760405162461bcd60e51b81526020600482015260126024820152716665652063616e6e6f74206265207a65726f60701b604482015260640161045a565b6001600160a01b0381166000908152600160208181526040808420338552909201905290205415610cf7576001600160a01b03811660009081526001602081815260408084203385529092019052902054821015610cf25760405162461bcd60e51b815260206004820152601960248201527f62656c6f7720616772656564206772616e756c61722066656500000000000000604482015260640161045a565b610d56565b6001600160a01b038116600090815260016020526040902054821015610d565760405162461bcd60e51b815260206004820152601460248201527362656c6f7720616772656564206d696e2066656560601b604482015260640161045a565b60026000541415610da95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161045a565b600260005533803b610dfd5760405162461bcd60e51b815260206004820152601e60248201527f6f6e6c79206120636f6e74726163742063616e20696e697469616c6973650000604482015260640161045a565b6001600160a01b038716600090815260016020526040902054610e5c5760405162461bcd60e51b81526020600482015260176024820152761c1c9bdd9a59195c881b9bdd081c9959da5cdd195c9959604a1b604482015260640161045a565b6040516323b872dd60e01b81526001600160a01b038281166004830152306024830152604482018890527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401602060405180830381600087803b158015610ecc57600080fd5b505af1158015610ee0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0491906115d0565b506001600160a01b03878116600090815260036020908152604080832093851683529281528282205483516bffffffffffffffffffffffff19606087811b8216838601528d811b8216603484015230901b166048820152605c8101829052607c8082018b905285518083039091018152609c909101909452835193909101929092209050826002600083815260200190815260200160002060000160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550886002600083815260200190815260200160002060010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555087600260008381526020019081526020016000206002018190555060016002600083815260200190815260200160002060030160006101000a81548160ff021916908360ff16021790555080896001600160a01b0316846001600160a01b03167f547392811f4eab1074705e8d6a5a91322c67e4565b3781b385e03f649f1b38cb8b8b604051611098929190918252602082015260400190565b60405180910390a46001600160a01b03808a166000908152600360209081526040808320938716835292905220546110d1906001611190565b6001600160a01b03998a16600090815260036020908152604080832096909c1682529490945298832098909855506001908190559695505050505050565b3b151590565b600081516041146111685760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161045a565b60208201516040830151606084015160001a611186868285856111f1565b9695505050505050565b600061119c828461173f565b9392505050565b606061119c83836040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061139a565b600061119c8284611757565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561126e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161045a565b8360ff16601b148061128357508360ff16601c145b6112da5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161045a565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa15801561132e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166113915760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161045a565b95945050505050565b60606113a984846000856113b1565b949350505050565b6060824710156114125760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161045a565b843b6114605760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161045a565b600080866001600160a01b0316858760405161147c91906116c7565b60006040518083038185875af1925050503d80600081146114b9576040519150601f19603f3d011682016040523d82523d6000602084013e6114be565b606091505b50915091506114ce8282866114d9565b979650505050505050565b606083156114e857508161119c565b8251156114f85782518084602001fd5b8160405162461bcd60e51b815260040161045a91906116e3565b80356001600160a01b038116811461040457600080fd5b60006020828403121561153a578081fd5b61119c82611512565b60008060408385031215611555578081fd5b61155e83611512565b915061156c60208401611512565b90509250929050565b60008060408385031215611587578182fd5b61159083611512565b946020939093013593505050565b6000806000606084860312156115b2578081fd5b6115bb84611512565b95602085013595506040909401359392505050565b6000602082840312156115e1578081fd5b8151801515811461119c578182fd5b600060208284031215611601578081fd5b5035919050565b60008060006060848603121561161c578283fd5b8335925060208401359150604084013567ffffffffffffffff80821115611641578283fd5b818601915086601f830112611654578283fd5b813581811115611666576116666117b4565b604051601f8201601f19908116603f0116810190838211818310171561168e5761168e6117b4565b816040528281528960208487010111156116a6578586fd5b82602086016020830137856020848301015280955050505050509250925092565b600082516116d981846020870161176e565b9190910192915050565b600060208252825180602084015261170281604085016020870161176e565b601f01601f19169190910160400192915050565b6020808252600f908201526e0666565206d757374206265203e203608c1b604082015260600190565b600082198211156117525761175261179e565b500190565b6000828210156117695761176961179e565b500390565b60005b83811015611789578181015183820152602001611771565b83811115611798576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212201dc1d1763c435f91b4900dfa63a0d51977fabfc85c47e676ac84e3efcb54587c64736f6c6343000803003300000000000000000000000077a3840f78e4685afaf9c416b36e6eae6122567b
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000077a3840f78e4685afaf9c416b36e6eae6122567b
-----Decoded View---------------
Arg [0] : _token (address): 0x77a3840f78e4685afaf9c416b36e6eae6122567b
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000077a3840f78e4685afaf9c416b36e6eae6122567b
Deployed ByteCode Sourcemap
25917:15158:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39418:330;;;;;;:::i;:::-;;:::i;:::-;;;14026:25:1;;;14014:2;13999:18;39418:330:0;;;;;;;;37380:99;37465:5;37380:99;;;-1:-1:-1;;;;;4817:32:1;;;4799:51;;4787:2;4772:18;37380:99:0;4754:102:1;39003:135:0;;;;;;:::i;:::-;;:::i;37674:143::-;;;;;;:::i;:::-;37749:7;37776:24;;;:12;:24;;;;;:33;-1:-1:-1;;;;;37776:33:0;;37674:143;38291:155;;;;;;:::i;:::-;38357:4;38381:24;;;:12;:24;;;;;:31;;;:57;:31;:57;;;38291:155;;;;6144:14:1;;6137:22;6119:41;;6107:2;6092:18;38291:155:0;6074:92:1;26805:51:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26805:51:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5524:15:1;;;5506:34;;5576:15;;;;5571:2;5556:18;;5549:43;5608:18;;;5601:34;5683:4;5671:17;5666:2;5651:18;;5644:45;5455:3;5440:19;26805:51:0;5422:273:1;38003:143:0;;;;;;:::i;:::-;38078:7;38105:24;;;:12;:24;;;;;:33;;;-1:-1:-1;;;;;38105:33:0;;38003:143;39936:137;;;;;;:::i;:::-;-1:-1:-1;;;;;40036:29:0;40009:7;40036:29;;;:18;:29;;;;;;;39936:137;38672:133;;;;;;:::i;:::-;38741:5;38766:24;;;:12;:24;;;;;:31;;;;;;38672:133;;;;14740:4:1;14728:17;;;14710:36;;14698:2;14683:18;38672:133:0;14665:87:1;26133:50:0;;26182:1;26133:50;;35297:1909;;;;;;:::i;:::-;;:::i;26078:48::-;;26125:1;26078:48;;31090:427;;;;;;:::i;:::-;;:::i;32526:302::-;;;;;;:::i;:::-;;:::i;:::-;;30532:344;;;;;;:::i;:::-;;:::i;31805:483::-;;;;;;:::i;:::-;;:::i;33489:1266::-;;;;;;:::i;:::-;;:::i;39418:330::-;-1:-1:-1;;;;;39534:24:0;;;39511:7;39534:24;;;:13;:24;;;;;;;;:48;;;;;:37;;;;:48;;;;;;:52;39531:210;;-1:-1:-1;;;;;;39610:24:0;;;;;;;:13;:24;;;;;;;;:48;;;;;:37;;;;:48;;;;39603:55;;39531:210;-1:-1:-1;;;;;;39698:24:0;;;;;;:13;:24;;;;;:31;39531:210;39418:330;;;;:::o;39003:135::-;-1:-1:-1;;;;;39099:24:0;;39072:7;39099:24;;;:13;:24;;;;;:31;39003:135;;;;:::o;35297:1909::-;35436:4;23698:1;24295:7;;:19;;24287:63;;;;-1:-1:-1;;;24287:63:0;;13722:2:1;24287:63:0;;;13704:21:1;13761:2;13741:18;;;13734:30;13800:33;13780:18;;;13773:61;13851:18;;24287:63:0;;;;;;;;;23698:1;24428:7;:18;;;35474:10:::1;35460:25:::0;;:13:::1;:25;::::0;;;;:32;35452:72:::1;;;::::0;-1:-1:-1;;;35452:72:0;;13021:2:1;35452:72:0::1;::::0;::::1;13003:21:1::0;13060:2;13040:18;;;13033:30;-1:-1:-1;;;13079:18:1;;;13072:53;13142:18;;35452:72:0::1;12993:173:1::0;35452:72:0::1;35543:24;::::0;;;:12:::1;:24;::::0;;;;:31:::1;;::::0;:59:::1;:31;26182:1;35543:59;35535:94;;;::::0;-1:-1:-1;;;35535:94:0;;7517:2:1;35535:94:0::1;::::0;::::1;7499:21:1::0;7556:2;7536:18;;;7529:30;-1:-1:-1;;;7575:18:1;;;7568:52;7637:18;;35535:94:0::1;7489:172:1::0;35535:94:0::1;35642:16;35661:24:::0;;;:12:::1;:24;::::0;;;;;;;:33;;;35724;::::1;::::0;35782:28;;;::::1;::::0;36038:54;;;;::::1;3810:19:1::0;;;3845:12;;;3838:28;;;3904:2;3900:15;;;-1:-1:-1;;3900:15:1;3882:12;;;3875:75;-1:-1:-1;;;;;35661:33:0;;::::1;::::0;35724;::::1;::::0;35782:28;;35999:95:::1;::::0;3966:12:1;;36038:54:0::1;;;;;;;;;;;;36028:65;;;;;;21425:58:::0;;4510:66:1;21425:58:0;;;4498:79:1;4593:12;;;4586:28;;;21292:7:0;;4630:12:1;;21425:58:0;;;;;;;;;;;;21415:69;;;;;;21408:76;;21223:269;;;;35999:95:::1;35981:113;;36105:25;36133:34;36147:7;36156:10;36133:13;:34::i;:::-;36105:62:::0;-1:-1:-1;36247:10:0::1;-1:-1:-1::0;;;;;36247:22:0;::::1;;:66:::0;::::1;;;-1:-1:-1::0;36282:10:0::1;-1:-1:-1::0;;;;;36282:31:0;::::1;;36247:66;:112;;;;;36351:8;-1:-1:-1::0;;;;;36330:29:0::1;:17;-1:-1:-1::0;;;;;36330:29:0::1;;36247:112;36239:199;;;::::0;-1:-1:-1;;;36239:199:0;;11205:2:1;36239:199:0::1;::::0;::::1;11187:21:1::0;11244:2;11224:18;;;11217:30;11283:34;11263:18;;;11256:62;-1:-1:-1;;;11334:18:1;;;11327:49;11393:19;;36239:199:0::1;11177:241:1::0;36239:199:0::1;36535:10;36510;-1:-1:-1::0;;;;;36456:129:0::1;36487:8;-1:-1:-1::0;;;;;36456:129:0::1;;36560:14;36456:129;;;;14026:25:1::0;;14014:2;13999:18;;13981:76;36456:129:0::1;;;;;;;;36605:24;::::0;;;:12:::1;:24;::::0;;;;;;;36598:31;;-1:-1:-1;;;;;;36598:31:0;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;36598:31:0::1;::::0;;-1:-1:-1;;;;;36673:28:0;::::1;::::0;;:18:::1;:28:::0;;;;;:37:::1;::::0;36706:3;36673:32:::1;:37::i;:::-;-1:-1:-1::0;;;;;36642:28:0;::::1;;::::0;;;:18:::1;:28;::::0;;;;:68;;;;37037:6:::1;37024:9;:19;;37016:46;;;::::0;-1:-1:-1;;;37016:46:0;;10459:2:1;37016:46:0::1;::::0;::::1;10441:21:1::0;10498:2;10478:18;;;10471:30;-1:-1:-1;;;10517:18:1;;;10510:44;10571:18;;37016:46:0::1;10431:164:1::0;37016:46:0::1;37095:78;::::0;;::::1;::::0;::::1;14236:25:1::0;;;14277:18;;;;14270:34;;;37095:78:0;;;;;;;;;;14209:18:1;;;;37095:78:0;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;37095:78:0::1;-1:-1:-1::0;;;37095:78:0::1;::::0;;37073:101:::1;::::0;-1:-1:-1;;;;;37073:21:0;::::1;::::0;::::1;:101::i;:::-;;37194:4;37187:11;;;;;;;;23654:1:::0;24607:7;:22;35297:1909;;-1:-1:-1;;;35297:1909:0:o;31090:427::-;31155:12;31201:1;31188:10;:14;31180:42;;;;-1:-1:-1;;;31180:42:0;;;;;;;:::i;:::-;31255:10;31276:1;31241:25;;;:13;:25;;;;;:32;31233:67;;;;-1:-1:-1;;;31233:67:0;;12316:2:1;31233:67:0;;;12298:21:1;12355:2;12335:18;;;12328:30;-1:-1:-1;;;12374:18:1;;;12367:48;12432:18;;31233:67:0;12288:168:1;31233:67:0;31345:10;31311:17;31331:25;;;:13;:25;;;;;;;;;:32;;31374:45;;;;31435:52;;14236:25:1;;;14277:18;;;14270:34;;;31331:32:0;31345:10;31435:52;;14209:18:1;31435:52:0;;;;;;;-1:-1:-1;31505:4:0;;31090:427;-1:-1:-1;;31090:427:0:o;32526:302::-;40993:10;40974:30;;;;:18;:30;;;;;;32609:7;;40974:41;-1:-1:-1;40974:41:0;40966:86;;;;-1:-1:-1;;;40966:86:0;;8228:2:1;40966:86:0;;;8210:21:1;;;8247:18;;;8240:30;8306:34;8286:18;;;8279:62;8358:18;;40966:86:0;8200:182:1;40966:86:0;32681:10:::1;32662:30;::::0;;;:18:::1;:30;::::0;;;;;:43:::1;::::0;32697:7;32662:34:::1;:43::i;:::-;32648:10;32629:30;::::0;;;:18:::1;:30;::::0;;;;;;;;:76;;;;32721:45;14026:25:1;;;-1:-1:-1;;;;;32721:45:0;::::1;::::0;::::1;::::0;13999:18:1;32721:45:0::1;;;;;;;32784:35;::::0;-1:-1:-1;;;32784:35:0;;-1:-1:-1;;;;;5892:32:1;;;32784:35:0::1;::::0;::::1;5874:51:1::0;5941:18;;;5934:34;;;32784:5:0::1;:14;::::0;::::1;::::0;5847:18:1;;32784:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32777:43;;-1:-1:-1::0;;;32777:43:0::1;;;;;;;;;32526:302:::0;;;:::o;30532:344::-;30595:12;30638:1;30628:7;:11;30620:39;;;;-1:-1:-1;;;30620:39:0;;;;;;;:::i;:::-;30692:10;30678:25;;;;:13;:25;;;;;:32;:37;30670:68;;;;-1:-1:-1;;;30670:68:0;;8589:2:1;30670:68:0;;;8571:21:1;8628:2;8608:18;;;8601:30;-1:-1:-1;;;8647:18:1;;;8640:48;8705:18;;30670:68:0;8561:168:1;30670:68:0;30763:10;30749:25;;;;:13;:25;;;;;;;:42;;;30807:39;;;;;30784:7;14026:25:1;;14014:2;13999:18;;13981:76;30807:39:0;;;;;;;;-1:-1:-1;30864:4:0;30532:344;;;:::o;31805:483::-;31891:12;31934:1;31924:7;:11;31916:39;;;;-1:-1:-1;;;31916:39:0;;;;;;;:::i;:::-;31988:10;32009:1;31974:25;;;:13;:25;;;;;:32;31966:67;;;;-1:-1:-1;;;31966:67:0;;12316:2:1;31966:67:0;;;12298:21:1;12355:2;12335:18;;;12328:30;-1:-1:-1;;;12374:18:1;;;12367:48;12432:18;;31966:67:0;12288:168:1;31966:67:0;32075:10;32044:14;32061:25;;;:13;:25;;;;;;;;-1:-1:-1;;;;;32061:49:0;;;;;:38;;:49;;;;;;;;32121:59;;;;32196:62;;14236:25:1;;;14277:18;;;14270:34;;;32061:49:0;;;32196:62;;14209:18:1;32196:62:0;;;;;;;-1:-1:-1;32276:4:0;;31805:483;-1:-1:-1;;;31805:483:0:o;33489:1266::-;33664:12;33625:4;33631:9;40384:1;40373:8;:12;40365:43;;;;-1:-1:-1;;;40365:43:0;;11625:2:1;40365:43:0;;;11607:21:1;11664:2;11644:18;;;11637:30;-1:-1:-1;;;11683:18:1;;;11676:48;11741:18;;40365:43:0;11597:168:1;40365:43:0;-1:-1:-1;;;;;40422:24:0;;40474:1;40422:24;;;:13;:24;;;;;;;;40460:10;40422:49;;:37;;;:49;;;;;:53;40419:293;;-1:-1:-1;;;;;40512:24:0;;;;;;:13;:24;;;;;;;;40550:10;40512:49;;:37;;;:49;;;;;40500:61;;;40492:99;;;;-1:-1:-1;;;40492:99:0;;8936:2:1;40492:99:0;;;8918:21:1;8975:2;8955:18;;;8948:30;9014:27;8994:18;;;8987:55;9059:18;;40492:99:0;8908:175:1;40492:99:0;40419:293;;;-1:-1:-1;;;;;40644:24:0;;;;;;:13;:24;;;;;:31;40632:43;;;40624:76;;;;-1:-1:-1;;;40624:76:0;;13373:2:1;40624:76:0;;;13355:21:1;13412:2;13392:18;;;13385:30;-1:-1:-1;;;13431:18:1;;;13424:50;13491:18;;40624:76:0;13345:170:1;40624:76:0;23698:1:::1;24295:7;;:19;;24287:63;;;::::0;-1:-1:-1;;;24287:63:0;;13722:2:1;24287:63:0::1;::::0;::::1;13704:21:1::0;13761:2;13741:18;;;13734:30;13800:33;13780:18;;;13773:61;13851:18;;24287:63:0::1;13694:181:1::0;24287:63:0::1;23698:1;24428:7;:18:::0;33708:10:::2;10668:20:::0;;33791:73:::2;;;::::0;-1:-1:-1;;;33791:73:0;;9290:2:1;33791:73:0::2;::::0;::::2;9272:21:1::0;9329:2;9309:18;;;9302:30;9368:32;9348:18;;;9341:60;9418:18;;33791:73:0::2;9262:180:1::0;33791:73:0::2;-1:-1:-1::0;;;;;33883:24:0;::::2;33917:1;33883:24:::0;;;:13:::2;:24;::::0;;;;:31;33875:71:::2;;;::::0;-1:-1:-1;;;33875:71:0;;13021:2:1;33875:71:0::2;::::0;::::2;13003:21:1::0;13060:2;13040:18;;;13033:30;-1:-1:-1;;;13079:18:1;;;13072:53;13142:18;;33875:71:0::2;12993:173:1::0;33875:71:0::2;33959:49;::::0;-1:-1:-1;;;33959:49:0;;-1:-1:-1;;;;;5119:15:1;;;33959:49:0::2;::::0;::::2;5101:34:1::0;33996:4:0::2;5151:18:1::0;;;5144:43;5203:18;;;5196:34;;;33959:5:0::2;:18;::::0;::::2;::::0;5036::1;;33959:49:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;34037:17:0;;::::2;34021:13;34037:17:::0;;;:6:::2;:17;::::0;;;;;;;:27;;::::2;::::0;;;;;;;;;25505:77;;-1:-1:-1;;3384:2:1;3380:15;;;3376:24;;25505:77:0;;;3364:37:1;3435:15;;;3431:24;;3417:12;;;3410:46;34187:4:0::2;3490:15:1::0;;3486:24;3472:12;;;3465:46;3527:12;;;3520:28;;;3564:12;;;;3557:28;;;25505:77:0;;;;;;;;;;3601:13:1;;;;25505:77:0;;;25495:88;;;;;;;;;;34124:83:::2;;34255:8;34220:12;:23;34233:9;34220:23;;;;;;;;;;;:32;;;:43;;;;;-1:-1:-1::0;;;;;34220:43:0::2;;;;;-1:-1:-1::0;;;;;34220:43:0::2;;;;;;34309:9;34274:12;:23;34287:9;34274:23;;;;;;;;;;;:32;;;:44;;;;;-1:-1:-1::0;;;;;34274:44:0::2;;;;;-1:-1:-1::0;;;;;34274:44:0::2;;;;;;34359:4;34329:12;:23;34342:9;34329:23;;;;;;;;;;;:27;;:34;;;;26182:1;34374:12;:23;34387:9;34374:23;;;;;;;;;;;:30;;;:57;;;;;;;;;;;;;;;;;;34626:9;34563;-1:-1:-1::0;;;;;34512:134:0::2;34540:8;-1:-1:-1::0;;;;;34512:134:0::2;;34587:4;34606:5;34512:134;;;;;;14236:25:1::0;;;14292:2;14277:18;;14270:34;14224:2;14209:18;;14191:119;34512:134:0::2;;;;;;;;-1:-1:-1::0;;;;;34689:17:0;;::::2;;::::0;;;:6:::2;:17;::::0;;;;;;;:27;;::::2;::::0;;;;;;;:34:::2;::::0;34721:1:::2;34689:31;:34::i;:::-;-1:-1:-1::0;;;;;34659:17:0;;::::2;;::::0;;;:6:::2;:17;::::0;;;;;;;:27;;;::::2;::::0;;;;;;;;;:64;;;;-1:-1:-1;34743:4:0::2;24607:22:::0;;;;34743:4;33489:1266;-1:-1:-1;;;;;;33489:1266:0:o;10301:422::-;10668:20;10707:8;;;10301:422::o;18591:761::-;18669:7;18732:9;:16;18752:2;18732:22;18728:96;;18771:41;;-1:-1:-1;;;18771:41:0;;7868:2:1;18771:41:0;;;7850:21:1;7907:2;7887:18;;;7880:30;7946:33;7926:18;;;7919:61;7997:18;;18771:41:0;7840:181:1;18728:96:0;19185:4;19170:20;;19164:27;19231:4;19216:20;;19210:27;19285:4;19270:20;;19264:27;18893:9;19256:36;19322:22;19330:4;19256:36;19164:27;19210;19322:7;:22::i;:::-;19315:29;18591:761;-1:-1:-1;;;;;;18591:761:0:o;5376:98::-;5434:7;5461:5;5465:1;5461;:5;:::i;:::-;5454:12;5376:98;-1:-1:-1;;;5376:98:0:o;12816:175::-;12891:12;12923:60;12936:6;12944:4;12923:60;;;;;;;;;;;;;;;;;:12;:60::i;5757:98::-;5815:7;5842:5;5846:1;5842;:5;:::i;19491:1432::-;19576:7;20501:66;20487:80;;;20479:127;;;;-1:-1:-1;;;20479:127:0;;9649:2:1;20479:127:0;;;9631:21:1;9688:2;9668:18;;;9661:30;9727:34;9707:18;;;9700:62;-1:-1:-1;;;9778:18:1;;;9771:32;9820:19;;20479:127:0;9621:224:1;20479:127:0;20625:1;:7;;20630:2;20625:7;:18;;;;20636:1;:7;;20641:2;20636:7;20625:18;20617:65;;;;-1:-1:-1;;;20617:65:0;;10802:2:1;20617:65:0;;;10784:21:1;10841:2;10821:18;;;10814:30;10880:34;10860:18;;;10853:62;-1:-1:-1;;;10931:18:1;;;10924:32;10973:19;;20617:65:0;10774:224:1;20617:65:0;20797:24;;;20780:14;20797:24;;;;;;;;;6398:25:1;;;6471:4;6459:17;;6439:18;;;6432:45;;;;6493:18;;;6486:34;;;6536:18;;;6529:34;;;20797:24:0;;6370:19:1;;20797:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20797:24:0;;-1:-1:-1;;20797:24:0;;;-1:-1:-1;;;;;;;20840:20:0;;20832:57;;;;-1:-1:-1;;;20832:57:0;;7164:2:1;20832:57:0;;;7146:21:1;7203:2;7183:18;;;7176:30;7242:26;7222:18;;;7215:54;7286:18;;20832:57:0;7136:174:1;20832:57:0;20909:6;19491:1432;-1:-1:-1;;;;;19491:1432:0:o;13221:195::-;13324:12;13356:52;13378:6;13386:4;13392:1;13395:12;13356:21;:52::i;:::-;13349:59;13221:195;-1:-1:-1;;;;13221:195:0:o;14273:530::-;14400:12;14458:5;14433:21;:30;;14425:81;;;;-1:-1:-1;;;14425:81:0;;10052:2:1;14425:81:0;;;10034:21:1;10091:2;10071:18;;;10064:30;10130:34;10110:18;;;10103:62;-1:-1:-1;;;10181:18:1;;;10174:36;10227:19;;14425:81:0;10024:228:1;14425:81:0;10668:20;;14517:60;;;;-1:-1:-1;;;14517:60:0;;12663:2:1;14517:60:0;;;12645:21:1;12702:2;12682:18;;;12675:30;12741:31;12721:18;;;12714:59;12790:18;;14517:60:0;12635:179:1;14517:60:0;14651:12;14665:23;14692:6;-1:-1:-1;;;;;14692:11:0;14712:5;14720:4;14692:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14650:75;;;;14743:52;14761:7;14770:10;14782:12;14743:17;:52::i;:::-;14736:59;14273:530;-1:-1:-1;;;;;;;14273:530:0:o;16813:742::-;16928:12;16957:7;16953:595;;;-1:-1:-1;16988:10:0;16981:17;;16953:595;17102:17;;:21;17098:439;;17365:10;17359:17;17426:15;17413:10;17409:2;17405:19;17398:44;17313:148;17508:12;17501:20;;-1:-1:-1;;;17501:20:0;;;;;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;192:196;;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;393:270::-;;;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:264::-;;;797:2;785:9;776:7;772:23;768:32;765:2;;;818:6;810;803:22;765:2;846:29;865:9;846:29;:::i;:::-;836:39;922:2;907:18;;;;894:32;;-1:-1:-1;;;755:177:1:o;937:332::-;;;;1083:2;1071:9;1062:7;1058:23;1054:32;1051:2;;;1104:6;1096;1089:22;1051:2;1132:29;1151:9;1132:29;:::i;:::-;1122:39;1208:2;1193:18;;1180:32;;-1:-1:-1;1259:2:1;1244:18;;;1231:32;;1041:228;-1:-1:-1;;;1041:228:1:o;1274:297::-;;1394:2;1382:9;1373:7;1369:23;1365:32;1362:2;;;1415:6;1407;1400:22;1362:2;1452:9;1446:16;1505:5;1498:13;1491:21;1484:5;1481:32;1471:2;;1532:6;1524;1517:22;1576:190;;1688:2;1676:9;1667:7;1663:23;1659:32;1656:2;;;1709:6;1701;1694:22;1656:2;-1:-1:-1;1737:23:1;;1646:120;-1:-1:-1;1646:120:1:o;1771:1102::-;;;;1926:2;1914:9;1905:7;1901:23;1897:32;1894:2;;;1947:6;1939;1932:22;1894:2;1988:9;1975:23;1965:33;;2045:2;2034:9;2030:18;2017:32;2007:42;;2100:2;2089:9;2085:18;2072:32;2123:18;2164:2;2156:6;2153:14;2150:2;;;2185:6;2177;2170:22;2150:2;2228:6;2217:9;2213:22;2203:32;;2273:7;2266:4;2262:2;2258:13;2254:27;2244:2;;2300:6;2292;2285:22;2244:2;2341;2328:16;2363:2;2359;2356:10;2353:2;;;2369:18;;:::i;:::-;2444:2;2438:9;2412:2;2498:13;;-1:-1:-1;;2494:22:1;;;2518:2;2490:31;2486:40;2474:53;;;2542:18;;;2562:22;;;2539:46;2536:2;;;2588:18;;:::i;:::-;2628:10;2624:2;2617:22;2663:2;2655:6;2648:18;2703:7;2698:2;2693;2689;2685:11;2681:20;2678:33;2675:2;;;2729:6;2721;2714:22;2675:2;2790;2785;2781;2777:11;2772:2;2764:6;2760:15;2747:46;2835:6;2830:2;2825;2817:6;2813:15;2809:24;2802:40;2861:6;2851:16;;;;;;;1884:989;;;;;:::o;3989:274::-;;4156:6;4150:13;4172:53;4218:6;4213:3;4206:4;4198:6;4194:17;4172:53;:::i;:::-;4241:16;;;;;4126:137;-1:-1:-1;;4126:137:1:o;6574:383::-;;6723:2;6712:9;6705:21;6755:6;6749:13;6798:6;6793:2;6782:9;6778:18;6771:34;6814:66;6873:6;6868:2;6857:9;6853:18;6848:2;6840:6;6836:15;6814:66;:::i;:::-;6941:2;6920:15;-1:-1:-1;;6916:29:1;6901:45;;;;6948:2;6897:54;;6695:262;-1:-1:-1;;6695:262:1:o;11770:339::-;11972:2;11954:21;;;12011:2;11991:18;;;11984:30;-1:-1:-1;;;12045:2:1;12030:18;;12023:45;12100:2;12085:18;;11944:165::o;14757:128::-;;14828:1;14824:6;14821:1;14818:13;14815:2;;;14834:18;;:::i;:::-;-1:-1:-1;14870:9:1;;14805:80::o;14890:125::-;;14958:1;14955;14952:8;14949:2;;;14963:18;;:::i;:::-;-1:-1:-1;15000:9:1;;14939:76::o;15020:258::-;15092:1;15102:113;15116:6;15113:1;15110:13;15102:113;;;15192:11;;;15186:18;15173:11;;;15166:39;15138:2;15131:10;15102:113;;;15233:6;15230:1;15227:13;15224:2;;;15268:1;15259:6;15254:3;15250:16;15243:27;15224:2;;15073:205;;;:::o;15283:127::-;15344:10;15339:3;15335:20;15332:1;15325:31;15375:4;15372:1;15365:15;15399:4;15396:1;15389:15;15415:127;15476:10;15471:3;15467:20;15464:1;15457:31;15507:4;15504:1;15497:15;15531:4;15528:1;15521:15
Swarm Source
ipfs://1dc1d1763c435f91b4900dfa63a0d51977fabfc85c47e676ac84e3efcb54587c
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.