Contract
0xa39ead9429ab35bfa7aa85786bcdda500a78155d
2
Contract Overview
Balance:
0 ETH
ETH Value:
$0.00
My Name Tag:
Not Available
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
SmolPuddle
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan on 2021-09-14 */ // Sources flattened with hardhat v2.6.4 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // pragma solidity ^0.8.0; /** * @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; 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"); (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"); (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"); (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"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File contracts/SafeERC20ERC721.sol pragma solidity ^0.8.0; interface ERC20_ERC721 { function transferFrom(address from, address to, uint256 idOrAmount) external; function transfer(address to, uint256 idOrAmount) external; } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20ERC721 { using Address for address; // Uses tranfer() method if sender is this contract for the wETH flow function safeTransferFrom( ERC20_ERC721 token, address from, address to, uint256 value ) internal { if (from == address(this)) { _safeTransfer(token, to, value); } else { _safeTransferFrom(token, from, to, value); } } function _safeTransfer( ERC20_ERC721 token, address to, uint256 value ) private { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function _safeTransferFrom( ERC20_ERC721 token, address from, address to, uint256 value ) private { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(ERC20_ERC721 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20ERC721: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20ERC721: token operation did not succeed"); } } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] // pragma solidity ^0.8.0; /** * @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; } } // File contracts/interfaces/IERC1271Wallet.sol pragma solidity ^0.8.4; interface IERC1271Wallet { /** * @notice Verifies whether the provided signature is valid with respect to the provided data * @dev MUST return the correct magic value if the signature provided is valid for the provided data * > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256("isValidSignature(bytes,bytes)") * > This function MAY modify Ethereum's state * @param _data Arbitrary length data signed on the behalf of address(this) * @param _signature Signature byte array associated with _data * @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise * */ function isValidSignature( bytes calldata _data, bytes calldata _signature) external view returns (bytes4 magicValue); /** * @notice Verifies whether the provided signature is valid with respect to the provided hash * @dev MUST return the correct magic value if the signature provided is valid for the provided hash * > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256("isValidSignature(bytes,bytes)") * > This function MAY modify Ethereum's state * @param _hash keccak256 hash that was signed * @param _signature Signature byte array associated with _data * @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise */ function isValidSignature( bytes32 _hash, bytes calldata _signature) external view returns (bytes4 magicValue); } // File contracts/utils/LibBytes.sol pragma solidity ^0.8.4; library LibBytes { using LibBytes for bytes; /***********************************| | Pop Bytes Functions | |__________________________________*/ /** * @dev Pops the last byte off of a byte array by modifying its length. * @param b Byte array that will be modified. * @return result The byte that was popped off. */ function lastByte(bytes memory b) internal pure returns (bytes1 result) { require( b.length > 0, "LibBytes#lastByte: GREATER_THAN_ZERO_LENGTH_REQUIRED" ); // Store last byte. result = b[b.length - 1]; return result; } /***********************************| | Read Bytes Functions | |__________________________________*/ /** * @dev Reads a bytes32 value from a position in a byte array. * @param b Byte array containing a bytes32 value. * @param index Index in byte array of bytes32 value. * @return result bytes32 value from byte array. */ function readBytes32( bytes memory b, uint256 index ) internal pure returns (bytes32 result) { require( b.length >= index + 32, "LibBytes#readBytes32: GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED" ); // Arrays are prefixed by a 256 bit length parameter index += 32; // Read the bytes32 from array memory assembly { result := mload(add(b, index)) } return result; } } // File contracts/utils/SignatureValidator.sol pragma solidity ^0.8.4; /** * @dev Contains logic for signature validation. * Signatures from wallet contracts assume ERC-1271 support (https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1271.md) * Notes: Methods are strongly inspired by contracts in https://github.com/0xProject/0x-monorepo/blob/development/ */ contract SignatureValidator { using LibBytes for bytes; /***********************************| | Variables | |__________________________________*/ // bytes4(keccak256("isValidSignature(bytes,bytes)")) bytes4 constant internal ERC1271_MAGICVALUE = 0x20c13b0b; // bytes4(keccak256("isValidSignature(bytes32,bytes)")) bytes4 constant internal ERC1271_MAGICVALUE_BYTES32 = 0x1626ba7e; // Allowed signature types. enum SignatureType { Illegal, // 0x00, default value EIP712, // 0x01 EthSign, // 0x02 WalletBytes, // 0x03 To call isValidSignature(bytes, bytes) on wallet contract WalletBytes32, // 0x04 To call isValidSignature(bytes32, bytes) on wallet contract NSignatureTypes // 0x05, number of signature types. Always leave at end. } /***********************************| | Signature Functions | |__________________________________*/ /** * @dev Verifies that a hash has been signed by the given signer. * @param _signerAddress Address that should have signed the given hash. * @param _hash Hash of the EIP-712 encoded data * @param _rsig Proof that the hash has been signed by signer. * For non wallet signatures, _sig is expected to be an array tightly encoded as * (bytes32 r, bytes32 s, uint8 v, uint256 nonce, SignatureType sigType) * @return isValid True if the address recovered from the provided signature matches the input signer address. */ function isValidSignature( address _signerAddress, bytes32 _hash, bytes calldata _rsig ) public view returns (bool isValid) { require( _rsig.length > 0, "SignatureValidator#isValidSignature: LENGTH_GREATER_THAN_0_REQUIRED" ); require( _signerAddress != address(0x0), "SignatureValidator#isValidSignature: INVALID_SIGNER" ); // Pop last byte off of signature byte array. uint8 signatureTypeRaw = uint8(_rsig.lastByte()); bytes memory sig = _rsig[0:_rsig.length - 1]; // Extract signature type SignatureType signatureType = SignatureType(signatureTypeRaw); // Variables are not scoped in Solidity. uint8 v; bytes32 r; bytes32 s; address recovered; // Always illegal signature. // This is always an implicit option since a signer can create a // signature array with invalid type or length. We may as well make // it an explicit option. This aids testing and analysis. It is // also the initialization value for the enum type. if (signatureType == SignatureType.Illegal) { revert("SignatureValidator#isValidSignature: ILLEGAL_SIGNATURE"); // Signature using EIP712 } else if (signatureType == SignatureType.EIP712) { r = sig.readBytes32(0); s = sig.readBytes32(32); v = uint8(sig[64]); recovered = ecrecover(_hash, v, r, s); isValid = _signerAddress == recovered; return isValid; // Signed using web3.eth_sign() or Ethers wallet.signMessage() } else if (signatureType == SignatureType.EthSign) { r = sig.readBytes32(0); s = sig.readBytes32(32); v = uint8(sig[64]); recovered = ecrecover( keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash)), v, r, s ); isValid = _signerAddress == recovered; return isValid; // Signature verified by wallet contract without data validation. } else if (signatureType == SignatureType.WalletBytes32) { isValid = ERC1271_MAGICVALUE_BYTES32 == IERC1271Wallet(_signerAddress).isValidSignature(_hash, sig); return isValid; } // Anything else is illegal (We do not return false because // the signature may actually be valid, just not in a format // that we currently support. In this case returning false // may lead the caller to incorrectly believe that the // signature was invalid.) revert("SignatureValidator#isValidSignature: UNSUPPORTED_SIGNATURE"); } } // File contracts/EIP712Order.sol pragma solidity ^0.8.4; contract EIP712Order { struct EIP712Domain { string name; uint256 chainId; address verifyingContract; } enum OrderType { Invalid, NftToNft, BuyNFT, SellNFT } // Order structure struct Order { address seller; // Seller's address OrderType orderType; // Indicates which order this is (Nft -> NFT, token -> NFT or NFT -> token) address askToken; // Token seller is requesting address sellToken; // Token address that is being sold uint256 askTokenIdOrAmount; // ID or amount seller is requesting uint256 sellTokenIdOrAmount; // Id or amount seller is selling address[] feeRecipients; // Array of who will receive fee for the trade uint256[] feeAmounts; // Amount to be sent for respective fee recipient uint256 expiration; // When the order expires bytes32 salt; // Salt to prevent hash collision } // EIP-712 constants string constant internal EIP191_HEADER = "\x19\x01"; bytes32 constant DOMAIN_SEPARATOR_TYPEHASH = keccak256( "EIP712Domain(string name,uint256 chainId,address verifyingContract)" ); bytes32 constant ORDER_TYPEHASH = keccak256(abi.encodePacked( "Order(", "address seller,", "uint256 orderType,", "address askToken,", "address sellToken,", "uint256 askTokenIdOrAmount,", "uint256 sellTokenIdOrAmount,", "address[] feeRecipients,", "uint256[] feeAmounts,", "uint256 expiration,", "uint256 salt", ")" )); bytes32 immutable public EIP712_DOMAIN_HASH; constructor (uint256 _chaindID) { EIP712_DOMAIN_HASH = keccak256(abi.encodePacked( DOMAIN_SEPARATOR_TYPEHASH, keccak256(bytes("Smol Puddle")), _chaindID, uint256(uint160(address(this))) )); } function hash(Order memory _order) public view returns (bytes32) { bytes32 orderStructHash = keccak256(abi.encodePacked( ORDER_TYPEHASH, uint256(uint160(_order.seller)), uint256(_order.orderType), uint256(uint160(_order.askToken)), uint256(uint160(_order.sellToken)), _order.askTokenIdOrAmount, _order.sellTokenIdOrAmount, keccak256(abi.encodePacked(_order.feeRecipients)), keccak256(abi.encodePacked(_order.feeAmounts)), _order.expiration, _order.salt )); return keccak256(abi.encodePacked( EIP191_HEADER, EIP712_DOMAIN_HASH, orderStructHash )); } } // File contracts/SmolPuddle.sol //SPDX-License-Identifier: Unlicense pragma solidity ^0.8.4; enum Status { Open, Executed, Canceled } interface WETH is ERC20_ERC721 { function deposit() external payable; } contract SmolPuddle is SignatureValidator, ReentrancyGuard, Ownable, EIP712Order { using SafeERC20ERC721 for ERC20_ERC721; mapping(address => mapping(bytes32 => Status)) public status; WETH public immutable weth; constructor(WETH _weth, uint256 _chainID) EIP712Order(_chainID) { weth = _weth; } // Three events so we can have more indexed fields event OrderExecutedP1( bytes32 indexed order, address indexed seller, address indexed buyer ); event OrderExecutedP2( OrderType indexed orderType, address indexed buyToken, uint256 indexed buyTokenIdOrAmount ); event OrderExecutedP3( address indexed sellToken, uint256 indexed sellTokenIdOrAmount, address[] feeRecipients, uint256[] feeAmounts ); event OrderCanceled( bytes32 indexed order, address indexed seller ); // Errors error OrderExpired(); error InvalidSignature(); error InvalidArrays(); error OrderNotOpen(); error InvalidPayment(); error InvalidOrderType(); /** * @notice Will cancel a given order * @param _hash Hash of the order to cancel */ function cancel(bytes32 _hash) external { if (status[msg.sender][_hash] != Status.Open) { revert OrderNotOpen(); } status[msg.sender][_hash] = Status.Canceled; emit OrderCanceled(_hash, msg.sender); } /** * @notice Will fill an order * @param _order Order to fill * @param _signature Signature associated with given order */ function swap(Order calldata _order, bytes calldata _signature) external payable nonReentrant returns (bool) { // Must not be expired if (block.timestamp > _order.expiration) { revert OrderExpired(); } // Compute order hash bytes32 orderHash = EIP712Order.hash(_order); // Check user signature if (!isValidSignature(_order.seller, orderHash, _signature)) { revert InvalidSignature(); } // Check if order is canceled or executed if (status[_order.seller][orderHash] != Status.Open) { revert OrderNotOpen(); } // Switch order status to executed status[_order.seller][orderHash] = Status.Executed; // Currency to NFT trade (i.e. filling a NFT sell order) if (_order.orderType == OrderType.SellNFT) { // If buyer is paying directly with WETH address currencySender = msg.sender; // If buyer sends ETH, then ETH will be converted to WETH and send from this contract. if (_order.askToken == address(weth) && msg.value == _order.askTokenIdOrAmount) { weth.deposit{ value: _order.askTokenIdOrAmount }(); currencySender = address(this); } else if (msg.value > 0) { // Amount of ETH must be either 0 or equal to _order.amount revert InvalidPayment(); } // Execute all transfers uint256 totalFeePaid = _feePayment(_order.askToken, currencySender, _order.feeRecipients, _order.feeAmounts); uint256 revenueForNFT = _order.askTokenIdOrAmount - totalFeePaid; // Amount of currency NFT owner will receive after fee ERC20_ERC721(_order.askToken).safeTransferFrom(currencySender, _order.seller, revenueForNFT); // Sending currency to seller ERC20_ERC721(_order.sellToken).safeTransferFrom(_order.seller, msg.sender, _order.sellTokenIdOrAmount); // Sending NFT to buyer // NFT to currency trade (i.e. filling an NFT buy order) } else if (_order.orderType == OrderType.BuyNFT) { // Execute all transfers uint256 totalFeePaid = _feePayment(_order.sellToken, _order.seller, _order.feeRecipients, _order.feeAmounts); uint256 revenueForNFT = _order.sellTokenIdOrAmount - totalFeePaid; // Amount of currency NFT owner will receive after fee ERC20_ERC721(_order.sellToken).safeTransferFrom(_order.seller, msg.sender, revenueForNFT); // Sending currency to NFT seller ERC20_ERC721(_order.askToken).safeTransferFrom(msg.sender, _order.seller, _order.askTokenIdOrAmount); // Sending NFT to who made an offer // NFT to NFT trade } else if (_order.orderType == OrderType.NftToNft) { if (msg.value > 0) { revert InvalidPayment(); } ERC20_ERC721(_order.askToken).safeTransferFrom(msg.sender, _order.seller, _order.askTokenIdOrAmount); ERC20_ERC721(_order.sellToken).safeTransferFrom(_order.seller, msg.sender, _order.sellTokenIdOrAmount); } else { revert InvalidOrderType(); } // Emit events emit OrderExecutedP1(orderHash, _order.seller, msg.sender); emit OrderExecutedP2(_order.orderType, _order.sellToken, _order.sellTokenIdOrAmount); emit OrderExecutedP3(_order.askToken, _order.askTokenIdOrAmount, _order.feeRecipients, _order.feeAmounts); // All done! return true; } /** * @notice Will pay the fee recipients * @param _currency Token used as currency for fee payment * @param _from Address who will pay the fee * @param _feeRecipients Array of addresses to pay the fees to * @param _feeAmounts Array of amount of fees to pay to each corresponding fee recipient * @return totalFeeAmount Total amount of fee paid */ function _feePayment(address _currency, address _from, address[] memory _feeRecipients, uint256[] memory _feeAmounts) private returns (uint256 totalFeeAmount) { // Sanity check inputs if (_feeRecipients.length != _feeAmounts.length) { revert InvalidArrays(); } // Transfer to fee recipients for (uint256 i = 0; i < _feeRecipients.length; i++) { totalFeeAmount -= _feeAmounts[i]; ERC20_ERC721(_currency).safeTransferFrom(_from, _feeRecipients[i], _feeAmounts[i]); } return totalFeeAmount; } /** * @notice Will self-destruct the contract * @dev This will be used if a vulnerability is discovered to halt an attacker * @param _recipient Address that will receive stuck ETH, if any */ function NUKE(address payable _recipient) external onlyOwner { selfdestruct(_recipient); } }
[{"inputs":[{"internalType":"contract WETH","name":"_weth","type":"address"},{"internalType":"uint256","name":"_chainID","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidArrays","type":"error"},{"inputs":[],"name":"InvalidOrderType","type":"error"},{"inputs":[],"name":"InvalidPayment","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"OrderExpired","type":"error"},{"inputs":[],"name":"OrderNotOpen","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"order","type":"bytes32"},{"indexed":true,"internalType":"address","name":"seller","type":"address"}],"name":"OrderCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"order","type":"bytes32"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"}],"name":"OrderExecutedP1","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum EIP712Order.OrderType","name":"orderType","type":"uint8"},{"indexed":true,"internalType":"address","name":"buyToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"buyTokenIdOrAmount","type":"uint256"}],"name":"OrderExecutedP2","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sellToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"sellTokenIdOrAmount","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"feeRecipients","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"feeAmounts","type":"uint256[]"}],"name":"OrderExecutedP3","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"EIP712_DOMAIN_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"}],"name":"NUKE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"enum EIP712Order.OrderType","name":"orderType","type":"uint8"},{"internalType":"address","name":"askToken","type":"address"},{"internalType":"address","name":"sellToken","type":"address"},{"internalType":"uint256","name":"askTokenIdOrAmount","type":"uint256"},{"internalType":"uint256","name":"sellTokenIdOrAmount","type":"uint256"},{"internalType":"address[]","name":"feeRecipients","type":"address[]"},{"internalType":"uint256[]","name":"feeAmounts","type":"uint256[]"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"internalType":"struct EIP712Order.Order","name":"_order","type":"tuple"}],"name":"hash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"},{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bytes","name":"_rsig","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bool","name":"isValid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"status","outputs":[{"internalType":"enum Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"enum EIP712Order.OrderType","name":"orderType","type":"uint8"},{"internalType":"address","name":"askToken","type":"address"},{"internalType":"address","name":"sellToken","type":"address"},{"internalType":"uint256","name":"askTokenIdOrAmount","type":"uint256"},{"internalType":"uint256","name":"sellTokenIdOrAmount","type":"uint256"},{"internalType":"address[]","name":"feeRecipients","type":"address[]"},{"internalType":"uint256[]","name":"feeAmounts","type":"uint256[]"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"internalType":"struct EIP712Order.Order","name":"_order","type":"tuple"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"swap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract WETH","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620025463803806200254683398101604081905262000034916200014e565b6001600055806200004533620000fc565b604080518082018252600b81526a536d6f6c20507564646c6560a81b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866918101919091527f68b4da923dee5533603bf95398dbe3d1cee5be475a35b778c032450ba8eba182918101919091526060810182905230608082015260a00160408051808303601f190181529190528051602090910120608052505060601b6001600160601b03191660a05262000188565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806040838503121562000161578182fd5b82516001600160a01b038116811462000178578283fd5b6020939093015192949293505050565b60805160a05160601c612380620001c66000396000818161010801528181610f610152610fb101526000818161023f0152610bf201526123806000f3fe6080604052600436106100bc5760003560e01c8063c4d252f511610074578063e306f7791161004e578063e306f7791461022d578063f1d7e04c14610261578063f2fde38b1461027457600080fd5b8063c4d252f5146101a5578063d6d76ed5146101c5578063d987749e1461020d57600080fd5b8063715018a6116100a5578063715018a61461014257806371d5e892146101595780638da5cb5b1461018757600080fd5b8063238a4d1e146100c15780633fc8cef3146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc366004611e1b565b610294565b60405190151581526020015b60405180910390f35b34801561010257600080fd5b5061012a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100ed565b34801561014e57600080fd5b5061015761082f565b005b34801561016557600080fd5b50610179610174366004611f75565b610895565b6040519081526020016100ed565b34801561019357600080fd5b506001546001600160a01b031661012a565b3480156101b157600080fd5b506101576101c0366004611e95565b610c38565b3480156101d157600080fd5b506102006101e0366004611df0565b600260209081526000928352604080842090915290825290205460ff1681565b6040516100ed9190612131565b34801561021957600080fd5b50610157610228366004611dd4565b610ce2565b34801561023957600080fd5b506101797f000000000000000000000000000000000000000000000000000000000000000081565b6100e161026f366004611f07565b610d48565b34801561028057600080fd5b5061015761028f366004611dd4565b611479565b6000816103345760405162461bcd60e51b815260206004820152604360248201527f5369676e617475726556616c696461746f7223697356616c69645369676e617460448201527f7572653a204c454e4754485f475245415445525f5448414e5f305f524551554960648201527f5245440000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6001600160a01b0385166103b05760405162461bcd60e51b815260206004820152603360248201527f5369676e617475726556616c696461746f7223697356616c69645369676e617460448201527f7572653a20494e56414c49445f5349474e455200000000000000000000000000606482015260840161032b565b60006103f184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061155b92505050565b60f81c90506000848185610406600182612273565b9261041393929190612233565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509394505060ff8516915050600581111561046d57634e487b7160e01b600052602160045260246000fd5b905060008080808085600581111561049557634e487b7160e01b600052602160045260246000fd5b14156105095760405162461bcd60e51b815260206004820152603660248201527f5369676e617475726556616c696461746f7223697356616c69645369676e617460448201527f7572653a20494c4c4547414c5f5349474e415455524500000000000000000000606482015260840161032b565b600185600581111561052b57634e487b7160e01b600052602160045260246000fd5b14156105f15761053c86600061162d565b925061054986602061162d565b91508560408151811061056c57634e487b7160e01b600052603260045260246000fd5b0160209081015160408051600081529283018082528e905260f89190911c9082018190526060820185905260808201849052945060019060a0015b6020604051602081039080840390855afa1580156105c9573d6000803e3d6000fd5b5050604051601f1901516001600160a01b038e81169116149850610827975050505050505050565b600285600581111561061357634e487b7160e01b600052602160045260246000fd5b14156106d95761062486600061162d565b925061063186602061162d565b91508560408151811061065457634e487b7160e01b600052603260045260246000fd5b016020908101516040517f19457468657265756d205369676e6564204d6573736167653a0a33320000000092810192909252603c82018d905260f81c9450600190605c0160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016105a7565b60048560058111156106fb57634e487b7160e01b600052602160045260246000fd5b14156107b957604051630b135d3f60e11b81526001600160a01b038d1690631626ba7e9061072f908e908a90600401612118565b60206040518083038186803b15801561074757600080fd5b505afa15801561075b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077f9190611ead565b7fffffffff0000000000000000000000000000000000000000000000000000000016630b135d3f60e11b1497506108279650505050505050565b60405162461bcd60e51b815260206004820152603a60248201527f5369676e617475726556616c696461746f7223697356616c69645369676e617460448201527f7572653a20554e535550504f525445445f5349474e4154555245000000000000606482015260840161032b565b949350505050565b6001546001600160a01b031633146108895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161032b565b61089360006116c6565b565b600080604051602001610a6d907f4f7264657228000000000000000000000000000000000000000000000000000081527f616464726573732073656c6c65722c000000000000000000000000000000000060068201527f75696e74323536206f72646572547970652c000000000000000000000000000060158201527f616464726573732061736b546f6b656e2c00000000000000000000000000000060278201527f616464726573732073656c6c546f6b656e2c000000000000000000000000000060388201527f75696e743235362061736b546f6b656e49644f72416d6f756e742c0000000000604a8201527f75696e743235362073656c6c546f6b656e49644f72416d6f756e742c0000000060658201527f616464726573735b5d20666565526563697069656e74732c000000000000000060818201527f75696e743235365b5d20666565416d6f756e74732c000000000000000000000060998201527f75696e743235362065787069726174696f6e2c0000000000000000000000000060ae8201527f75696e743235362073616c74000000000000000000000000000000000000000060c18201527f290000000000000000000000000000000000000000000000000000000000000060cd82015260ce0190565b6040516020818303038152906040528051906020012083600001516001600160a01b031684602001516003811115610ab557634e487b7160e01b600052602160045260246000fd5b85604001516001600160a01b031686606001516001600160a01b031687608001518860a001518960c00151604051602001610af09190611fd4565b604051602081830303815290604052805190602001208a60e00151604051602001610b1b9190612013565b604051602081830303815290604052805190602001208b61010001518c6101200151604051602001610ba09b9a999897969594939291909a8b5260208b019990995260408a01979097526060890195909552608088019390935260a087019190915260c086015260e08501526101008401526101208301526101408201526101600190565b60408051601f1981840301815282825280516020918201208383018352600284527f1901000000000000000000000000000000000000000000000000000000000000848301529151919350610c1a92917f000000000000000000000000000000000000000000000000000000000000000091859101612059565b60405160208183030381529060405280519060200120915050919050565b33600090815260026020818152604080842085855290915282205460ff1690811115610c7457634e487b7160e01b600052602160045260246000fd5b14610c925760405163206931ef60e01b815260040160405180910390fd5b336000818152600260208181526040808420868552909152808320805460ff19169092179091555183917fae41337bd1e05e429fc52474ce72902a09610e71a4c57c5f18741b69b4f60f0991a350565b6001546001600160a01b03163314610d3c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161032b565b806001600160a01b0316ff5b600060026000541415610d9d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161032b565b6002600055610100840135421115610de1576040517fc56873ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610def6101748661228a565b9050610e09610e016020870187611dd4565b828686610294565b610e3f576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060026000610e526020890189611dd4565b6001600160a01b031681526020808201929092526040908101600090812085825290925290205460ff166002811115610e9b57634e487b7160e01b600052602160045260246000fd5b14610eb95760405163206931ef60e01b815260040160405180910390fd5b600160026000610ecc6020890189611dd4565b6001600160a01b03168152602080820192909252604090810160009081208582529092529020805460ff19166001836002811115610f1a57634e487b7160e01b600052602160045260246000fd5b02179055506003610f316040870160208801611eed565b6003811115610f5057634e487b7160e01b600052602160045260246000fd5b141561115c57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016610f916060880160408901611dd4565b6001600160a01b0316148015610faa5750856080013534145b1561102f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db087608001356040518263ffffffff1660e01b81526004016000604051808303818588803b15801561100e57600080fd5b505af1158015611022573d6000803e3d6000fd5b505050505030905061104e565b341561104e5760405163078d696560e31b815260040160405180910390fd5b60006110e76110636060890160408a01611dd4565b8361107160c08b018b61216c565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506110b09250505060e08c018c61216c565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061173092505050565b905060006110f98260808a0135612273565b905061112e8361110c60208b018b611dd4565b8361111d60608d0160408e01611dd4565b6001600160a01b0316929190611837565b61115461113e60208a018a611dd4565b3360a08b013561111d60808d0160608e01611dd4565b50505061133d565b600261116e6040870160208801611eed565b600381111561118d57634e487b7160e01b600052602160045260246000fd5b14156112645760006112016111a86080880160608901611dd4565b6111b56020890189611dd4565b6111c260c08a018a61216c565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506110b09250505060e08b018b61216c565b905060006112138260a0890135612273565b90506112376112256020890189611dd4565b338361111d60808c0160608d01611dd4565b61125d3361124860208a018a611dd4565b60808a013561111d60608c0160408d01611dd4565b505061133d565b60016112766040870160208801611eed565b600381111561129557634e487b7160e01b600052602160045260246000fd5b141561130b5734156112ba5760405163078d696560e31b815260040160405180910390fd5b6112e0336112cb6020880188611dd4565b608088013561111d60608a0160408b01611dd4565b6113066112f06020870187611dd4565b3360a088013561111d60808a0160608b01611dd4565b61133d565b6040517f688c176f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3361134b6020870187611dd4565b6001600160a01b0316827fa4f286c2cd737df7984cfa4885fe3f6321e51f4d1fc8ee437cef543729ead85060405160405180910390a460a08501356113966080870160608801611dd4565b6001600160a01b03166113af6040880160208901611eed565b60038111156113ce57634e487b7160e01b600052602160045260246000fd5b6040517f8c46aede5bd6765e83ddce17cd2c3d62c78935c8e07a90bad7390034384a006690600090a4608085013561140c6060870160408801611dd4565b6001600160a01b03167fa9d745d7fc75f2203e42fe7ff8dc2bb3840c38354029100bd70827060b8e7c7861144360c089018961216c565b61145060e08b018b61216c565b6040516114609493929190612080565b60405180910390a3600191505060016000559392505050565b6001546001600160a01b031633146114d35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161032b565b6001600160a01b03811661154f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161032b565b611558816116c6565b50565b6000808251116115d35760405162461bcd60e51b815260206004820152603460248201527f4c69624279746573236c617374427974653a20475245415445525f5448414e5f60448201527f5a45524f5f4c454e4754485f5245515549524544000000000000000000000000606482015260840161032b565b81600183516115e29190612273565b8151811061160057634e487b7160e01b600052603260045260246000fd5b01602001517fff000000000000000000000000000000000000000000000000000000000000001692915050565b600061163a82602061225b565b835110156116b05760405162461bcd60e51b815260206004820152603c60248201527f4c696242797465732372656164427974657333323a20475245415445525f4f5260448201527f5f455155414c5f544f5f33325f4c454e4754485f524551554952454400000000606482015260840161032b565b6116bb60208361225b565b929092015192915050565b600180546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000815183511461176d576040517fa182dff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b835181101561182e5782818151811061179957634e487b7160e01b600052603260045260246000fd5b6020026020010151826117ac9190612273565b915061181c858583815181106117d257634e487b7160e01b600052603260045260246000fd5b60200260200101518584815181106117fa57634e487b7160e01b600052603260045260246000fd5b6020026020010151896001600160a01b0316611837909392919063ffffffff16565b80611826816122c8565b915050611770565b50949350505050565b6001600160a01b0383163014156118585761185384838361186a565b611864565b61186484848484611918565b50505050565b6040516001600160a01b0383166024820152604481018290526119139084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611969565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526118649085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016118af565b600061199982604051806060016040528060268152602001612325602691396001600160a01b0386169190611a29565b80519091501561191357808060200190518101906119b79190611e75565b6119135760405162461bcd60e51b815260206004820152603060248201527f5361666545524332304552433732313a20746f6b656e206f7065726174696f6e60448201527f20646964206e6f74207375636365656400000000000000000000000000000000606482015260840161032b565b6060611a388484600085611a42565b90505b9392505050565b606082471015611aba5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161032b565b843b611b085760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161032b565b600080866001600160a01b03168587604051611b24919061203d565b60006040518083038185875af1925050503d8060008114611b61576040519150601f19603f3d011682016040523d82523d6000602084013e611b66565b606091505b5091509150611b76828286611b81565b979650505050505050565b60608315611b90575081611a3b565b825115611ba05782518084602001fd5b8160405162461bcd60e51b815260040161032b9190612159565b8035611bc58161230f565b919050565b600082601f830112611bda578081fd5b81356020611bef611bea8361220f565b6121de565b80838252828201915082860187848660051b8901011115611c0e578586fd5b855b85811015611c35578135611c238161230f565b84529284019290840190600101611c10565b5090979650505050505050565b600082601f830112611c52578081fd5b81356020611c62611bea8361220f565b80838252828201915082860187848660051b8901011115611c81578586fd5b855b85811015611c3557813584529284019290840190600101611c83565b60008083601f840112611cb0578182fd5b50813567ffffffffffffffff811115611cc7578182fd5b602083019150836020828501011115611cdf57600080fd5b9250929050565b803560048110611bc557600080fd5b60006101408284031215611d07578081fd5b611d0f6121b4565b9050611d1a82611bba565b8152611d2860208301611ce6565b6020820152611d3960408301611bba565b6040820152611d4a60608301611bba565b60608201526080820135608082015260a082013560a082015260c082013567ffffffffffffffff80821115611d7e57600080fd5b611d8a85838601611bca565b60c084015260e0840135915080821115611da357600080fd5b50611db084828501611c42565b60e08301525061010080830135818301525061012080830135818301525092915050565b600060208284031215611de5578081fd5b8135611a3b8161230f565b60008060408385031215611e02578081fd5b8235611e0d8161230f565b946020939093013593505050565b60008060008060608587031215611e30578182fd5b8435611e3b8161230f565b935060208501359250604085013567ffffffffffffffff811115611e5d578283fd5b611e6987828801611c9f565b95989497509550505050565b600060208284031215611e86578081fd5b81518015158114611a3b578182fd5b600060208284031215611ea6578081fd5b5035919050565b600060208284031215611ebe578081fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114611a3b578182fd5b600060208284031215611efe578081fd5b611a3b82611ce6565b600080600060408486031215611f1b578283fd5b833567ffffffffffffffff80821115611f32578485fd5b908501906101408288031215611f46578485fd5b90935060208501359080821115611f5b578384fd5b50611f6886828701611c9f565b9497909650939450505050565b600060208284031215611f86578081fd5b813567ffffffffffffffff811115611f9c578182fd5b61082784828501611cf5565b60008151808452611fc081602086016020860161229c565b601f01601f19169290920160200192915050565b815160009082906020808601845b838110156120075781516001600160a01b031685529382019390820190600101611fe2565b50929695505050505050565b815160009082906020808601845b8381101561200757815185529382019390820190600101612021565b6000825161204f81846020870161229c565b9190910192915050565b6000845161206b81846020890161229c565b91909101928352506020820152604001919050565b6040808252810184905260008560608301825b878110156120c35782356120a68161230f565b6001600160a01b0316825260209283019290910190600101612093565b5083810360208501528481527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8511156120fb578283fd5b8460051b9150818660208301370160200190815295945050505050565b828152604060208201526000611a386040830184611fa8565b602081016003831061215357634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000611a3b6020830184611fa8565b6000808335601e19843603018112612182578283fd5b83018035915067ffffffffffffffff82111561219c578283fd5b6020019150600581901b3603821315611cdf57600080fd5b604051610140810167ffffffffffffffff811182821017156121d8576121d86122f9565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612207576122076122f9565b604052919050565b600067ffffffffffffffff821115612229576122296122f9565b5060051b60200190565b60008085851115612242578182fd5b8386111561224e578182fd5b5050820193919092039150565b6000821982111561226e5761226e6122e3565b500190565b600082821015612285576122856122e3565b500390565b60006122963683611cf5565b92915050565b60005b838110156122b757818101518382015260200161229f565b838111156118645750506000910152565b60006000198214156122dc576122dc6122e3565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461155857600080fdfe5361666545524332304552433732313a206c6f772d6c6576656c2063616c6c206661696c6564a264697066735822122085ccebe06034ac6affa8b6cad20f00814196ab12ebd82d5edaacc40d84feb60e64736f6c6343000804003300000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1000000000000000000000000000000000000000000000000000000000000a4b1
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1000000000000000000000000000000000000000000000000000000000000a4b1
-----Decoded View---------------
Arg [0] : _weth (address): 0x82af49447d8a07e3bd95bd0d56f35241523fbab1
Arg [1] : _chainID (uint256): 42161
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1
Arg [1] : 000000000000000000000000000000000000000000000000000000000000a4b1
Deployed ByteCode Sourcemap
27467:6188:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21978:2602;;;;;;;;;;-1:-1:-1;21978:2602:0;;;;;:::i;:::-;;:::i;:::-;;;14624:14:1;;14617:22;14599:41;;14587:2;14572:18;21978:2602:0;;;;;;;;27663:26;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12498:55:1;;;12480:74;;12468:2;12453:18;27663:26:0;12435:125:1;13454:94:0;;;;;;;;;;;;;:::i;:::-;;26545:671;;;;;;;;;;-1:-1:-1;26545:671:0;;;;;:::i;:::-;;:::i;:::-;;;14797:25:1;;;14785:2;14770:18;26545:671:0;14752:76:1;12803:87:0;;;;;;;;;;-1:-1:-1;12876:6:0;;-1:-1:-1;;;;;12876:6:0;12803:87;;28637:232;;;;;;;;;;-1:-1:-1;28637:232:0;;;;;:::i;:::-;;:::i;27598:60::-;;;;;;;;;;-1:-1:-1;27598:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33554:98::-;;;;;;;;;;-1:-1:-1;33554:98:0;;;;;:::i;:::-;;:::i;26257:43::-;;;;;;;;;;;;;;;29022:3363;;;;;;:::i;:::-;;:::i;13703:192::-;;;;;;;;;;-1:-1:-1;13703:192:0;;;;;:::i;:::-;;:::i;21978:2602::-;22121:12;22161:16;22145:117;;;;-1:-1:-1;;;22145:117:0;;19466:2:1;22145:117:0;;;19448:21:1;19505:2;19485:18;;;19478:30;19544:34;19524:18;;;19517:62;19615:34;19595:18;;;19588:62;19687:5;19666:19;;;19659:34;19710:19;;22145:117:0;;;;;;;;;-1:-1:-1;;;;;22287:30:0;;22271:115;;;;-1:-1:-1;;;22271:115:0;;19046:2:1;22271:115:0;;;19028:21:1;19085:2;19065:18;;;19058:30;19124:34;19104:18;;;19097:62;19195:21;19175:18;;;19168:49;19234:19;;22271:115:0;19018:241:1;22271:115:0;22446:22;22477:16;:5;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22477:14:0;;-1:-1:-1;;;22477:16:0:i;:::-;22471:23;;;-1:-1:-1;22501:16:0;22520:5;22501:16;22520:5;22528:16;22543:1;22520:5;22528:16;:::i;:::-;22520:25;;;;;;;:::i;:::-;22501:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22501:44:0;;-1:-1:-1;;22615:31:0;;;;-1:-1:-1;;22615:31:0;;;;;;-1:-1:-1;;;22615:31:0;;;;;;;;;22585:61;-1:-1:-1;22701:7:0;;;;;23080:13;:38;;;;;;-1:-1:-1;;;23080:38:0;;;;;;;;;;23076:1135;;;23129:64;;-1:-1:-1;;;23129:64:0;;17841:2:1;23129:64:0;;;17823:21:1;17880:2;17860:18;;;17853:30;17919:34;17899:18;;;17892:62;17990:24;17970:18;;;17963:52;18032:19;;23129:64:0;17813:244:1;23076:1135:0;23263:20;23246:13;:37;;;;;;-1:-1:-1;;;23246:37:0;;;;;;;;;;23242:969;;;23298:18;:3;23314:1;23298:15;:18::i;:::-;23294:22;-1:-1:-1;23329:19:0;:3;23345:2;23329:15;:19::i;:::-;23325:23;;23367:3;23371:2;23367:7;;;;;;-1:-1:-1;;;23367:7:0;;;;;;;;;;;;;;;23396:25;;;;;;;;;;;;15353::1;;;23367:7:0;;;;;15394:18:1;;;15387:45;;;15448:18;;;15441:34;;;15491:18;;;15484:34;;;23367:7:0;-1:-1:-1;23396:25:0;;15325:19:1;;23396:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23396:25:0;;-1:-1:-1;;23396:25:0;;-1:-1:-1;;;;;23440:27:0;;;;;;;-1:-1:-1;23476:14:0;;-1:-1:-1;;;;;;;;23476:14:0;23242:969;23597:21;23580:13;:38;;;;;;-1:-1:-1;;;23580:38:0;;;;;;;;;;23576:635;;;23633:18;:3;23649:1;23633:15;:18::i;:::-;23629:22;-1:-1:-1;23664:19:0;:3;23680:2;23664:15;:19::i;:::-;23660:23;;23702:3;23706:2;23702:7;;;;;;-1:-1:-1;;;23702:7:0;;;;;;;;;;;;;;;23761:59;;10249:66:1;23761:59:0;;;10237:79:1;;;;10332:12;;;10325:28;;;23702:7:0;;;-1:-1:-1;23731:135:0;;10369:12:1;;23761:59:0;;;-1:-1:-1;;23761:59:0;;;;;;;;;23751:70;;23761:59;23751:70;;;;23731:135;;;;;;;;;15353:25:1;15426:4;15414:17;;15394:18;;;15387:45;15448:18;;;15441:34;;;15491:18;;;15484:34;;;15325:19;;23731:135:0;15307:217:1;23576:635:0;24043:27;24026:13;:44;;;;;;-1:-1:-1;;;24026:44:0;;;;;;;;;;24022:189;;;24121:59;;-1:-1:-1;;;24121:59:0;;-1:-1:-1;;;;;24121:47:0;;;;;:59;;24169:5;;24176:3;;24121:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24091:89;;-1:-1:-1;;;24091:89:0;;-1:-1:-1;24189:14:0;;-1:-1:-1;;;;;;;24189:14:0;24022:189;24506:68;;-1:-1:-1;;;24506:68:0;;17007:2:1;24506:68:0;;;16989:21:1;17046:2;17026:18;;;17019:30;17085:34;17065:18;;;17058:62;17156:28;17136:18;;;17129:56;17202:19;;24506:68:0;16979:248:1;21978:2602:0;;;;;;;:::o;13454:94::-;12876:6;;-1:-1:-1;;;;;12876:6:0;11662:10;13023:23;13015:68;;;;-1:-1:-1;;;13015:68:0;;18685:2:1;13015:68:0;;;18667:21:1;;;18704:18;;;18697:30;18763:34;18743:18;;;18736:62;18815:18;;13015:68:0;18657:182:1;13015:68:0;13519:21:::1;13537:1;13519:9;:21::i;:::-;13454:94::o:0;26545:671::-;26601:7;26617:23;25914:335;;;;;;11717:8:1;11705:21;;11755:17;11751:1;11742:11;;11735:38;11803:20;11798:2;11789:12;;11782:42;11854:19;11849:2;11840:12;;11833:41;11904:20;11899:2;11890:12;;11883:42;11955:29;11950:2;11941:12;;11934:51;12016:30;12010:3;12001:13;;11994:53;12078:26;12072:3;12063:13;;12056:49;12136:23;12130:3;12121:13;;12114:46;12191:21;12185:3;12176:13;;12169:44;12244:14;12238:3;12229:13;;12222:37;12290:3;12284;12275:13;;12268:26;12319:3;12310:13;;11695:634;25914:335:0;;;;;;;;;;;;;25904:346;;;;;;26717:6;:13;;;-1:-1:-1;;;;;26701:31:0;26749:6;:16;;;26741:25;;;;;;-1:-1:-1;;;26741:25:0;;;;;;;;;26791:6;:15;;;-1:-1:-1;;;;;26775:33:0;26833:6;:16;;;-1:-1:-1;;;;;26817:34:0;26860:6;:25;;;26894:6;:26;;;26956:6;:20;;;26939:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;26929:49;;;;;;27014:6;:17;;;26997:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;26987:46;;;;;;27042:6;:17;;;27068:6;:11;;;26653:433;;;;;;;;;;;;;;;;;8847:19:1;;;8891:2;8882:12;;8875:28;;;;8928:2;8919:12;;8912:28;;;;8965:2;8956:12;;8949:28;;;;9002:3;8993:13;;8986:29;;;;9040:3;9031:13;;9024:29;;;;9078:3;9069:13;;9062:29;9116:3;9107:13;;9100:29;9154:3;9145:13;;9138:29;9192:3;9183:13;;9176:29;9230:3;9221:13;;9214:30;9269:3;9260:13;;8837:442;26653:433:0;;;;-1:-1:-1;;26653:433:0;;;;;;;;;26643:444;;26653:433;26643:444;;;;27138:13;;;;;;;;;;;;;27113:96;;26643:444;;-1:-1:-1;27113:96:0;;26653:433;27160:18;;26643:444;;27113:96;;:::i;:::-;;;;;;;;;;;;;27103:107;;;;;;27096:114;;;26545:671;;;:::o;28637:232::-;28695:10;28717:11;28688:18;;;:6;:18;;;;;;;;:25;;;;;;;;;;;;:40;;;;;-1:-1:-1;;;28688:40:0;;;;;;;;;;28684:84;;28746:14;;-1:-1:-1;;;28746:14:0;;;;;;;;;;;28684:84;28783:10;28776:18;;;;28804:15;28776:18;;;;;;;;:25;;;;;;;;;:43;;-1:-1:-1;;28776:43:0;;;;;;;28831:32;28776:25;;28831:32;;;28637:232;:::o;33554:98::-;12876:6;;-1:-1:-1;;;;;12876:6:0;11662:10;13023:23;13015:68;;;;-1:-1:-1;;;13015:68:0;;18685:2:1;13015:68:0;;;18667:21:1;;;18704:18;;;18697:30;18763:34;18743:18;;;18736:62;18815:18;;13015:68:0;18657:182:1;13015:68:0;33635:10:::1;-1:-1:-1::0;;;;;33622:24:0::1;;29022:3363:::0;29125:4;15841:1;16437:7;;:19;;16429:63;;;;-1:-1:-1;;;16429:63:0;;21146:2:1;16429:63:0;;;21128:21:1;21185:2;21165:18;;;21158:30;21224:33;21204:18;;;21197:61;21275:18;;16429:63:0;21118:181:1;16429:63:0;15841:1;16570:7;:18;29188:17:::1;::::0;::::1;;29170:15;:35;29166:79;;;29223:14;;;;;;;;;;;;;;29166:79;29280:17;29300:24;;29317:6:::0;29300:24:::1;:::i;:::-;29280:44:::0;-1:-1:-1;29367:54:0::1;29384:13;;::::0;::::1;:6:::0;:13:::1;:::i;:::-;29399:9;29410:10;;29367:16;:54::i;:::-;29362:103;;29439:18;;;;;;;;;;;;;;29362:103;29560:11;29524:6;:21;29531:13;;::::0;::::1;:6:::0;:13:::1;:::i;:::-;-1:-1:-1::0;;;;;29524:21:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;29524:21:0;;;:32;;;;;;;;;::::1;;:47;::::0;::::1;;;;-1:-1:-1::0;;;29524:47:0::1;;;;;;;;;;29520:91;;29589:14;;-1:-1:-1::0;;;29589:14:0::1;;;;;;;;;;;29520:91;29694:15;29659:6;:21;29666:13;;::::0;::::1;:6:::0;:13:::1;:::i;:::-;-1:-1:-1::0;;;;;29659:21:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;29659:21:0;;;:32;;;;;;;;:50;;-1:-1:-1;;29659:50:0::1;::::0;;::::1;::::0;::::1;;;;-1:-1:-1::0;;;29659:50:0::1;;;;;;;;;;;::::0;;-1:-1:-1;29804:17:0::1;29784:16;::::0;;;::::1;::::0;::::1;;:::i;:::-;:37;;;;;;-1:-1:-1::0;;;29784:37:0::1;;;;;;;;;;29780:2272;;;29905:10;-1:-1:-1::0;;;;;30051:4:0::1;30024:32;:15;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;30024:32:0::1;;:74;;;;;30073:6;:25;;;30060:9;:38;30024:74;30020:330;;;30111:4;-1:-1:-1::0;;;;;30111:12:0::1;;30132:6;:25;;;30111:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;30197:4;30172:30;;30020:330;;;30222:9;:13:::0;30218:132:::1;;30324:16;;-1:-1:-1::0;;;30324:16:0::1;;;;;;;;;;;30218:132;30392:20;30415:85;30427:15;::::0;;;::::1;::::0;::::1;;:::i;:::-;30444:14:::0;30460:20:::1;;::::0;::::1;:6:::0;:20:::1;:::i;:::-;30415:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30482:17:0::1;::::0;-1:-1:-1;;;30482:17:0::1;::::0;::::1;::::0;::::1;:::i;:::-;30415:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30415:11:0::1;::::0;-1:-1:-1;;;30415:85:0:i:1;:::-;30392:108:::0;-1:-1:-1;30509:21:0::1;30533:40;30392:108:::0;30533:25:::1;::::0;::::1;;:40;:::i;:::-;30509:64:::0;-1:-1:-1;30661:92:0::1;30708:14:::0;30724:13:::1;;::::0;::::1;:6:::0;:13:::1;:::i;:::-;30739::::0;30674:15:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;30661:46:0::1;::::0;:92;;:46:::1;:92::i;:::-;30802:102;30850:13;;::::0;::::1;:6:::0;:13:::1;:::i;:::-;30865:10;30877:26;::::0;::::1;;30815:16;::::0;;;::::1;::::0;::::1;;:::i;30802:102::-;29780:2272;;;;;;31030:16;31010;::::0;;;::::1;::::0;::::1;;:::i;:::-;:36;;;;;;-1:-1:-1::0;;;31010:36:0::1;;;;;;;;;;31006:1046;;;31090:20;31113:85;31125:16;::::0;;;::::1;::::0;::::1;;:::i;:::-;31143:13;;::::0;::::1;:6:::0;:13:::1;:::i;:::-;31158:20;;::::0;::::1;:6:::0;:20:::1;:::i;:::-;31113:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31180:17:0::1;::::0;-1:-1:-1;;;31180:17:0::1;::::0;::::1;::::0;::::1;:::i;31113:85::-;31090:108:::0;-1:-1:-1;31207:21:0::1;31231:41;31090:108:::0;31231:26:::1;::::0;::::1;;:41;:::i;:::-;31207:65:::0;-1:-1:-1;31357:89:0::1;31405:13;;::::0;::::1;:6:::0;:13:::1;:::i;:::-;31420:10;31432:13:::0;31370:16:::1;::::0;;;::::1;::::0;::::1;;:::i;31357:89::-;31500:100;31547:10;31559:13;;::::0;::::1;:6:::0;:13:::1;:::i;:::-;31574:25;::::0;::::1;;31513:15;::::0;;;::::1;::::0;::::1;;:::i;31500:100::-;31006:1046;;;;;31701:18;31681:16;::::0;;;::::1;::::0;::::1;;:::i;:::-;:38;;;;;;-1:-1:-1::0;;;31681:38:0::1;;;;;;;;;;31677:375;;;31734:9;:13:::0;31730:47:::1;;31758:16;;-1:-1:-1::0;;;31758:16:0::1;;;;;;;;;;;31730:47;31785:100;31832:10;31844:13;;::::0;::::1;:6:::0;:13:::1;:::i;:::-;31859:25;::::0;::::1;;31798:15;::::0;;;::::1;::::0;::::1;;:::i;31785:100::-;31894:102;31942:13;;::::0;::::1;:6:::0;:13:::1;:::i;:::-;31957:10;31969:26;::::0;::::1;;31907:16;::::0;;;::::1;::::0;::::1;;:::i;31894:102::-;31677:375;;;32026:18;;;;;;;;;;;;;;31677:375;32127:10;32112:13;;::::0;::::1;:6:::0;:13:::1;:::i;:::-;-1:-1:-1::0;;;;;32085:53:0::1;32101:9;32085:53;;;;;;;;;;32202:26;::::0;::::1;;32184:16;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;32150:79:0::1;32166:16;::::0;;;::::1;::::0;::::1;;:::i;:::-;32150:79;;;;;;-1:-1:-1::0;;;32150:79:0::1;;;;;;;;;;::::0;::::1;::::0;;;::::1;32274:25;::::0;::::1;;32257:15;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;32241:100:0::1;;32301:20;;::::0;::::1;:6:::0;:20:::1;:::i;:::-;32323:17;;::::0;::::1;:6:::0;:17:::1;:::i;:::-;32241:100;;;;;;;;;:::i;:::-;;;;;;;;32375:4;32368:11;;;15797:1:::0;16749:7;:22;29022:3363;;-1:-1:-1;;;29022:3363:0:o;13703:192::-;12876:6;;-1:-1:-1;;;;;12876:6:0;11662:10;13023:23;13015:68;;;;-1:-1:-1;;;13015:68:0;;18685:2:1;13015:68:0;;;18667:21:1;;;18704:18;;;18697:30;18763:34;18743:18;;;18736:62;18815:18;;13015:68:0;18657:182:1;13015:68:0;-1:-1:-1;;;;;13792:22:0;::::1;13784:73;;;::::0;-1:-1:-1;;;13784:73:0;;16600:2:1;13784:73:0::1;::::0;::::1;16582:21:1::0;16639:2;16619:18;;;16612:30;16678:34;16658:18;;;16651:62;16749:8;16729:18;;;16722:36;16775:19;;13784:73:0::1;16572:228:1::0;13784:73:0::1;13868:19;13878:8;13868:9;:19::i;:::-;13703:192:::0;:::o;18900:281::-;18972:13;19024:1;19013;:8;:12;18997:98;;;;-1:-1:-1;;;18997:98:0;;18264:2:1;18997:98:0;;;18246:21:1;18303:2;18283:18;;;18276:30;18342:34;18322:18;;;18315:62;18413:22;18393:18;;;18386:50;18453:19;;18997:98:0;18236:242:1;18997:98:0;19138:1;19151;19140;:8;:12;;;;:::i;:::-;19138:15;;;;;;-1:-1:-1;;;19138:15:0;;;;;;;;;;;;;;;;18900:281;-1:-1:-1;;18900:281:0:o;19557:457::-;19662:14;19716:10;:5;19724:2;19716:10;:::i;:::-;19704:1;:8;:22;;19688:116;;;;-1:-1:-1;;;19688:116:0;;20717:2:1;19688:116:0;;;20699:21:1;20756:2;20736:18;;;20729:30;20795:34;20775:18;;;20768:62;20866:30;20846:18;;;20839:58;20914:19;;19688:116:0;20689:250:1;19688:116:0;19871:11;19880:2;19871:11;;:::i;:::-;19968:13;;;;19962:20;;19557:457;-1:-1:-1;;19557:457:0:o;13903:173::-;13978:6;;;-1:-1:-1;;;;;13995:17:0;;;;;;;;;;;14028:40;;13978:6;;;13995:17;13978:6;;14028:40;;13959:16;;14028:40;13903:173;;:::o;32786:552::-;32921:22;33009:11;:18;32984:14;:21;:43;32980:88;;33045:15;;;;;;;;;;;;;;32980:88;33116:9;33111:192;33135:14;:21;33131:1;:25;33111:192;;;33190:11;33202:1;33190:14;;;;;;-1:-1:-1;;;33190:14:0;;;;;;;;;;;;;;;33172:32;;;;;:::i;:::-;;;33213:82;33254:5;33261:14;33276:1;33261:17;;;;;;-1:-1:-1;;;33261:17:0;;;;;;;;;;;;;;;33280:11;33292:1;33280:14;;;;;;-1:-1:-1;;;33280:14:0;;;;;;;;;;;;;;;33226:9;-1:-1:-1;;;;;33213:40:0;;;:82;;;;;;:::i;:::-;33158:3;;;;:::i;:::-;;;;33111:192;;;;32786:552;;;;;;:::o;9022:312::-;-1:-1:-1;;;;;9176:21:0;;9192:4;9176:21;9172:155;;;9212:31;9226:5;9233:2;9237:5;9212:13;:31::i;:::-;9172:155;;;9274:41;9292:5;9299:4;9305:2;9309:5;9274:17;:41::i;:::-;9022:312;;;;:::o;9342:217::-;9492:58;;-1:-1:-1;;;;;13160:55:1;;9492:58:0;;;13142:74:1;13232:18;;;13225:34;;;9465:86:0;;9485:5;;9515:23;;13115:18:1;;9492:58:0;;;;-1:-1:-1;;9492:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;9465:19;:86::i;:::-;9342:217;;;:::o;9567:254::-;9744:68;;-1:-1:-1;;;;;12846:15:1;;;9744:68:0;;;12828:34:1;12898:15;;12878:18;;;12871:43;12930:18;;;12923:34;;;9717:96:0;;9737:5;;9767:27;;12740:18:1;;9744:68:0;12722:241:1;10212:734:0;10642:23;10668:75;10696:4;10668:75;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10668:27:0;;;:75;:27;:75::i;:::-;10758:17;;10642:101;;-1:-1:-1;10758:21:0;10754:185;;10855:10;10844:30;;;;;;;;;;;;:::i;:::-;10836:91;;;;-1:-1:-1;;;10836:91:0;;20300:2:1;10836:91:0;;;20282:21:1;20339:2;20319:18;;;20312:30;20378:34;20358:18;;;20351:62;20449:18;20429;;;20422:46;20485:19;;10836:91:0;20272:238:1;3645:229:0;3782:12;3814:52;3836:6;3844:4;3850:1;3853:12;3814:21;:52::i;:::-;3807:59;;3645:229;;;;;;:::o;4765:510::-;4935:12;4993:5;4968:21;:30;;4960:81;;;;-1:-1:-1;;;4960:81:0;;17434:2:1;4960:81:0;;;17416:21:1;17473:2;17453:18;;;17446:30;17512:34;17492:18;;;17485:62;17583:8;17563:18;;;17556:36;17609:19;;4960:81:0;17406:228:1;4960:81:0;1162:20;;5052:60;;;;-1:-1:-1;;;5052:60:0;;19942:2:1;5052:60:0;;;19924:21:1;19981:2;19961:18;;;19954:30;20020:31;20000:18;;;19993:59;20069:18;;5052:60:0;19914:179:1;5052:60:0;5126:12;5140:23;5167:6;-1:-1:-1;;;;;5167:11:0;5186:5;5193:4;5167:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5125:73;;;;5216:51;5233:7;5242:10;5254:12;5216:16;:51::i;:::-;5209:58;4765:510;-1:-1:-1;;;;;;;4765:510:0:o;7451:712::-;7601:12;7630:7;7626:530;;;-1:-1:-1;7661:10:0;7654:17;;7626:530;7775:17;;:21;7771:374;;7973:10;7967:17;8034:15;8021:10;8017:2;8013:19;8006:44;7921:148;8116:12;8109:20;;-1:-1:-1;;;8109:20:0;;;;;;;;:::i;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;:::-;63:85;;;:::o;153:768::-;207:5;260:3;253:4;245:6;241:17;237:27;227:2;;282:5;275;268:20;227:2;322:6;309:20;348:4;372:60;388:43;428:2;388:43;:::i;:::-;372:60;:::i;:::-;454:3;478:2;473:3;466:15;506:2;501:3;497:12;490:19;;541:2;533:6;529:15;593:3;588:2;582;579:1;575:10;567:6;563:23;559:32;556:41;553:2;;;614:5;607;600:20;553:2;640:5;654:238;668:2;665:1;662:9;654:238;;;739:3;726:17;756:31;781:5;756:31;:::i;:::-;800:18;;838:12;;;;870;;;;686:1;679:9;654:238;;;-1:-1:-1;910:5:1;;217:704;-1:-1:-1;;;;;;;217:704:1:o;926:693::-;980:5;1033:3;1026:4;1018:6;1014:17;1010:27;1000:2;;1055:5;1048;1041:20;1000:2;1095:6;1082:20;1121:4;1145:60;1161:43;1201:2;1161:43;:::i;1145:60::-;1227:3;1251:2;1246:3;1239:15;1279:2;1274:3;1270:12;1263:19;;1314:2;1306:6;1302:15;1366:3;1361:2;1355;1352:1;1348:10;1340:6;1336:23;1332:32;1329:41;1326:2;;;1387:5;1380;1373:20;1326:2;1413:5;1427:163;1441:2;1438:1;1435:9;1427:163;;;1498:17;;1486:30;;1536:12;;;;1568;;;;1459:1;1452:9;1427:163;;1624:375;1675:8;1685:6;1739:3;1732:4;1724:6;1720:17;1716:27;1706:2;;1764:8;1754;1747:26;1706:2;-1:-1:-1;1794:20:1;;1837:18;1826:30;;1823:2;;;1876:8;1866;1859:26;1823:2;1920:4;1912:6;1908:17;1896:29;;1972:3;1965:4;1956:6;1948;1944:19;1940:30;1937:39;1934:2;;;1989:1;1986;1979:12;1934:2;1696:303;;;;;:::o;2004:150::-;2079:20;;2128:1;2118:12;;2108:2;;2144:1;2141;2134:12;2159:1182;2211:5;2259:6;2247:9;2242:3;2238:19;2234:32;2231:2;;;2283:5;2276;2269:20;2231:2;2309:22;;:::i;:::-;2300:31;;2354:29;2373:9;2354:29;:::i;:::-;2347:5;2340:44;2416:45;2457:2;2446:9;2442:18;2416:45;:::i;:::-;2411:2;2404:5;2400:14;2393:69;2494:38;2528:2;2517:9;2513:18;2494:38;:::i;:::-;2489:2;2482:5;2478:14;2471:62;2565:38;2599:2;2588:9;2584:18;2565:38;:::i;:::-;2560:2;2553:5;2549:14;2542:62;2665:3;2654:9;2650:19;2637:33;2631:3;2624:5;2620:15;2613:58;2732:3;2721:9;2717:19;2704:33;2698:3;2691:5;2687:15;2680:58;2789:3;2778:9;2774:19;2761:33;2813:18;2854:2;2846:6;2843:14;2840:2;;;2870:1;2867;2860:12;2840:2;2907:57;2960:3;2951:6;2940:9;2936:22;2907:57;:::i;:::-;2901:3;2894:5;2890:15;2883:82;3018:3;3007:9;3003:19;2990:33;2974:49;;3048:2;3038:8;3035:16;3032:2;;;3064:1;3061;3054:12;3032:2;;3101:59;3156:3;3145:8;3134:9;3130:24;3101:59;:::i;:::-;3095:3;3088:5;3084:15;3077:84;;3180:3;3243:2;3232:9;3228:18;3215:32;3210:2;3203:5;3199:14;3192:56;;3267:3;3330:2;3319:9;3315:18;3302:32;3297:2;3290:5;3286:14;3279:56;;2221:1120;;;;:::o;3346:257::-;3405:6;3458:2;3446:9;3437:7;3433:23;3429:32;3426:2;;;3479:6;3471;3464:22;3426:2;3523:9;3510:23;3542:31;3567:5;3542:31;:::i;3878:325::-;3946:6;3954;4007:2;3995:9;3986:7;3982:23;3978:32;3975:2;;;4028:6;4020;4013:22;3975:2;4072:9;4059:23;4091:31;4116:5;4091:31;:::i;:::-;4141:5;4193:2;4178:18;;;;4165:32;;-1:-1:-1;;;3965:238:1:o;4208:632::-;4296:6;4304;4312;4320;4373:2;4361:9;4352:7;4348:23;4344:32;4341:2;;;4394:6;4386;4379:22;4341:2;4438:9;4425:23;4457:31;4482:5;4457:31;:::i;:::-;4507:5;-1:-1:-1;4559:2:1;4544:18;;4531:32;;-1:-1:-1;4614:2:1;4599:18;;4586:32;4641:18;4630:30;;4627:2;;;4678:6;4670;4663:22;4627:2;4722:58;4772:7;4763:6;4752:9;4748:22;4722:58;:::i;:::-;4331:509;;;;-1:-1:-1;4799:8:1;-1:-1:-1;;;;4331:509:1:o;4845:297::-;4912:6;4965:2;4953:9;4944:7;4940:23;4936:32;4933:2;;;4986:6;4978;4971:22;4933:2;5023:9;5017:16;5076:5;5069:13;5062:21;5055:5;5052:32;5042:2;;5103:6;5095;5088:22;5147:190;5206:6;5259:2;5247:9;5238:7;5234:23;5230:32;5227:2;;;5280:6;5272;5265:22;5227:2;-1:-1:-1;5308:23:1;;5217:120;-1:-1:-1;5217:120:1:o;5342:356::-;5411:6;5464:2;5452:9;5443:7;5439:23;5435:32;5432:2;;;5485:6;5477;5470:22;5432:2;5522:9;5516:16;5572:66;5565:5;5561:78;5554:5;5551:89;5541:2;;5659:6;5651;5644:22;5703:216;5775:6;5828:2;5816:9;5807:7;5803:23;5799:32;5796:2;;;5849:6;5841;5834:22;5796:2;5877:36;5903:9;5877:36;:::i;5924:732::-;6027:6;6035;6043;6096:2;6084:9;6075:7;6071:23;6067:32;6064:2;;;6117:6;6109;6102:22;6064:2;6162:9;6149:23;6191:18;6232:2;6224:6;6221:14;6218:2;;;6253:6;6245;6238:22;6218:2;6281:22;;;;6337:3;6319:16;;;6315:26;6312:2;;;6359:6;6351;6344:22;6312:2;6387;;-1:-1:-1;6442:2:1;6427:18;;6414:32;;6458:16;;;6455:2;;;6492:6;6484;6477:22;6455:2;;6536:60;6588:7;6577:8;6566:9;6562:24;6536:60;:::i;:::-;6054:602;;6615:8;;-1:-1:-1;6510:86:1;;-1:-1:-1;;;;6054:602:1:o;6661:360::-;6742:6;6795:2;6783:9;6774:7;6770:23;6766:32;6763:2;;;6816:6;6808;6801:22;6763:2;6861:9;6848:23;6894:18;6886:6;6883:30;6880:2;;;6931:6;6923;6916:22;6880:2;6959:56;7007:7;6998:6;6987:9;6983:22;6959:56;:::i;7026:257::-;7067:3;7105:5;7099:12;7132:6;7127:3;7120:19;7148:63;7204:6;7197:4;7192:3;7188:14;7181:4;7174:5;7170:16;7148:63;:::i;:::-;7265:2;7244:15;-1:-1:-1;;7240:29:1;7231:39;;;;7272:4;7227:50;;7075:208;-1:-1:-1;;7075:208:1:o;7288:594::-;7506:13;;7449:3;;7480;;7559:4;7586:15;;;7449:3;7631:224;7645:6;7642:1;7639:13;7631:224;;;7712:13;;-1:-1:-1;;;;;7708:62:1;7694:77;;7793:14;;;;7830:15;;;;7667:1;7660:9;7631:224;;;-1:-1:-1;7871:5:1;;7457:425;-1:-1:-1;;;;;;7457:425:1:o;7887:545::-;8105:13;;8048:3;;8079;;8158:4;8185:15;;;8048:3;8230:175;8244:6;8241:1;8238:13;8230:175;;;8307:13;;8293:28;;8343:14;;;;8380:15;;;;8266:1;8259:9;8230:175;;9284:274;9413:3;9451:6;9445:13;9467:53;9513:6;9508:3;9501:4;9493:6;9489:17;9467:53;:::i;:::-;9536:16;;;;;9421:137;-1:-1:-1;;9421:137:1:o;9563:439::-;9750:3;9788:6;9782:13;9804:53;9850:6;9845:3;9838:4;9830:6;9826:17;9804:53;:::i;:::-;9879:16;;;;9904:21;;;-1:-1:-1;9952:4:1;9941:16;;9934:32;9993:2;9982:14;;9758:244;-1:-1:-1;9758:244:1:o;13270:1184::-;13558:2;13570:21;;;13543:18;;13626:22;;;13510:4;13705:6;13679:2;13664:18;;13510:4;13742:327;13756:6;13753:1;13750:13;13742:327;;;13831:6;13818:20;13851:31;13876:5;13851:31;:::i;:::-;-1:-1:-1;;;;;13907:54:1;13895:67;;13985:4;14044:15;;;;14009:12;;;;13778:1;13771:9;13742:327;;;13746:3;14116:9;14111:3;14107:19;14100:4;14089:9;14085:20;14078:49;14148:6;14143:3;14136:19;14178:66;14170:6;14167:78;14164:2;;;14261:4;14255;14248:18;14164:2;14298:6;14295:1;14291:14;14277:28;;14351:6;14343;14336:4;14331:3;14327:14;14314:44;14381:16;14399:4;14377:27;14413:16;;;14377:27;13519:935;-1:-1:-1;;;;;13519:935:1:o;14833:288::-;15008:6;14997:9;14990:25;15051:2;15046;15035:9;15031:18;15024:30;14971:4;15071:44;15111:2;15100:9;15096:18;15088:6;15071:44;:::i;15773:396::-;15916:2;15901:18;;15949:1;15938:13;;15928:2;;-1:-1:-1;;;15982:1:1;15975:88;16086:4;16083:1;16076:15;16114:4;16111:1;16104:15;15928:2;16138:25;;;15883:286;:::o;16174:219::-;16323:2;16312:9;16305:21;16286:4;16343:44;16383:2;16372:9;16368:18;16360:6;16343:44;:::i;21304:557::-;21397:4;21403:6;21463:11;21450:25;21557:2;21553:7;21542:8;21526:14;21522:29;21518:43;21498:18;21494:68;21484:2;;21579:4;21573;21566:18;21484:2;21609:33;;21661:20;;;-1:-1:-1;21704:18:1;21693:30;;21690:2;;;21739:4;21733;21726:18;21690:2;21775:4;21763:17;;-1:-1:-1;21826:1:1;21822:14;;;21806;21802:35;21792:46;;21789:2;;;21851:1;21848;21841:12;22428:255;22500:2;22494:9;22542:6;22530:19;;22579:18;22564:34;;22600:22;;;22561:62;22558:2;;;22626:18;;:::i;:::-;22662:2;22655:22;22474:209;:::o;22688:275::-;22759:2;22753:9;22824:2;22805:13;;-1:-1:-1;;22801:27:1;22789:40;;22859:18;22844:34;;22880:22;;;22841:62;22838:2;;;22906:18;;:::i;:::-;22942:2;22935:22;22733:230;;-1:-1:-1;22733:230:1:o;22968:183::-;23028:4;23061:18;23053:6;23050:30;23047:2;;;23083:18;;:::i;:::-;-1:-1:-1;23128:1:1;23124:14;23140:4;23120:25;;23037:114::o;23156:363::-;23261:9;23272;23314:8;23302:10;23299:24;23296:2;;;23344:9;23333;23326:28;23296:2;23381:6;23371:8;23368:20;23365:2;;;23409:9;23398;23391:28;23365:2;-1:-1:-1;;23443:23:1;;;23488:25;;;;;-1:-1:-1;23286:233:1:o;23524:128::-;23564:3;23595:1;23591:6;23588:1;23585:13;23582:2;;;23601:18;;:::i;:::-;-1:-1:-1;23637:9:1;;23572:80::o;23657:125::-;23697:4;23725:1;23722;23719:8;23716:2;;;23730:18;;:::i;:::-;-1:-1:-1;23767:9:1;;23706:76::o;23787:185::-;23883:9;23920:46;23951:14;23944:5;23920:46;:::i;:::-;23907:59;23897:75;-1:-1:-1;;23897:75:1:o;23977:258::-;24049:1;24059:113;24073:6;24070:1;24067:13;24059:113;;;24149:11;;;24143:18;24130:11;;;24123:39;24095:2;24088:10;24059:113;;;24190:6;24187:1;24184:13;24181:2;;;-1:-1:-1;;24225:1:1;24207:16;;24200:27;24030:205::o;24240:135::-;24279:3;-1:-1:-1;;24300:17:1;;24297:2;;;24320:18;;:::i;:::-;-1:-1:-1;24367:1:1;24356:13;;24287:88::o;24380:184::-;-1:-1:-1;;;24429:1:1;24422:88;24529:4;24526:1;24519:15;24553:4;24550:1;24543:15;24569:184;-1:-1:-1;;;24618:1:1;24611:88;24718:4;24715:1;24708:15;24742:4;24739:1;24732:15;24758:154;-1:-1:-1;;;;;24837:5:1;24833:54;24826:5;24823:65;24813:2;;24902:1;24899;24892:12
Metadata Hash
85ccebe06034ac6affa8b6cad20f00814196ab12ebd82d5edaacc40d84feb60e
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.