Source Code
Latest 7 from a total of 7 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| 0x158a1ca1 | 115281667 | 780 days ago | IN | 0 ETH | 0.00001534803 | ||||
| Set Merkle Root | 111701623 | 863 days ago | IN | 0 ETH | 0.000041450484 | ||||
| Set Merkle Root | 111052736 | 878 days ago | IN | 0 ETH | 0.000013637038 | ||||
| Set Merkle Root | 110914981 | 881 days ago | IN | 0 ETH | 0.00001258158 | ||||
| Set Merkle Root | 110056885 | 901 days ago | IN | 0 ETH | 0.000015728743 | ||||
| 0x2384fc74 | 110056844 | 901 days ago | IN | 0 ETH | 0.000019726796 | ||||
| 0x158a1ca1 | 110056644 | 901 days ago | IN | 0 ETH | 0.000016135425 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TakoFarcasterHub
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.17;
import "./access/Ownable.sol";
import "./libraries/DataTypes.sol";
import "./libraries/Errors.sol";
import "./libraries/SigUtils.sol";
import "./interfaces/IIdRegistry.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
contract TakoFarcasterHub is Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
address FARCASTER_ID_REGISTRY;
enum BidType {
Casts,
Reply,
Recasts
}
struct BidData {
string contentURI;
string parentHash;
address bidToken;
uint256 bidAmount;
uint256 duration;
uint256[] toCurators;
address[] toCuratorAddresses;
}
struct Content {
string contentURI;
string parentHash;
address bidToken;
uint256 bidAmount;
address bidAddress;
uint256 bidExpires;
uint256[] toCurators;
uint256 curatorId;
string curatorContentId;
DataTypes.AuditStatus status;
BidType bidType;
}
string public constant name = "Tako Farcaster Hub";
bytes32 public merkleRoot;
bytes32 internal constant LOAN_WITH_SIG_TYPEHASH =
keccak256(
"LoanWithSig(uint256 index,address curator,string contentId,uint256 deadline)"
);
uint8 public maxToCuratorCounter = 5;
uint256 public maxDuration = 14 days;
address public feeCollector;
uint256 public feeRate = 1 * 10 ** 8;
uint256 _bidCounter;
mapping(uint256 => Content) internal _contentByIndex;
mapping(address => bool) internal _bidTokenWhitelisted;
mapping(address => mapping(address => uint256)) _minBidByTokenByWallet;
mapping(address => mapping(BidType => bool)) _disableAuditType;
mapping(address => bool) internal _relayerWhitelisted;
mapping(address => bool) internal _governance;
uint256 public constant FEE_DENOMINATOR = 10 ** 10;
event addBidEvent(uint256 index, Content content);
event modifiBidEvent(uint256 index, Content content);
modifier onlyGov() {
if (!_governance[_msgSender()]) {
revert Errors.NotGovernance();
}
_;
}
modifier onlyWhitelisted(DataTypes.MerkleVerifyData memory verifyData) {
if (merkleRoot != bytes32(0)) {
address wallet = msg.sender;
bytes32 node = keccak256(
abi.encodePacked(verifyData.index, wallet)
);
if (!MerkleProof.verify(verifyData.merkleProof, merkleRoot, node))
revert Errors.NotWhitelisted();
}
_;
}
constructor(bytes32 initMerkleRoot, address farcasterIdRegistry) {
merkleRoot = initMerkleRoot;
feeCollector = _msgSender();
FARCASTER_ID_REGISTRY = farcasterIdRegistry;
}
receive() external payable {}
// Owner
function setFeeCollector(
address newsFeeCollector,
uint256 newFeeRate
) external onlyOwner {
if (newsFeeCollector == address(0)) revert Errors.AddressCanNotBeZero();
if (newFeeRate > FEE_DENOMINATOR) revert Errors.RateExceedsMaximum();
feeRate = newFeeRate;
feeCollector = newsFeeCollector;
}
function setGovernance(address gov, bool whitelist) external onlyOwner {
if (gov == address(0)) revert Errors.AddressCanNotBeZero();
_governance[gov] = whitelist;
}
// Gov
function setMerkleRoot(bytes32 newMerkleRoot) external onlyGov {
merkleRoot = newMerkleRoot;
}
function whitelistBidToken(address token, bool whitelist) external onlyGov {
_bidTokenWhitelisted[token] = whitelist;
}
function whitelistRelayer(
address relayer,
bool whitelist
) external onlyGov {
if (relayer == address(0)) revert Errors.AddressCanNotBeZero();
_relayerWhitelisted[relayer] = whitelist;
}
function setToCuratorLimit(uint8 counter) external onlyGov {
maxToCuratorCounter = counter;
}
function setMaxDuration(uint256 max) external onlyGov {
maxDuration = max;
}
// User
function bid(
BidData calldata vars,
BidType bidType,
DataTypes.MerkleVerifyData calldata verifyData
) external payable nonReentrant onlyWhitelisted(verifyData) {
_fetchBidToken(vars.bidToken, vars.bidAmount);
_bid(vars, bidType);
}
function bidBatch(
BidData[] calldata vars,
BidType[] calldata bidType,
DataTypes.MerkleVerifyData calldata verifyData
) external payable nonReentrant onlyWhitelisted(verifyData) {
uint256 assetAmounts;
for (uint256 i = 0; i < vars.length; i++) {
_bid(vars[i], bidType[i]);
if (vars[i].bidToken == address(0)) {
assetAmounts += vars[i].bidAmount;
} else {
_fetchBidToken(vars[i].bidToken, vars[i].bidAmount);
}
}
if (assetAmounts > 0) {
_fetchBidToken(address(0), assetAmounts);
}
}
function updateBid(
uint256 index,
uint256 duration,
uint256 amount
) external payable nonReentrant {
_validateDuration(duration);
_validateContentIndex(index);
Content storage content = _contentByIndex[index];
if (content.status != DataTypes.AuditStatus.Pending)
revert Errors.BidIsClose();
if (content.bidAddress != _msgSender()) revert Errors.NotBidder();
_fetchBidToken(content.bidToken, amount);
content.bidAmount += amount;
content.bidExpires += duration;
emit modifiBidEvent(index, content);
}
function claimBackBid(uint256 index) external nonReentrant {
_claimBack(index);
}
function claimBackBidBatch(
uint256[] calldata indexArr
) external nonReentrant {
for (uint256 i = 0; i < indexArr.length; i++) {
_claimBack(indexArr[i]);
}
}
// Curator
function settings(
address token,
uint256 min,
bool[] calldata disableAuditTypes
) external {
_setMinBid(token, min);
_setDisableAuditTypes(disableAuditTypes);
}
function setMinBid(address token, uint256 min) external {
_setMinBid(token, min);
}
function setDisableAuditTypes(bool[] calldata disableAuditTypes) external {
_setDisableAuditTypes(disableAuditTypes);
}
function loanWithSig(
uint256 index,
uint256 curatorId,
address relayer,
string calldata contentId,
DataTypes.EIP712Signature calldata sig
) external nonReentrant {
_validateContentIndex(index);
if (!_relayerWhitelisted[relayer]) {
revert Errors.NotWhitelisted();
}
Content storage content = _contentByIndex[index];
if (content.status != DataTypes.AuditStatus.Pending) {
revert Errors.BidIsClose();
}
_validateCurator(curatorId, content.toCurators);
SigUtils._validateRecoveredAddress(
SigUtils._calculateDigest(
keccak256(
abi.encode(
LOAN_WITH_SIG_TYPEHASH,
index,
_msgSender(),
keccak256(bytes(contentId)),
sig.deadline
)
),
name
),
relayer,
sig
);
content.status = DataTypes.AuditStatus.Pass;
content.curatorId = curatorId;
content.curatorContentId = contentId;
_loan(content.bidToken, content.bidAmount);
emit modifiBidEvent(index, content);
}
// View
function getMinBidAmount(
address wallet,
address token
) external view returns (uint256) {
return _minBidByTokenByWallet[wallet][token];
}
function getDisableAcceptType(
address wallet,
BidType bidType
) external view returns (bool) {
return _disableAuditType[wallet][bidType];
}
function isBidTokenWhitelisted(address token) external view returns (bool) {
return _bidTokenWhitelisted[token];
}
function isRelayerWhitelisted(address wallet) external view returns (bool) {
return _relayerWhitelisted[wallet];
}
function isGovernance(address wallet) external view returns (bool) {
return _governance[wallet];
}
function getContentByIndex(
uint256 index
) external view returns (Content memory) {
return _contentByIndex[index];
}
function getBidCounter() external view returns (uint256) {
return _bidCounter;
}
// Private
function _validateExpires(uint256 expires) internal view {
if (expires < block.timestamp) {
revert Errors.Expired();
}
}
function _validateContentIndex(uint256 index) internal view {
if (index > _bidCounter) {
revert Errors.ParamsInvalid();
}
}
function _validateBid(
address token,
uint256 amount,
BidType bidType,
address[] memory toCuratorAddresses
) internal view {
if (toCuratorAddresses.length > maxToCuratorCounter) {
revert Errors.ToCuratorLimitExceeded();
}
for (uint8 i = 0; i < toCuratorAddresses.length; i++) {
if (amount < _minBidByTokenByWallet[toCuratorAddresses[i]][token]) {
revert Errors.NotReachedMinimum();
}
if (_disableAuditType[toCuratorAddresses[i]][bidType]) {
revert Errors.BidTypeNotAccept();
}
}
}
function _validateCurator(
uint256 curatorId,
uint256[] memory toCurators
) internal view {
if (
curatorId != IIdRegistry(FARCASTER_ID_REGISTRY).idOf(_msgSender())
) {
revert Errors.NotProfileOwner();
}
if (toCurators.length == 0) {
return;
}
bool flag;
for (uint8 i = 0; i < toCurators.length; i++) {
if (toCurators[i] == curatorId) {
flag = true;
break;
}
}
if (!flag) {
revert Errors.NotCurator();
}
}
function _validateCurators(
uint256[] memory curatorIds,
address[] memory curators
) internal view {
for (uint8 i = 0; i < curatorIds.length; i++) {
if (
IIdRegistry(FARCASTER_ID_REGISTRY).idOf(curators[i]) !=
curatorIds[i]
) {
revert Errors.ParamsInvalid();
}
}
}
function _validateDuration(uint256 duration) internal view {
if (duration > maxDuration) {
revert Errors.DurationLimitExceeded();
}
}
function _setMinBid(address token, uint256 min) internal {
_minBidByTokenByWallet[_msgSender()][token] = min;
}
function _setDisableAuditTypes(bool[] calldata disableAuditTypes) internal {
if (disableAuditTypes.length != 3) {
revert Errors.ParamsInvalid();
}
_disableAuditType[_msgSender()][BidType.Casts] = disableAuditTypes[0];
_disableAuditType[_msgSender()][BidType.Reply] = disableAuditTypes[1];
_disableAuditType[_msgSender()][BidType.Recasts] = disableAuditTypes[2];
}
function _bid(BidData calldata vars, BidType bidType) internal {
_validateDuration(vars.duration);
_validateCurators(vars.toCurators, vars.toCuratorAddresses);
_validateBid(
vars.bidToken,
vars.bidAmount,
bidType,
vars.toCuratorAddresses
);
uint256 counter = ++_bidCounter;
Content memory content;
if (bidType == BidType.Reply || bidType == BidType.Casts) {
content.contentURI = vars.contentURI;
}
if (bidType == BidType.Reply || bidType == BidType.Recasts) {
content.parentHash = vars.parentHash;
}
content.bidToken = vars.bidToken;
content.bidAmount = vars.bidAmount;
content.bidAddress = _msgSender();
content.bidExpires = block.timestamp + vars.duration;
content.toCurators = vars.toCurators;
content.bidType = bidType;
content.status = DataTypes.AuditStatus.Pending;
_contentByIndex[counter] = content;
emit addBidEvent(counter, content);
}
function _claimBack(uint256 index) internal {
_validateContentIndex(index);
Content storage content = _contentByIndex[index];
if (content.bidAddress != _msgSender()) revert Errors.NotBidder();
if (content.bidExpires > block.timestamp) revert Errors.NotExpired();
if (content.status != DataTypes.AuditStatus.Pending)
revert Errors.BidIsClose();
if (content.bidAmount > 0) {
_sendTokenOrETH(
content.bidToken,
content.bidAddress,
content.bidAmount
);
}
content.status = DataTypes.AuditStatus.Cancel;
emit modifiBidEvent(index, content);
}
function _loan(address token, uint256 amount) internal {
uint256 feeAmount = (amount * feeRate) / FEE_DENOMINATOR;
if (feeAmount > 0) {
_sendTokenOrETH(token, feeCollector, feeAmount);
}
if (amount - feeAmount > 0) {
_sendTokenOrETH(token, _msgSender(), amount - feeAmount);
}
}
function _fetchBidToken(address token, uint256 amount) internal {
if (token == address(0) && amount != msg.value) {
revert Errors.InsufficientInputAmount();
}
if (token != address(0)) {
if (!_bidTokenWhitelisted[token])
revert Errors.BidTokenNotWhitelisted();
IERC20(token).safeTransferFrom(_msgSender(), address(this), amount);
}
}
function _sendTokenOrETH(
address token,
address to,
uint256 amount
) internal {
if (token == address(0)) {
_sendETH(to, amount);
} else {
_sendToken(token, to, amount);
}
}
function _sendToken(address token, address to, uint256 amount) internal {
IERC20(token).safeTransfer(to, amount);
}
function _sendETH(address to, uint256 amount) internal {
(bool success, ) = to.call{value: amount}(new bytes(0));
if (!success) revert Errors.ETHTransferFailed();
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)
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 making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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);
/**
* @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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, 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 `from` to `to` 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 from,
address to,
uint256 amount
) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.sol";
import "../../../utils/Address.sol";
/**
* @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 SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @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(IERC20 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, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @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
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 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 functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or 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 {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Tree proofs.
*
* The tree and the proofs can be generated using our
* https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
* You will find a quickstart guide in the readme.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the merkle tree could be reinterpreted as a leaf value.
* OpenZeppelin's JavaScript library generates merkle trees that are safe
* against this attack out of the box.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Calldata version of {verify}
*
* _Available since v4.7._
*/
function verifyCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*
* _Available since v4.4._
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Calldata version of {processProof}
*
* _Available since v4.7._
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Calldata version of {multiProofVerify}
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
* proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
* leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
* respectively.
*
* CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
* is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
* tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
*
* _Available since v4.7._
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Calldata version of {processMultiProof}.
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.17;
import "@openzeppelin/contracts/utils/Context.sol";
/**
* @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() {
_transferOwnership(_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 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"
);
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
interface IIdRegistry {
/**
* @notice Maps each address to an fid, or zero if it does not own an fid.
*/
function idOf(address owner) external view returns (uint256 fid);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import {DataTypes} from "../libraries/DataTypes.sol";
/**
* @title ILensHub
* @author Lens Protocol
*
* @notice This is the interface for the LensHub contract, the main entry point for the Lens Protocol.
* You'll find all the events and external functions, as well as the reasoning behind them here.
*/
interface ILensHub {
struct PostWithSigData {
uint256 profileId;
string contentURI;
address collectModule;
bytes collectModuleInitData;
address referenceModule;
bytes referenceModuleInitData;
DataTypes.EIP712Signature sig;
}
struct CommentWithSigData {
uint256 profileId;
string contentURI;
uint256 profileIdPointed;
uint256 pubIdPointed;
bytes referenceModuleData;
address collectModule;
bytes collectModuleInitData;
address referenceModule;
bytes referenceModuleInitData;
DataTypes.EIP712Signature sig;
}
struct MirrorWithSigData {
uint256 profileId;
uint256 profileIdPointed;
uint256 pubIdPointed;
bytes referenceModuleData;
address referenceModule;
bytes referenceModuleInitData;
DataTypes.EIP712Signature sig;
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) external returns (address);
/**
* @notice Publishes a post to a given profile via signature with the specified parameters.
*
* @param vars A PostWithSigData struct containing the regular parameters and an EIP712Signature struct.
*
* @return uint256 An integer representing the post's publication ID.
*/
function postWithSig(
PostWithSigData calldata vars
) external returns (uint256);
/**
* @notice Publishes a mirror to a given profile via signature with the specified parameters.
*
* @param vars A MirrorWithSigData struct containing the regular parameters and an EIP712Signature struct.
*
* @return uint256 An integer representing the mirror's publication ID.
*/
function mirrorWithSig(
MirrorWithSigData calldata vars
) external returns (uint256);
/**
* @notice Publishes a comment to a given profile via signature with the specified parameters.
*
* @param vars A CommentWithSigData struct containing the regular parameters and an EIP712Signature struct.
*
* @return uint256 An integer representing the comment's publication ID.
*/
function commentWithSig(
CommentWithSigData calldata vars
) external returns (uint256);
/**
* @notice Returns the publication pointer (profileId & pubId) associated with a given publication.
*
* @param profileId The token ID of the profile that published the publication to query the pointer for.
* @param pubId The publication ID of the publication to query the pointer for.
*
* @return tuple First, the profile ID of the profile the current publication is pointing to, second, the
* publication ID of the publication the current publication is pointing to.
*/
function getPubPointer(
uint256 profileId,
uint256 pubId
) external view returns (uint256, uint256);
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.17;
library DataTypes {
struct EIP712Signature {
uint8 v;
bytes32 r;
bytes32 s;
uint256 deadline;
}
enum AuditStatus {
Pending,
Refuse,
Pass,
Cancel
}
struct MerkleVerifyData {
uint256 index;
bytes32[] merkleProof;
}
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.17;
library Errors {
error AddressCanNotBeZero();
error RateExceedsMaximum();
error SignatureExpired();
error BidTokenNotWhitelisted();
error NotWhitelisted();
error NotGovernance();
error Expired();
error WrongAmount();
error ParamsInvalid();
error NotExpired();
error ToCuratorLimitExceeded();
error DurationLimitExceeded();
error BidTypeNotAccept();
error NotReachedMinimum();
error InsufficientBalance();
error InsufficientInputAmount();
error ETHTransferFailed();
error SignatureInvalid();
error NotCurator();
error NotProfileOwner();
error NotBidder();
error BidIsClose();
error Paused();
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.17;
import "./DataTypes.sol";
import "./Errors.sol";
library SigUtils {
bytes32 internal constant EIP712_REVISION_HASH = keccak256("1");
bytes32 internal constant EIP712_DOMAIN_TYPEHASH =
keccak256(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
);
/**
* @dev Wrapper for ecrecover to reduce code size, used in meta-tx specific functions.
*/
function _validateRecoveredAddress(
bytes32 digest,
address expectedAddress,
DataTypes.EIP712Signature calldata sig
) internal view {
if (sig.deadline < block.timestamp) revert Errors.SignatureExpired();
address recoveredAddress = ecrecover(digest, sig.v, sig.r, sig.s);
if (
recoveredAddress == address(0) ||
recoveredAddress != expectedAddress
) revert Errors.SignatureInvalid();
}
/**
* @dev Calculates EIP712 DOMAIN_SEPARATOR based on the current contract and chain ID.
*/
function _calculateDomainSeparator(
string memory name
) internal view returns (bytes32) {
return
keccak256(
abi.encode(
EIP712_DOMAIN_TYPEHASH,
keccak256(bytes(name)),
EIP712_REVISION_HASH,
block.chainid,
address(this)
)
);
}
/**
* @dev Calculates EIP712 digest based on the current DOMAIN_SEPARATOR.
*
* @param hashedMessage The message hash from which the digest should be calculated.
*
* @return bytes32 A 32-byte output representing the EIP712 digest.
*/
function _calculateDigest(
bytes32 hashedMessage,
string memory name
) internal view returns (bytes32) {
bytes32 digest;
unchecked {
digest = keccak256(
abi.encodePacked(
"\x19\x01",
_calculateDomainSeparator(name),
hashedMessage
)
);
}
return digest;
}
}// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.17;
import "./access/Ownable.sol";
import "./libraries/DataTypes.sol";
import "./libraries/Errors.sol";
import "./interfaces/ILensHub.sol";
import "./libraries/SigUtils.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
contract TakoLensHub is Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
address LENS_HUB;
address LENS_FREE_COLLECT_MODULE;
enum BidType {
Post,
Comment,
Mirror
}
enum Platform {
Polygon,
Momoka
}
struct BidData {
string contentURI;
uint256 profileIdPointed;
uint256 pubIdPointed;
address bidToken;
uint256 bidAmount;
uint256 duration;
uint256[] toCurators;
}
struct Content {
string contentURI;
uint256 profileIdPointed;
uint256 pubIdPointed;
address bidToken;
address bidAddress;
uint256 bidAmount;
uint256 bidExpires;
uint256[] toCurators;
uint256 curatorId;
uint256 curatorContentId;
DataTypes.AuditStatus status;
BidType bidType;
}
struct MomokaBidData {
string contentURI;
string mirror;
string commentOn;
address bidToken;
uint256 bidAmount;
uint256 duration;
uint256[] toCurators;
}
struct MomokaContent {
string mirror;
string commentOn;
string contentURI;
address bidToken;
address bidAddress;
uint256 bidAmount;
uint256 bidExpires;
uint256[] toCurators;
uint256 curatorId;
string curatorContentId;
DataTypes.AuditStatus status;
BidType bidType;
}
string public constant name = "Tako Lens Hub";
bytes32 public merkleRoot;
bytes32 internal constant LOAN_WITH_SIG_TYPEHASH =
keccak256(
"LoanWithSig(uint256 index,address curator,string contentId,uint256 deadline)"
);
uint8 public maxToCuratorCounter = 5;
uint256 public maxDuration = 14 days;
address public feeCollector;
uint256 public feeRate = 1 * 10 ** 8;
uint256 _bidCounter;
mapping(uint256 => Content) internal _contentByIndex;
mapping(address => bool) internal _bidTokenWhitelisted;
mapping(address => mapping(address => uint256)) _minBidByTokenByWallet;
mapping(address => mapping(BidType => bool)) _disableAuditType;
uint256 _momokaBidCounter;
mapping(uint256 => MomokaContent) internal _momokaContentByIndex;
mapping(address => bool) internal _relayerWhitelisted;
mapping(address => bool) internal _governance;
uint256 public constant FEE_DENOMINATOR = 10 ** 10;
event addBidEvent(uint256 index, Content content);
event modifiBidEvent(uint256 index, Content content);
event addBidMomokaEvent(uint256 index, MomokaContent content);
event modifiBidMomokaEvent(uint256 index, MomokaContent content);
modifier onlyGov() {
if (!_governance[_msgSender()]) {
revert Errors.NotGovernance();
}
_;
}
modifier onlyWhitelisted(DataTypes.MerkleVerifyData memory verifyData) {
if (merkleRoot != bytes32(0)) {
address wallet = msg.sender;
bytes32 node = keccak256(
abi.encodePacked(verifyData.index, wallet)
);
if (!MerkleProof.verify(verifyData.merkleProof, merkleRoot, node))
revert Errors.NotWhitelisted();
}
_;
}
constructor(
address lensHub,
address lensFreeCollectModule,
bytes32 initMerkleRoot
) {
if (lensHub == address(0)) revert Errors.AddressCanNotBeZero();
if (lensFreeCollectModule == address(0))
revert Errors.AddressCanNotBeZero();
LENS_HUB = lensHub;
LENS_FREE_COLLECT_MODULE = lensFreeCollectModule;
merkleRoot = initMerkleRoot;
feeCollector = _msgSender();
}
receive() external payable {}
// Owner
function setFeeCollector(
address newsFeeCollector,
uint256 newFeeRate
) external onlyOwner {
if (newsFeeCollector == address(0)) revert Errors.AddressCanNotBeZero();
if (newFeeRate > FEE_DENOMINATOR) revert Errors.RateExceedsMaximum();
feeRate = newFeeRate;
feeCollector = newsFeeCollector;
}
function setGovernance(address gov, bool whitelist) external onlyOwner {
_governance[gov] = whitelist;
}
// Gov
function setLensContracts(
address hub,
address collectModule
) external onlyGov {
if (hub == address(0)) revert Errors.AddressCanNotBeZero();
if (collectModule == address(0)) revert Errors.AddressCanNotBeZero();
LENS_HUB = hub;
LENS_FREE_COLLECT_MODULE = collectModule;
}
function setMerkleRoot(bytes32 newMerkleRoot) external onlyGov {
merkleRoot = newMerkleRoot;
}
function whitelistBidToken(address token, bool whitelist) external onlyGov {
_bidTokenWhitelisted[token] = whitelist;
}
function whitelistRelayer(
address relayer,
bool whitelist
) external onlyGov {
if (relayer == address(0)) revert Errors.AddressCanNotBeZero();
_relayerWhitelisted[relayer] = whitelist;
}
function setToCuratorLimit(uint8 counter) external onlyGov {
maxToCuratorCounter = counter;
}
function setMaxDuration(uint256 max) external onlyGov {
maxDuration = max;
}
// User
function bid(
BidData calldata vars,
BidType bidType,
DataTypes.MerkleVerifyData calldata verifyData
) external payable nonReentrant onlyWhitelisted(verifyData) {
_fetchBidToken(vars.bidToken, vars.bidAmount);
_bid(vars, bidType);
}
function bidBatch(
BidData[] calldata vars,
BidType[] calldata bidType,
DataTypes.MerkleVerifyData calldata verifyData
) external payable nonReentrant onlyWhitelisted(verifyData) {
uint256 assetAmounts;
for (uint256 i = 0; i < vars.length; i++) {
_bid(vars[i], bidType[i]);
if (vars[i].bidToken == address(0)) {
assetAmounts += vars[i].bidAmount;
} else {
_fetchBidToken(vars[i].bidToken, vars[i].bidAmount);
}
}
if (assetAmounts > 0) {
_fetchBidToken(address(0), assetAmounts);
}
}
function bidMomoka(
MomokaBidData calldata vars,
BidType bidType,
DataTypes.MerkleVerifyData calldata verifyData
) external payable nonReentrant onlyWhitelisted(verifyData) {
_fetchBidToken(vars.bidToken, vars.bidAmount);
_bidMomoka(vars, bidType);
}
function bidMomokaBatch(
MomokaBidData[] calldata vars,
BidType[] calldata bidType,
DataTypes.MerkleVerifyData calldata verifyData
) external payable nonReentrant onlyWhitelisted(verifyData) {
uint256 assetAmounts;
for (uint256 i = 0; i < vars.length; i++) {
_bidMomoka(vars[i], bidType[i]);
if (vars[i].bidToken == address(0)) {
assetAmounts += vars[i].bidAmount;
} else {
_fetchBidToken(vars[i].bidToken, vars[i].bidAmount);
}
}
if (assetAmounts > 0) {
_fetchBidToken(address(0), assetAmounts);
}
}
function updateBid(
uint256 index,
uint256 duration,
uint256 amount
) external payable nonReentrant {
_updateBid(index, duration, amount, Platform.Polygon);
}
function updateBidMomoka(
uint256 index,
uint256 duration,
uint256 amount
) external payable nonReentrant {
_updateBid(index, duration, amount, Platform.Momoka);
}
function claimBackBid(uint256 index) external nonReentrant {
_claimBack(index, Platform.Polygon);
}
function claimBackBidBatch(
uint256[] calldata indexArr
) external nonReentrant {
for (uint256 i = 0; i < indexArr.length; i++) {
_claimBack(indexArr[i], Platform.Polygon);
}
}
function claimBackBidMomoka(uint256 index) external nonReentrant {
_claimBack(index, Platform.Momoka);
}
function claimBackBidMomokaBatch(
uint256[] calldata indexArr
) external nonReentrant {
for (uint256 i = 0; i < indexArr.length; i++) {
_claimBack(indexArr[i], Platform.Momoka);
}
}
// Curator
function settings(
address token,
uint256 min,
bool[] calldata disableAuditTypes
) external {
_setMinBid(token, min);
_setDisableAuditTypes(disableAuditTypes);
}
function setMinBid(address token, uint256 min) external {
_setMinBid(token, min);
}
function setDisableAuditTypes(bool[] calldata disableAuditTypes) external {
_setDisableAuditTypes(disableAuditTypes);
}
function auditBidPost(
uint256 index,
uint256 curatorId,
DataTypes.EIP712Signature calldata sig
) external nonReentrant {
_validateContentIndex(index);
Content storage content = _contentByIndex[index];
if (content.bidType != BidType.Post) {
revert Errors.ParamsInvalid();
}
if (content.status != DataTypes.AuditStatus.Pending) {
revert Errors.BidIsClose();
}
_validateExpires(content.bidExpires);
_validateCurator(curatorId, content.toCurators);
ILensHub.PostWithSigData memory lensData;
lensData.profileId = curatorId;
lensData.contentURI = content.contentURI;
lensData.collectModule = LENS_FREE_COLLECT_MODULE;
lensData.collectModuleInitData = abi.encode(false);
lensData.sig = DataTypes.EIP712Signature(
sig.v,
sig.r,
sig.s,
sig.deadline
);
content.curatorContentId = _postWithSign(lensData);
content.curatorId = curatorId;
content.status = DataTypes.AuditStatus.Pass;
_loan(content.bidToken, content.bidAmount);
emit modifiBidEvent(index, content);
}
function auditBidMirror(
uint256 index,
uint256 curatorId,
DataTypes.EIP712Signature calldata sig
) external nonReentrant {
_validateContentIndex(index);
Content storage content = _contentByIndex[index];
if (content.bidType != BidType.Mirror) {
revert Errors.ParamsInvalid();
}
if (content.status != DataTypes.AuditStatus.Pending) {
revert Errors.BidIsClose();
}
_validateExpires(content.bidExpires);
_validateCurator(curatorId, content.toCurators);
ILensHub.MirrorWithSigData memory lensData;
lensData.profileId = curatorId;
lensData.profileIdPointed = content.profileIdPointed;
lensData.pubIdPointed = content.pubIdPointed;
lensData.sig = DataTypes.EIP712Signature(
sig.v,
sig.r,
sig.s,
sig.deadline
);
content.curatorContentId = _mirrorWithSign(lensData);
content.curatorId = curatorId;
content.status = DataTypes.AuditStatus.Pass;
_loan(content.bidToken, content.bidAmount);
emit modifiBidEvent(index, _contentByIndex[index]);
}
function auditBidComment(
uint256 index,
uint256 curatorId,
DataTypes.EIP712Signature calldata sig
) external nonReentrant {
_validateContentIndex(index);
Content storage content = _contentByIndex[index];
if (content.bidType != BidType.Comment) {
revert Errors.ParamsInvalid();
}
if (content.status != DataTypes.AuditStatus.Pending) {
revert Errors.BidIsClose();
}
_validateExpires(content.bidExpires);
_validateCurator(curatorId, content.toCurators);
ILensHub.CommentWithSigData memory lensData;
lensData.profileId = curatorId;
lensData.contentURI = content.contentURI;
lensData.profileIdPointed = content.profileIdPointed;
lensData.pubIdPointed = content.pubIdPointed;
lensData.collectModule = LENS_FREE_COLLECT_MODULE;
lensData.collectModuleInitData = abi.encode(false);
lensData.sig = DataTypes.EIP712Signature(
sig.v,
sig.r,
sig.s,
sig.deadline
);
content.curatorContentId = _commentWithSign(lensData);
content.curatorId = curatorId;
content.status = DataTypes.AuditStatus.Pass;
_loan(content.bidToken, content.bidAmount);
emit modifiBidEvent(index, _contentByIndex[index]);
}
function loanWithSig(
uint256 index,
uint256 curatorId,
address relayer,
string calldata contentId,
DataTypes.EIP712Signature calldata sig
) external nonReentrant {
_validateMomokaContentIndex(index);
if (!_relayerWhitelisted[relayer]) {
revert Errors.NotWhitelisted();
}
MomokaContent storage content = _momokaContentByIndex[index];
if (content.status != DataTypes.AuditStatus.Pending) {
revert Errors.BidIsClose();
}
_validateCurator(curatorId, content.toCurators);
SigUtils._validateRecoveredAddress(
SigUtils._calculateDigest(
keccak256(
abi.encode(
LOAN_WITH_SIG_TYPEHASH,
index,
_msgSender(),
keccak256(bytes(contentId)),
sig.deadline
)
),
name
),
relayer,
sig
);
content.status = DataTypes.AuditStatus.Pass;
content.curatorId = curatorId;
content.curatorContentId = contentId;
_loan(content.bidToken, content.bidAmount);
emit modifiBidMomokaEvent(index, content);
}
// View
function getMinBidAmount(
address wallet,
address token
) external view returns (uint256) {
return _minBidByTokenByWallet[wallet][token];
}
function getDisableAcceptType(
address wallet,
BidType bidType
) external view returns (bool) {
return _disableAuditType[wallet][bidType];
}
function isBidTokenWhitelisted(address token) external view returns (bool) {
return _bidTokenWhitelisted[token];
}
function isRelayerWhitelisted(address wallet) external view returns (bool) {
return _relayerWhitelisted[wallet];
}
function isGovernance(address wallet) external view returns (bool) {
return _governance[wallet];
}
function getContentByIndex(
uint256 index
) external view returns (Content memory) {
return _contentByIndex[index];
}
function getMomokaContentByIndex(
uint256 index
) external view returns (MomokaContent memory) {
return _momokaContentByIndex[index];
}
function getBidCounter() external view returns (uint256) {
return _bidCounter;
}
function getMomokaBidCounter() external view returns (uint256) {
return _momokaBidCounter;
}
// Private
function _validateExpires(uint256 expires) internal view {
if (expires < block.timestamp) {
revert Errors.Expired();
}
}
function _validateContentIndex(uint256 index) internal view {
if (index > _bidCounter) {
revert Errors.ParamsInvalid();
}
}
function _validateMomokaContentIndex(uint256 index) internal view {
if (index > _momokaBidCounter) {
revert Errors.ParamsInvalid();
}
}
function _validateBid(
address token,
uint256 amount,
BidType bidType,
uint256[] memory toCurators
) internal {
if (toCurators.length > maxToCuratorCounter) {
revert Errors.ToCuratorLimitExceeded();
}
for (uint8 i = 0; i < toCurators.length; i++) {
address profileOwner = ILensHub(LENS_HUB).ownerOf(toCurators[i]);
if (profileOwner == address(0)) revert Errors.AddressCanNotBeZero();
if (amount < _minBidByTokenByWallet[profileOwner][token]) {
revert Errors.NotReachedMinimum();
}
if (_disableAuditType[profileOwner][bidType]) {
revert Errors.BidTypeNotAccept();
}
}
}
function _validateCurator(
uint256 curatorId,
uint256[] memory toCurators
) internal {
address profileOwner = ILensHub(LENS_HUB).ownerOf(curatorId);
if (profileOwner == address(0)) revert Errors.AddressCanNotBeZero();
if (profileOwner != _msgSender()) {
revert Errors.NotProfileOwner();
}
if (toCurators.length == 0) {
return;
}
bool flag;
for (uint8 i = 0; i < toCurators.length; i++) {
if (toCurators[i] == curatorId) {
flag = true;
break;
}
}
if (!flag) {
revert Errors.NotCurator();
}
}
function _validateDuration(uint256 duration) internal view {
if (duration > maxDuration) {
revert Errors.DurationLimitExceeded();
}
}
function _setMinBid(address token, uint256 min) internal {
_minBidByTokenByWallet[_msgSender()][token] = min;
}
function _setDisableAuditTypes(bool[] calldata disableAuditTypes) internal {
if (disableAuditTypes.length != 3) {
revert Errors.ParamsInvalid();
}
_disableAuditType[_msgSender()][BidType.Post] = disableAuditTypes[0];
_disableAuditType[_msgSender()][BidType.Comment] = disableAuditTypes[1];
_disableAuditType[_msgSender()][BidType.Mirror] = disableAuditTypes[2];
}
function _postWithSign(
ILensHub.PostWithSigData memory vars
) internal returns (uint256) {
return ILensHub(LENS_HUB).postWithSig(vars);
}
function _mirrorWithSign(
ILensHub.MirrorWithSigData memory vars
) internal returns (uint256) {
return ILensHub(LENS_HUB).mirrorWithSig(vars);
}
function _commentWithSign(
ILensHub.CommentWithSigData memory vars
) internal returns (uint256) {
return ILensHub(LENS_HUB).commentWithSig((vars));
}
function _bid(BidData calldata vars, BidType bidType) internal {
_validateDuration(vars.duration);
_validateBid(vars.bidToken, vars.bidAmount, bidType, vars.toCurators);
uint256 counter = ++_bidCounter;
Content memory content;
content.contentURI = vars.contentURI;
content.bidToken = vars.bidToken;
content.bidAmount = vars.bidAmount;
content.bidAddress = _msgSender();
content.bidExpires = block.timestamp + vars.duration;
content.toCurators = vars.toCurators;
content.bidType = bidType;
if (bidType == BidType.Comment || bidType == BidType.Mirror) {
content.profileIdPointed = vars.profileIdPointed;
content.pubIdPointed = vars.pubIdPointed;
}
content.status = DataTypes.AuditStatus.Pending;
_contentByIndex[counter] = content;
emit addBidEvent(counter, content);
}
function _bidMomoka(MomokaBidData calldata vars, BidType bidType) internal {
_validateDuration(vars.duration);
_validateBid(vars.bidToken, vars.bidAmount, bidType, vars.toCurators);
uint256 counter = ++_momokaBidCounter;
MomokaContent memory content;
content.bidToken = vars.bidToken;
content.bidAmount = vars.bidAmount;
content.bidAddress = _msgSender();
content.bidExpires = block.timestamp + vars.duration;
content.toCurators = vars.toCurators;
content.bidType = bidType;
if (bidType == BidType.Post) {
content.contentURI = vars.contentURI;
} else if (bidType == BidType.Comment) {
content.contentURI = vars.contentURI;
content.commentOn = vars.commentOn;
} else if (bidType == BidType.Mirror) {
content.mirror = vars.mirror;
}
content.status = DataTypes.AuditStatus.Pending;
_momokaContentByIndex[counter] = content;
emit addBidMomokaEvent(counter, content);
}
function _claimBack(uint256 index, Platform platform) internal {
address bidAddress;
address bidToken;
uint256 bidAmount;
uint256 bidExpires;
DataTypes.AuditStatus status;
if (platform == Platform.Polygon) {
_validateContentIndex(index);
bidAddress = _contentByIndex[index].bidAddress;
bidToken = _contentByIndex[index].bidToken;
bidAmount = _contentByIndex[index].bidAmount;
bidExpires = _contentByIndex[index].bidExpires;
status = _contentByIndex[index].status;
} else {
_validateMomokaContentIndex(index);
bidAddress = _momokaContentByIndex[index].bidAddress;
bidToken = _momokaContentByIndex[index].bidToken;
bidAmount = _momokaContentByIndex[index].bidAmount;
bidExpires = _momokaContentByIndex[index].bidExpires;
status = _momokaContentByIndex[index].status;
}
if (bidAddress != _msgSender()) revert Errors.NotBidder();
if (bidExpires > block.timestamp) revert Errors.NotExpired();
if (status != DataTypes.AuditStatus.Pending) revert Errors.BidIsClose();
if (platform == Platform.Polygon) {
_contentByIndex[index].status = DataTypes.AuditStatus.Cancel;
emit modifiBidEvent(index, _contentByIndex[index]);
} else {
_momokaContentByIndex[index].status = DataTypes.AuditStatus.Cancel;
emit modifiBidMomokaEvent(index, _momokaContentByIndex[index]);
}
if (bidAmount > 0) {
_sendTokenOrETH(bidToken, bidAddress, bidAmount);
}
}
function _updateBid(
uint256 index,
uint256 duration,
uint256 amount,
Platform platform
) internal {
_validateDuration(duration);
DataTypes.AuditStatus status;
address bidAddress;
address bidToken;
if (platform == Platform.Polygon) {
_validateContentIndex(index);
Content storage content = _contentByIndex[index];
status = content.status;
bidAddress = content.bidAddress;
bidToken = content.bidToken;
} else {
_validateMomokaContentIndex(index);
MomokaContent storage content = _momokaContentByIndex[index];
status = content.status;
bidAddress = content.bidAddress;
bidToken = content.bidToken;
}
if (status != DataTypes.AuditStatus.Pending) revert Errors.BidIsClose();
if (bidAddress != _msgSender()) revert Errors.NotBidder();
_fetchBidToken(bidToken, amount);
if (platform == Platform.Polygon) {
_contentByIndex[index].bidAmount += amount;
_contentByIndex[index].bidExpires += duration;
emit modifiBidEvent(index, _contentByIndex[index]);
} else {
_momokaContentByIndex[index].bidAmount += amount;
_momokaContentByIndex[index].bidExpires += duration;
emit modifiBidMomokaEvent(index, _momokaContentByIndex[index]);
}
}
function _loan(address token, uint256 amount) internal {
uint256 feeAmount = (amount * feeRate) / FEE_DENOMINATOR;
if (feeAmount > 0) {
_sendTokenOrETH(token, feeCollector, feeAmount);
}
if (amount - feeAmount > 0) {
_sendTokenOrETH(token, _msgSender(), amount - feeAmount);
}
}
function _fetchBidToken(address token, uint256 amount) internal {
if (token == address(0) && amount != msg.value) {
revert Errors.InsufficientInputAmount();
}
if (token != address(0)) {
if (!_bidTokenWhitelisted[token])
revert Errors.BidTokenNotWhitelisted();
IERC20(token).safeTransferFrom(_msgSender(), address(this), amount);
}
}
function _sendTokenOrETH(
address token,
address to,
uint256 amount
) internal {
if (token == address(0)) {
(bool success, ) = to.call{value: amount}(new bytes(0));
if (!success) revert Errors.ETHTransferFailed();
} else {
IERC20(token).safeTransfer(to, amount);
}
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"bytes32","name":"initMerkleRoot","type":"bytes32"},{"internalType":"address","name":"farcasterIdRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressCanNotBeZero","type":"error"},{"inputs":[],"name":"BidIsClose","type":"error"},{"inputs":[],"name":"BidTokenNotWhitelisted","type":"error"},{"inputs":[],"name":"BidTypeNotAccept","type":"error"},{"inputs":[],"name":"DurationLimitExceeded","type":"error"},{"inputs":[],"name":"ETHTransferFailed","type":"error"},{"inputs":[],"name":"InsufficientInputAmount","type":"error"},{"inputs":[],"name":"NotBidder","type":"error"},{"inputs":[],"name":"NotCurator","type":"error"},{"inputs":[],"name":"NotExpired","type":"error"},{"inputs":[],"name":"NotGovernance","type":"error"},{"inputs":[],"name":"NotProfileOwner","type":"error"},{"inputs":[],"name":"NotReachedMinimum","type":"error"},{"inputs":[],"name":"NotWhitelisted","type":"error"},{"inputs":[],"name":"ParamsInvalid","type":"error"},{"inputs":[],"name":"RateExceedsMaximum","type":"error"},{"inputs":[],"name":"SignatureExpired","type":"error"},{"inputs":[],"name":"SignatureInvalid","type":"error"},{"inputs":[],"name":"ToCuratorLimitExceeded","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"components":[{"internalType":"string","name":"contentURI","type":"string"},{"internalType":"string","name":"parentHash","type":"string"},{"internalType":"address","name":"bidToken","type":"address"},{"internalType":"uint256","name":"bidAmount","type":"uint256"},{"internalType":"address","name":"bidAddress","type":"address"},{"internalType":"uint256","name":"bidExpires","type":"uint256"},{"internalType":"uint256[]","name":"toCurators","type":"uint256[]"},{"internalType":"uint256","name":"curatorId","type":"uint256"},{"internalType":"string","name":"curatorContentId","type":"string"},{"internalType":"enum DataTypes.AuditStatus","name":"status","type":"uint8"},{"internalType":"enum TakoFarcasterHub.BidType","name":"bidType","type":"uint8"}],"indexed":false,"internalType":"struct TakoFarcasterHub.Content","name":"content","type":"tuple"}],"name":"addBidEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"components":[{"internalType":"string","name":"contentURI","type":"string"},{"internalType":"string","name":"parentHash","type":"string"},{"internalType":"address","name":"bidToken","type":"address"},{"internalType":"uint256","name":"bidAmount","type":"uint256"},{"internalType":"address","name":"bidAddress","type":"address"},{"internalType":"uint256","name":"bidExpires","type":"uint256"},{"internalType":"uint256[]","name":"toCurators","type":"uint256[]"},{"internalType":"uint256","name":"curatorId","type":"uint256"},{"internalType":"string","name":"curatorContentId","type":"string"},{"internalType":"enum DataTypes.AuditStatus","name":"status","type":"uint8"},{"internalType":"enum TakoFarcasterHub.BidType","name":"bidType","type":"uint8"}],"indexed":false,"internalType":"struct TakoFarcasterHub.Content","name":"content","type":"tuple"}],"name":"modifiBidEvent","type":"event"},{"inputs":[],"name":"FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"contentURI","type":"string"},{"internalType":"string","name":"parentHash","type":"string"},{"internalType":"address","name":"bidToken","type":"address"},{"internalType":"uint256","name":"bidAmount","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256[]","name":"toCurators","type":"uint256[]"},{"internalType":"address[]","name":"toCuratorAddresses","type":"address[]"}],"internalType":"struct TakoFarcasterHub.BidData","name":"vars","type":"tuple"},{"internalType":"enum TakoFarcasterHub.BidType","name":"bidType","type":"uint8"},{"components":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"internalType":"struct DataTypes.MerkleVerifyData","name":"verifyData","type":"tuple"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"contentURI","type":"string"},{"internalType":"string","name":"parentHash","type":"string"},{"internalType":"address","name":"bidToken","type":"address"},{"internalType":"uint256","name":"bidAmount","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256[]","name":"toCurators","type":"uint256[]"},{"internalType":"address[]","name":"toCuratorAddresses","type":"address[]"}],"internalType":"struct TakoFarcasterHub.BidData[]","name":"vars","type":"tuple[]"},{"internalType":"enum TakoFarcasterHub.BidType[]","name":"bidType","type":"uint8[]"},{"components":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"internalType":"struct DataTypes.MerkleVerifyData","name":"verifyData","type":"tuple"}],"name":"bidBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"claimBackBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indexArr","type":"uint256[]"}],"name":"claimBackBidBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBidCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getContentByIndex","outputs":[{"components":[{"internalType":"string","name":"contentURI","type":"string"},{"internalType":"string","name":"parentHash","type":"string"},{"internalType":"address","name":"bidToken","type":"address"},{"internalType":"uint256","name":"bidAmount","type":"uint256"},{"internalType":"address","name":"bidAddress","type":"address"},{"internalType":"uint256","name":"bidExpires","type":"uint256"},{"internalType":"uint256[]","name":"toCurators","type":"uint256[]"},{"internalType":"uint256","name":"curatorId","type":"uint256"},{"internalType":"string","name":"curatorContentId","type":"string"},{"internalType":"enum DataTypes.AuditStatus","name":"status","type":"uint8"},{"internalType":"enum TakoFarcasterHub.BidType","name":"bidType","type":"uint8"}],"internalType":"struct TakoFarcasterHub.Content","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"enum TakoFarcasterHub.BidType","name":"bidType","type":"uint8"}],"name":"getDisableAcceptType","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getMinBidAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isBidTokenWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isGovernance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isRelayerWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"curatorId","type":"uint256"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"string","name":"contentId","type":"string"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct DataTypes.EIP712Signature","name":"sig","type":"tuple"}],"name":"loanWithSig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxToCuratorCounter","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool[]","name":"disableAuditTypes","type":"bool[]"}],"name":"setDisableAuditTypes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newsFeeCollector","type":"address"},{"internalType":"uint256","name":"newFeeRate","type":"uint256"}],"name":"setFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gov","type":"address"},{"internalType":"bool","name":"whitelist","type":"bool"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"min","type":"uint256"}],"name":"setMinBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"counter","type":"uint8"}],"name":"setToCuratorLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"bool[]","name":"disableAuditTypes","type":"bool[]"}],"name":"settings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"whitelist","type":"bool"}],"name":"whitelistBidToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"relayer","type":"address"},{"internalType":"bool","name":"whitelist","type":"bool"}],"name":"whitelistRelayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526004805460ff191660059081179091556212750090556305f5e1006007553480156200002f57600080fd5b5060405162003553380380620035538339810160408190526200005291620000eb565b6200005d336200009b565b60018055600391909155600680546001600160a01b03199081163317909155600280549091166001600160a01b03929092169190911790556200012a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060408385031215620000ff57600080fd5b825160208401519092506001600160a01b03811681146200011f57600080fd5b809150509250929050565b613419806200013a6000396000f3fe6080604052600436106101e75760003560e01c8063978bbdb911610102578063d73792a911610095578063e8c6e5b611610064578063e8c6e5b61461060b578063f2fde38b1461062b578063fa2fd4761461064b578063fac3f5501461066b57600080fd5b8063d73792a914610586578063dbef4c3b1461059f578063dcc8d31d146105bf578063dee1f0e4146105d257600080fd5b8063c52d467d116100d1578063c52d467d146104ed578063cb9ad6271461050d578063cbde821614610546578063cf0f34c41461056657600080fd5b8063978bbdb914610484578063a8129bf71461049a578063b3de7a9d146104ba578063c415b95c146104cd57600080fd5b80635d05d2051161017a578063883832a611610149578063883832a61461040a5780638c4ff9151461042a5780638da5cb5b1461043d578063952daf461461046f57600080fd5b80635d05d2051461037b5780636db5c8fd146103a75780637cb64759146103bd5780637dfda609146103dd57600080fd5b80632eb4a7ab116101b65780632eb4a7ab146102ce57806349ba7b71146102f25780634bbbd846146103125780635341331a1461035b57600080fd5b806306fdde03146101f3578063158a1ca11461024757806321ad9712146102695780632384fc74146102ae57600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b50610231604051806040016040528060128152602001712a30b5b7902330b931b0b9ba32b910243ab160711b81525081565b60405161023e919061270c565b60405180910390f35b34801561025357600080fd5b50610267610262366004612749565b61068b565b005b34801561027557600080fd5b50610267610284366004612780565b336000908152600b602090815260408083206001600160a01b038616845290915290208190555050565b3480156102ba57600080fd5b506102676102c9366004612749565b610714565b3480156102da57600080fd5b506102e460035481565b60405190815260200161023e565b3480156102fe57600080fd5b5061026761030d3660046127f5565b610796565b34801561031e57600080fd5b5061034b61032d36600461284e565b6001600160a01b03166000908152600d602052604090205460ff1690565b604051901515815260200161023e565b34801561036757600080fd5b50610267610376366004612749565b6107cc565b34801561038757600080fd5b506004546103959060ff1681565b60405160ff909116815260200161023e565b3480156103b357600080fd5b506102e460055481565b3480156103c957600080fd5b506102676103d8366004612869565b610827565b3480156103e957600080fd5b506103fd6103f8366004612869565b61085c565b60405161023e91906129e6565b34801561041657600080fd5b506102676104253660046129f9565b610b40565b610267610438366004612a61565b610b90565b34801561044957600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161023e565b34801561047b57600080fd5b506008546102e4565b34801561049057600080fd5b506102e460075481565b3480156104a657600080fd5b506102e46104b5366004612add565b610c5c565b6102676104c8366004612b10565b610c89565b3480156104d957600080fd5b50600654610457906001600160a01b031681565b3480156104f957600080fd5b50610267610508366004612b3c565b610da6565b34801561051957600080fd5b5061034b61052836600461284e565b6001600160a01b03166000908152600a602052604090205460ff1690565b34801561055257600080fd5b506102676105613660046129f9565b610dec565b34801561057257600080fd5b50610267610581366004612869565b610df6565b34801561059257600080fd5b506102e46402540be40081565b3480156105ab57600080fd5b5061034b6105ba366004612b5f565b610e2b565b6102676105cd366004612b89565b610e82565b3480156105de57600080fd5b5061034b6105ed36600461284e565b6001600160a01b03166000908152600e602052604090205460ff1690565b34801561061757600080fd5b50610267610626366004612869565b611090565b34801561063757600080fd5b5061026761064636600461284e565b6110ad565b34801561065757600080fd5b50610267610666366004612c1c565b611145565b34801561067757600080fd5b50610267610686366004612780565b61138a565b6000546001600160a01b031633146106be5760405162461bcd60e51b81526004016106b590612cce565b60405180910390fd5b6001600160a01b0382166106e557604051630191b71b60e61b815260040160405180910390fd5b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b5050565b336000908152600e602052604090205460ff1661074457604051632d5be4cb60e21b815260040160405180910390fd5b6001600160a01b03821661076b57604051630191b71b60e61b815260040160405180910390fd5b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b336000908152600b602090815260408083206001600160a01b038816845290915290208390556107c68282611426565b50505050565b336000908152600e602052604090205460ff166107fc57604051632d5be4cb60e21b815260040160405180910390fd5b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b336000908152600e602052604090205460ff1661085757604051632d5be4cb60e21b815260040160405180910390fd5b600355565b6108646125e0565b600082815260096020526040908190208151610160810190925280548290829061088d90612d03565b80601f01602080910402602001604051908101604052809291908181526020018280546108b990612d03565b80156109065780601f106108db57610100808354040283529160200191610906565b820191906000526020600020905b8154815290600101906020018083116108e957829003601f168201915b5050505050815260200160018201805461091f90612d03565b80601f016020809104026020016040519081016040528092919081815260200182805461094b90612d03565b80156109985780601f1061096d57610100808354040283529160200191610998565b820191906000526020600020905b81548152906001019060200180831161097b57829003601f168201915b505050918352505060028201546001600160a01b039081166020808401919091526003840154604080850191909152600485015490921660608401526005840154608084015260068401805483518184028101840190945280845260a0909401939091830182828015610a2a57602002820191906000526020600020905b815481526020019060010190808311610a16575b5050505050815260200160078201548152602001600882018054610a4d90612d03565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7990612d03565b8015610ac65780601f10610a9b57610100808354040283529160200191610ac6565b820191906000526020600020905b815481529060010190602001808311610aa957829003601f168201915b5050509183525050600982015460209091019060ff166003811115610aed57610aed6128bd565b6003811115610afe57610afe6128bd565b81526020016009820160019054906101000a900460ff166002811115610b2657610b266128bd565b6002811115610b3757610b376128bd565b90525092915050565b610b48611540565b60005b81811015610b8657610b74838383818110610b6857610b68612d37565b90506020020135611599565b80610b7e81612d63565b915050610b4b565b5061071060018055565b610b98611540565b610ba181612dea565b60035415610c265780516040513391600091610bdd9190849060200191825260601b6bffffffffffffffffffffffff1916602082015260340190565b604051602081830303815290604052805190602001209050610c068360200151600354836116b8565b610c2357604051630b094f2760e31b815260040160405180910390fd5b50505b610c43610c39606086016040870161284e565b85606001356116ce565b610c4d8484611760565b50610c5760018055565b505050565b6001600160a01b038083166000908152600b60209081526040808320938516835292905220545b92915050565b610c91611540565b610c9a82611b79565b610ca383611b9c565b600083815260096020526040812090600982015460ff166003811115610ccb57610ccb6128bd565b14610ce957604051635ef4122d60e11b815260040160405180910390fd5b60048101546001600160a01b03163314610d16576040516301e1a84160e11b815260040160405180910390fd5b6002810154610d2e906001600160a01b0316836116ce565b81816003016000828254610d429190612ea3565b9250508190555082816005016000828254610d5d9190612ea3565b90915550506040517f6ead2f502d5671fbefad316b6f35c79ca3184d8f5462c252f7537f064e286db290610d949086908490612f68565b60405180910390a150610c5760018055565b336000908152600e602052604090205460ff16610dd657604051632d5be4cb60e21b815260040160405180910390fd5b6004805460ff191660ff92909216919091179055565b6107108282611426565b336000908152600e602052604090205460ff16610e2657604051632d5be4cb60e21b815260040160405180910390fd5b600555565b6001600160a01b0382166000908152600c6020526040812081836002811115610e5657610e566128bd565b6002811115610e6757610e676128bd565b815260208101919091526040016000205460ff169392505050565b610e8a611540565b610e9381612dea565b60035415610f185780516040513391600091610ecf9190849060200191825260601b6bffffffffffffffffffffffff1916602082015260340190565b604051602081830303815290604052805190602001209050610ef88360200151600354836116b8565b610f1557604051630b094f2760e31b815260040160405180910390fd5b50505b6000805b8681101561106c57610f77888883818110610f3957610f39612d37565b9050602002810190610f4b919061305c565b878784818110610f5d57610f5d612d37565b9050602002016020810190610f72919061307c565b611760565b6000888883818110610f8b57610f8b612d37565b9050602002810190610f9d919061305c565b610fae90606081019060400161284e565b6001600160a01b031603610ff557878782818110610fce57610fce612d37565b9050602002810190610fe0919061305c565b610fee906060013583612ea3565b915061105a565b61105a88888381811061100a5761100a612d37565b905060200281019061101c919061305c565b61102d90606081019060400161284e565b89898481811061103f5761103f612d37565b9050602002810190611051919061305c565b606001356116ce565b8061106481612d63565b915050610f1c565b50801561107e5761107e6000826116ce565b505061108960018055565b5050505050565b611098611540565b6110a181611599565b6110aa60018055565b50565b6000546001600160a01b031633146110d75760405162461bcd60e51b81526004016106b590612cce565b6001600160a01b03811661113c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b5565b6110aa81611bbf565b61114d611540565b61115686611b9c565b6001600160a01b0384166000908152600d602052604090205460ff1661118f57604051630b094f2760e31b815260040160405180910390fd5b600086815260096020526040812090600982015460ff1660038111156111b7576111b76128bd565b146111d557604051635ef4122d60e11b815260040160405180910390fd5b611231868260060180548060200260200160405190810160405280929190818152602001828054801561122757602002820191906000526020600020905b815481526020019060010190808311611213575b5050505050611c0f565b6112fc6112f57f099b67069fecfad2106db73cdd5f487a5e70e85b83537464f3b213b30b9c53fc8933888860405161126a929190613097565b6040519081900381206112af9493929160608a01359060200194855260208501939093526001600160a01b039190911660408401526060830152608082015260a00190565b60405160208183030381529060405280519060200120604051806040016040528060128152602001712a30b5b7902330b931b0b9ba32b910243ab160711b815250611d22565b8684611df0565b60098101805460ff1916600217905560078101869055600881016113218486836130ed565b506002810154600382015461133f916001600160a01b031690611ece565b7f6ead2f502d5671fbefad316b6f35c79ca3184d8f5462c252f7537f064e286db28782604051611370929190612f68565b60405180910390a15061138260018055565b505050505050565b6000546001600160a01b031633146113b45760405162461bcd60e51b81526004016106b590612cce565b6001600160a01b0382166113db57604051630191b71b60e61b815260040160405180910390fd5b6402540be40081111561140157604051631ef6f64160e11b815260040160405180910390fd5b600755600680546001600160a01b0319166001600160a01b0392909216919091179055565b6003811461144757604051631a44e05560e11b815260040160405180910390fd5b8181600081811061145a5761145a612d37565b905060200201602081019061146f91906131ac565b336000908152600c602090815260408083208380529091529020805460ff1916911515919091179055818160018181106114ab576114ab612d37565b90506020020160208101906114c091906131ac565b336000908152600c60209081526040808320600184529091529020805460ff1916911515919091179055818160028181106114fd576114fd612d37565b905060200201602081019061151291906131ac565b336000908152600c60209081526040808320600284529091529020805460ff19169115159190911790555050565b6002600154036115925760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106b5565b6002600155565b6115a281611b9c565b600081815260096020526040902060048101546001600160a01b031633146115dd576040516301e1a84160e11b815260040160405180910390fd5b42816005015411156116025760405163d0404f8560e01b815260040160405180910390fd5b6000600982015460ff16600381111561161d5761161d6128bd565b1461163b57604051635ef4122d60e11b815260040160405180910390fd5b60038101541561166b5760028101546004820154600383015461166b926001600160a01b03908116921690611f2f565b60098101805460ff191660031790556040517f6ead2f502d5671fbefad316b6f35c79ca3184d8f5462c252f7537f064e286db2906116ac9084908490612f68565b60405180910390a15050565b6000826116c58584611f52565b14949350505050565b6001600160a01b0382161580156116e55750348114155b156117035760405163098fb56160e01b815260040160405180910390fd5b6001600160a01b03821615610710576001600160a01b0382166000908152600a602052604090205460ff1661174b576040516309321c2d60e31b815260040160405180910390fd5b6107106001600160a01b038316333084611f9f565b61176d8260800135611b79565b6117f361177d60a08401846131c9565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506117bc9250505060c08501856131c9565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061200a92505050565b611850611806606084016040850161284e565b60608401358361181960c08701876131c9565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061211392505050565b600060086000815461186190612d63565b918290555090506118706125e0565b6001836002811115611884576118846128bd565b14806118a15750600083600281111561189f5761189f6128bd565b145b156118e8576118b08480613212565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252505b60018360028111156118fc576118fc6128bd565b148061191957506002836002811115611917576119176128bd565b145b156119655761192b6020850185613212565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060208201525b611975606085016040860161284e565b6001600160a01b0316604082015260608481013590820152336080808301919091526119a49085013542612ea3565b60a0808301919091526119b9908501856131c9565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060c08201526101408101836002811115611a0657611a066128bd565b90816002811115611a1957611a196128bd565b9052506000610120820181905282815260096020526040902081518291908190611a439082613258565b5060208201516001820190611a589082613258565b5060408201516002820180546001600160a01b039283166001600160a01b03199182161790915560608401516003840155608084015160048401805491909316911617905560a0820151600582015560c08201518051611ac291600684019160209091019061265c565b5060e082015160078201556101008201516008820190611ae29082613258565b5061012082015160098201805460ff19166001836003811115611b0757611b076128bd565b021790555061014082015160098201805461ff001916610100836002811115611b3257611b326128bd565b02179055509050507f3a22ceb3631638083346153e05f2d6515953ee712a72cbf4522255cddeabe5a88282604051611b6b929190613317565b60405180910390a150505050565b6005548111156110aa576040516311decb7160e31b815260040160405180910390fd5b6008548111156110aa57604051631a44e05560e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6002546001600160a01b031663d94fe832336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611c65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c899190613330565b8214611ca85760405163f194fae560e01b815260040160405180910390fd5b8051600003611cb5575050565b6000805b82518160ff161015611d035783838260ff1681518110611cdb57611cdb612d37565b602002602001015103611cf15760019150611d03565b80611cfb81613349565b915050611cb9565b5080610c57576040516356b381a560e01b815260040160405180910390fd5b600080611db0838051602091820120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81850152808201929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b60405161190160f01b602082015260228101919091526042810185905260620160408051808303601f190181529190528051602090910120949350505050565b4281606001351015611e1557604051630819bdcd60e01b815260040160405180910390fd5b6000600184611e276020850185612b3c565b604080516000815260208181018084529490945260ff9092168282015291850135606082015290840135608082015260a0016020604051602081039080840390855afa158015611e7b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580611eb05750826001600160a01b0316816001600160a01b031614155b156107c6576040516337e8456b60e01b815260040160405180910390fd5b60006402540be40060075483611ee49190613368565b611eee919061337f565b90508015611f0e57600654611f0e9084906001600160a01b031683611f2f565b6000611f1a82846133a1565b1115610c5757610c578333611f2f84866133a1565b6001600160a01b038316611f4757610c57828261227a565b610c57838383612308565b600081815b8451811015611f9757611f8382868381518110611f7657611f76612d37565b602002602001015161231c565b915080611f8f81612d63565b915050611f57565b509392505050565b6040516001600160a01b03808516602483015283166044820152606481018290526107c69085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261234e565b60005b82518160ff161015610c5757828160ff168151811061202e5761202e612d37565b6020026020010151600260009054906101000a90046001600160a01b03166001600160a01b031663d94fe832848460ff168151811061206f5761206f612d37565b60200260200101516040518263ffffffff1660e01b81526004016120a291906001600160a01b0391909116815260200190565b602060405180830381865afa1580156120bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e39190613330565b1461210157604051631a44e05560e11b815260040160405180910390fd5b8061210b81613349565b91505061200d565b600454815160ff909116101561213c5760405163047d5f7760e51b815260040160405180910390fd5b60005b81518160ff16101561108957600b6000838360ff168151811061216457612164612d37565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000866001600160a01b03166001600160a01b03168152602001908152602001600020548410156121d057604051635bd954f760e11b815260040160405180910390fd5b600c6000838360ff16815181106121e9576121e9612d37565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000846002811115612225576122256128bd565b6002811115612236576122366128bd565b815260208101919091526040016000205460ff1615612268576040516320a7d2a360e11b815260040160405180910390fd5b8061227281613349565b91505061213f565b604080516000808252602082019092526001600160a01b0384169083906040516122a491906133b4565b60006040518083038185875af1925050503d80600081146122e1576040519150601f19603f3d011682016040523d82523d6000602084013e6122e6565b606091505b5050905080610c575760405163b12d13eb60e01b815260040160405180910390fd5b610c576001600160a01b0384168383612420565b6000818310612338576000828152602084905260409020612347565b60008381526020839052604090205b9392505050565b60006123a3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166124509092919063ffffffff16565b805190915015610c5757808060200190518101906123c191906133c6565b610c575760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106b5565b6040516001600160a01b038316602482015260448101829052610c5790849063a9059cbb60e01b90606401611fd3565b606061245f8484600085612467565b949350505050565b6060824710156124c85760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106b5565b600080866001600160a01b031685876040516124e491906133b4565b60006040518083038185875af1925050503d8060008114612521576040519150601f19603f3d011682016040523d82523d6000602084013e612526565b606091505b509150915061253787838387612542565b979650505050505050565b606083156125b15782516000036125aa576001600160a01b0385163b6125aa5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106b5565b508161245f565b61245f83838151156125c65781518083602001fd5b8060405162461bcd60e51b81526004016106b5919061270c565b604051806101600160405280606081526020016060815260200160006001600160a01b031681526020016000815260200160006001600160a01b031681526020016000815260200160608152602001600081526020016060815260200160006003811115612650576126506128bd565b81526020016000905290565b828054828255906000526020600020908101928215612697579160200282015b8281111561269757825182559160200191906001019061267c565b506126a39291506126a7565b5090565b5b808211156126a357600081556001016126a8565b60005b838110156126d75781810151838201526020016126bf565b50506000910152565b600081518084526126f88160208601602086016126bc565b601f01601f19169290920160200192915050565b60208152600061234760208301846126e0565b80356001600160a01b038116811461273657600080fd5b919050565b80151581146110aa57600080fd5b6000806040838503121561275c57600080fd5b6127658361271f565b915060208301356127758161273b565b809150509250929050565b6000806040838503121561279357600080fd5b61279c8361271f565b946020939093013593505050565b60008083601f8401126127bc57600080fd5b5081356001600160401b038111156127d357600080fd5b6020830191508360208260051b85010111156127ee57600080fd5b9250929050565b6000806000806060858703121561280b57600080fd5b6128148561271f565b93506020850135925060408501356001600160401b0381111561283657600080fd5b612842878288016127aa565b95989497509550505050565b60006020828403121561286057600080fd5b6123478261271f565b60006020828403121561287b57600080fd5b5035919050565b600081518084526020808501945080840160005b838110156128b257815187529582019590820190600101612896565b509495945050505050565b634e487b7160e01b600052602160045260246000fd5b600481106128e3576128e36128bd565b9052565b600381106128e3576128e36128bd565b6000610160825181855261290d828601826126e0565b9150506020830151848203602086015261292782826126e0565b915050604083015161294460408601826001600160a01b03169052565b5060608301516060850152608083015161296960808601826001600160a01b03169052565b5060a083015160a085015260c083015184820360c086015261298b8282612882565b91505060e083015160e085015261010080840151858303828701526129b083826126e0565b92505050610120808401516129c7828701826128d3565b5050610140808401516129dc828701826128e7565b5090949350505050565b60208152600061234760208301846128f7565b60008060208385031215612a0c57600080fd5b82356001600160401b03811115612a2257600080fd5b612a2e858286016127aa565b90969095509350505050565b80356003811061273657600080fd5b600060408284031215612a5b57600080fd5b50919050565b600080600060608486031215612a7657600080fd5b83356001600160401b0380821115612a8d57600080fd5b9085019060e08288031215612aa157600080fd5b819450612ab060208701612a3a565b93506040860135915080821115612ac657600080fd5b50612ad386828701612a49565b9150509250925092565b60008060408385031215612af057600080fd5b612af98361271f565b9150612b076020840161271f565b90509250929050565b600080600060608486031215612b2557600080fd5b505081359360208301359350604090920135919050565b600060208284031215612b4e57600080fd5b813560ff8116811461234757600080fd5b60008060408385031215612b7257600080fd5b612b7b8361271f565b9150612b0760208401612a3a565b600080600080600060608688031215612ba157600080fd5b85356001600160401b0380821115612bb857600080fd5b612bc489838a016127aa565b90975095506020880135915080821115612bdd57600080fd5b612be989838a016127aa565b90955093506040880135915080821115612c0257600080fd5b50612c0f88828901612a49565b9150509295509295909350565b600080600080600080868803610100811215612c3757600080fd5b8735965060208801359550612c4e6040890161271f565b945060608801356001600160401b0380821115612c6a57600080fd5b818a0191508a601f830112612c7e57600080fd5b813581811115612c8d57600080fd5b8b6020828501011115612c9f57600080fd5b6020929092019550909350506080607f1982011215612cbd57600080fd5b506080870190509295509295509295565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612d1757607f821691505b602082108103612a5b57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612d7557612d75612d4d565b5060010190565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612db457612db4612d7c565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612de257612de2612d7c565b604052919050565b600060408236031215612dfc57600080fd5b612e04612d92565b823581526020808401356001600160401b0380821115612e2357600080fd5b9085019036601f830112612e3657600080fd5b813581811115612e4857612e48612d7c565b8060051b9150612e59848301612dba565b8181529183018401918481019036841115612e7357600080fd5b938501935b83851015612e9157843582529385019390850190612e78565b94860194909452509295945050505050565b80820180821115610c8357610c83612d4d565b60008154612ec381612d03565b808552602060018381168015612ee05760018114612efa57612f28565b60ff1985168884015283151560051b880183019550612f28565b866000528260002060005b85811015612f205781548a8201860152908301908401612f05565b890184019650505b505050505092915050565b6000815480845260208085019450836000528060002060005b838110156128b257815487529582019560019182019101612f4c565b828152604060208201526000610160806040840152612f8b6101a0840185612eb6565b603f1980858303016060860152612fa58260018801612eb6565b9150612fbb60028701546001600160a01b031690565b6001600160a01b039081166080870152600387015460a087015260048701541660c0860152600586015460e086015284820381016101008601526130028260068801612f33565b915060078601546101208601528085830301610140860152506130288160088701612eb6565b9050600985015461303e83860160ff83166128d3565b613052610180860160ff8360081c166128e7565b5095945050505050565b6000823560de1983360301811261307257600080fd5b9190910192915050565b60006020828403121561308e57600080fd5b61234782612a3a565b8183823760009101908152919050565b601f821115610c5757600081815260208120601f850160051c810160208610156130ce5750805b601f850160051c820191505b81811015611382578281556001016130da565b6001600160401b0383111561310457613104612d7c565b613118836131128354612d03565b836130a7565b6000601f84116001811461314c57600085156131345750838201355b600019600387901b1c1916600186901b178355611089565b600083815260209020601f19861690835b8281101561317d578685013582556020948501946001909201910161315d565b508682101561319a5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000602082840312156131be57600080fd5b81356123478161273b565b6000808335601e198436030181126131e057600080fd5b8301803591506001600160401b038211156131fa57600080fd5b6020019150600581901b36038213156127ee57600080fd5b6000808335601e1984360301811261322957600080fd5b8301803591506001600160401b0382111561324357600080fd5b6020019150368190038213156127ee57600080fd5b81516001600160401b0381111561327157613271612d7c565b6132858161327f8454612d03565b846130a7565b602080601f8311600181146132ba57600084156132a25750858301515b600019600386901b1c1916600185901b178555611382565b600085815260208120601f198616915b828110156132e9578886015182559484019460019091019084016132ca565b50858210156133075787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b82815260406020820152600061245f60408301846128f7565b60006020828403121561334257600080fd5b5051919050565b600060ff821660ff810361335f5761335f612d4d565b60010192915050565b8082028115828204841417610c8357610c83612d4d565b60008261339c57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610c8357610c83612d4d565b600082516130728184602087016126bc565b6000602082840312156133d857600080fd5b81516123478161273b56fea264697066735822122079f2c78e30208fd5bef3e152c9efb3f1904189df826eb4c91d9f6d42b55640a464736f6c63430008110033000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fcaf86937e41ba038b4fa40baa4b780a
Deployed Bytecode
0x6080604052600436106101e75760003560e01c8063978bbdb911610102578063d73792a911610095578063e8c6e5b611610064578063e8c6e5b61461060b578063f2fde38b1461062b578063fa2fd4761461064b578063fac3f5501461066b57600080fd5b8063d73792a914610586578063dbef4c3b1461059f578063dcc8d31d146105bf578063dee1f0e4146105d257600080fd5b8063c52d467d116100d1578063c52d467d146104ed578063cb9ad6271461050d578063cbde821614610546578063cf0f34c41461056657600080fd5b8063978bbdb914610484578063a8129bf71461049a578063b3de7a9d146104ba578063c415b95c146104cd57600080fd5b80635d05d2051161017a578063883832a611610149578063883832a61461040a5780638c4ff9151461042a5780638da5cb5b1461043d578063952daf461461046f57600080fd5b80635d05d2051461037b5780636db5c8fd146103a75780637cb64759146103bd5780637dfda609146103dd57600080fd5b80632eb4a7ab116101b65780632eb4a7ab146102ce57806349ba7b71146102f25780634bbbd846146103125780635341331a1461035b57600080fd5b806306fdde03146101f3578063158a1ca11461024757806321ad9712146102695780632384fc74146102ae57600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b50610231604051806040016040528060128152602001712a30b5b7902330b931b0b9ba32b910243ab160711b81525081565b60405161023e919061270c565b60405180910390f35b34801561025357600080fd5b50610267610262366004612749565b61068b565b005b34801561027557600080fd5b50610267610284366004612780565b336000908152600b602090815260408083206001600160a01b038616845290915290208190555050565b3480156102ba57600080fd5b506102676102c9366004612749565b610714565b3480156102da57600080fd5b506102e460035481565b60405190815260200161023e565b3480156102fe57600080fd5b5061026761030d3660046127f5565b610796565b34801561031e57600080fd5b5061034b61032d36600461284e565b6001600160a01b03166000908152600d602052604090205460ff1690565b604051901515815260200161023e565b34801561036757600080fd5b50610267610376366004612749565b6107cc565b34801561038757600080fd5b506004546103959060ff1681565b60405160ff909116815260200161023e565b3480156103b357600080fd5b506102e460055481565b3480156103c957600080fd5b506102676103d8366004612869565b610827565b3480156103e957600080fd5b506103fd6103f8366004612869565b61085c565b60405161023e91906129e6565b34801561041657600080fd5b506102676104253660046129f9565b610b40565b610267610438366004612a61565b610b90565b34801561044957600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161023e565b34801561047b57600080fd5b506008546102e4565b34801561049057600080fd5b506102e460075481565b3480156104a657600080fd5b506102e46104b5366004612add565b610c5c565b6102676104c8366004612b10565b610c89565b3480156104d957600080fd5b50600654610457906001600160a01b031681565b3480156104f957600080fd5b50610267610508366004612b3c565b610da6565b34801561051957600080fd5b5061034b61052836600461284e565b6001600160a01b03166000908152600a602052604090205460ff1690565b34801561055257600080fd5b506102676105613660046129f9565b610dec565b34801561057257600080fd5b50610267610581366004612869565b610df6565b34801561059257600080fd5b506102e46402540be40081565b3480156105ab57600080fd5b5061034b6105ba366004612b5f565b610e2b565b6102676105cd366004612b89565b610e82565b3480156105de57600080fd5b5061034b6105ed36600461284e565b6001600160a01b03166000908152600e602052604090205460ff1690565b34801561061757600080fd5b50610267610626366004612869565b611090565b34801561063757600080fd5b5061026761064636600461284e565b6110ad565b34801561065757600080fd5b50610267610666366004612c1c565b611145565b34801561067757600080fd5b50610267610686366004612780565b61138a565b6000546001600160a01b031633146106be5760405162461bcd60e51b81526004016106b590612cce565b60405180910390fd5b6001600160a01b0382166106e557604051630191b71b60e61b815260040160405180910390fd5b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b5050565b336000908152600e602052604090205460ff1661074457604051632d5be4cb60e21b815260040160405180910390fd5b6001600160a01b03821661076b57604051630191b71b60e61b815260040160405180910390fd5b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b336000908152600b602090815260408083206001600160a01b038816845290915290208390556107c68282611426565b50505050565b336000908152600e602052604090205460ff166107fc57604051632d5be4cb60e21b815260040160405180910390fd5b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b336000908152600e602052604090205460ff1661085757604051632d5be4cb60e21b815260040160405180910390fd5b600355565b6108646125e0565b600082815260096020526040908190208151610160810190925280548290829061088d90612d03565b80601f01602080910402602001604051908101604052809291908181526020018280546108b990612d03565b80156109065780601f106108db57610100808354040283529160200191610906565b820191906000526020600020905b8154815290600101906020018083116108e957829003601f168201915b5050505050815260200160018201805461091f90612d03565b80601f016020809104026020016040519081016040528092919081815260200182805461094b90612d03565b80156109985780601f1061096d57610100808354040283529160200191610998565b820191906000526020600020905b81548152906001019060200180831161097b57829003601f168201915b505050918352505060028201546001600160a01b039081166020808401919091526003840154604080850191909152600485015490921660608401526005840154608084015260068401805483518184028101840190945280845260a0909401939091830182828015610a2a57602002820191906000526020600020905b815481526020019060010190808311610a16575b5050505050815260200160078201548152602001600882018054610a4d90612d03565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7990612d03565b8015610ac65780601f10610a9b57610100808354040283529160200191610ac6565b820191906000526020600020905b815481529060010190602001808311610aa957829003601f168201915b5050509183525050600982015460209091019060ff166003811115610aed57610aed6128bd565b6003811115610afe57610afe6128bd565b81526020016009820160019054906101000a900460ff166002811115610b2657610b266128bd565b6002811115610b3757610b376128bd565b90525092915050565b610b48611540565b60005b81811015610b8657610b74838383818110610b6857610b68612d37565b90506020020135611599565b80610b7e81612d63565b915050610b4b565b5061071060018055565b610b98611540565b610ba181612dea565b60035415610c265780516040513391600091610bdd9190849060200191825260601b6bffffffffffffffffffffffff1916602082015260340190565b604051602081830303815290604052805190602001209050610c068360200151600354836116b8565b610c2357604051630b094f2760e31b815260040160405180910390fd5b50505b610c43610c39606086016040870161284e565b85606001356116ce565b610c4d8484611760565b50610c5760018055565b505050565b6001600160a01b038083166000908152600b60209081526040808320938516835292905220545b92915050565b610c91611540565b610c9a82611b79565b610ca383611b9c565b600083815260096020526040812090600982015460ff166003811115610ccb57610ccb6128bd565b14610ce957604051635ef4122d60e11b815260040160405180910390fd5b60048101546001600160a01b03163314610d16576040516301e1a84160e11b815260040160405180910390fd5b6002810154610d2e906001600160a01b0316836116ce565b81816003016000828254610d429190612ea3565b9250508190555082816005016000828254610d5d9190612ea3565b90915550506040517f6ead2f502d5671fbefad316b6f35c79ca3184d8f5462c252f7537f064e286db290610d949086908490612f68565b60405180910390a150610c5760018055565b336000908152600e602052604090205460ff16610dd657604051632d5be4cb60e21b815260040160405180910390fd5b6004805460ff191660ff92909216919091179055565b6107108282611426565b336000908152600e602052604090205460ff16610e2657604051632d5be4cb60e21b815260040160405180910390fd5b600555565b6001600160a01b0382166000908152600c6020526040812081836002811115610e5657610e566128bd565b6002811115610e6757610e676128bd565b815260208101919091526040016000205460ff169392505050565b610e8a611540565b610e9381612dea565b60035415610f185780516040513391600091610ecf9190849060200191825260601b6bffffffffffffffffffffffff1916602082015260340190565b604051602081830303815290604052805190602001209050610ef88360200151600354836116b8565b610f1557604051630b094f2760e31b815260040160405180910390fd5b50505b6000805b8681101561106c57610f77888883818110610f3957610f39612d37565b9050602002810190610f4b919061305c565b878784818110610f5d57610f5d612d37565b9050602002016020810190610f72919061307c565b611760565b6000888883818110610f8b57610f8b612d37565b9050602002810190610f9d919061305c565b610fae90606081019060400161284e565b6001600160a01b031603610ff557878782818110610fce57610fce612d37565b9050602002810190610fe0919061305c565b610fee906060013583612ea3565b915061105a565b61105a88888381811061100a5761100a612d37565b905060200281019061101c919061305c565b61102d90606081019060400161284e565b89898481811061103f5761103f612d37565b9050602002810190611051919061305c565b606001356116ce565b8061106481612d63565b915050610f1c565b50801561107e5761107e6000826116ce565b505061108960018055565b5050505050565b611098611540565b6110a181611599565b6110aa60018055565b50565b6000546001600160a01b031633146110d75760405162461bcd60e51b81526004016106b590612cce565b6001600160a01b03811661113c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b5565b6110aa81611bbf565b61114d611540565b61115686611b9c565b6001600160a01b0384166000908152600d602052604090205460ff1661118f57604051630b094f2760e31b815260040160405180910390fd5b600086815260096020526040812090600982015460ff1660038111156111b7576111b76128bd565b146111d557604051635ef4122d60e11b815260040160405180910390fd5b611231868260060180548060200260200160405190810160405280929190818152602001828054801561122757602002820191906000526020600020905b815481526020019060010190808311611213575b5050505050611c0f565b6112fc6112f57f099b67069fecfad2106db73cdd5f487a5e70e85b83537464f3b213b30b9c53fc8933888860405161126a929190613097565b6040519081900381206112af9493929160608a01359060200194855260208501939093526001600160a01b039190911660408401526060830152608082015260a00190565b60405160208183030381529060405280519060200120604051806040016040528060128152602001712a30b5b7902330b931b0b9ba32b910243ab160711b815250611d22565b8684611df0565b60098101805460ff1916600217905560078101869055600881016113218486836130ed565b506002810154600382015461133f916001600160a01b031690611ece565b7f6ead2f502d5671fbefad316b6f35c79ca3184d8f5462c252f7537f064e286db28782604051611370929190612f68565b60405180910390a15061138260018055565b505050505050565b6000546001600160a01b031633146113b45760405162461bcd60e51b81526004016106b590612cce565b6001600160a01b0382166113db57604051630191b71b60e61b815260040160405180910390fd5b6402540be40081111561140157604051631ef6f64160e11b815260040160405180910390fd5b600755600680546001600160a01b0319166001600160a01b0392909216919091179055565b6003811461144757604051631a44e05560e11b815260040160405180910390fd5b8181600081811061145a5761145a612d37565b905060200201602081019061146f91906131ac565b336000908152600c602090815260408083208380529091529020805460ff1916911515919091179055818160018181106114ab576114ab612d37565b90506020020160208101906114c091906131ac565b336000908152600c60209081526040808320600184529091529020805460ff1916911515919091179055818160028181106114fd576114fd612d37565b905060200201602081019061151291906131ac565b336000908152600c60209081526040808320600284529091529020805460ff19169115159190911790555050565b6002600154036115925760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106b5565b6002600155565b6115a281611b9c565b600081815260096020526040902060048101546001600160a01b031633146115dd576040516301e1a84160e11b815260040160405180910390fd5b42816005015411156116025760405163d0404f8560e01b815260040160405180910390fd5b6000600982015460ff16600381111561161d5761161d6128bd565b1461163b57604051635ef4122d60e11b815260040160405180910390fd5b60038101541561166b5760028101546004820154600383015461166b926001600160a01b03908116921690611f2f565b60098101805460ff191660031790556040517f6ead2f502d5671fbefad316b6f35c79ca3184d8f5462c252f7537f064e286db2906116ac9084908490612f68565b60405180910390a15050565b6000826116c58584611f52565b14949350505050565b6001600160a01b0382161580156116e55750348114155b156117035760405163098fb56160e01b815260040160405180910390fd5b6001600160a01b03821615610710576001600160a01b0382166000908152600a602052604090205460ff1661174b576040516309321c2d60e31b815260040160405180910390fd5b6107106001600160a01b038316333084611f9f565b61176d8260800135611b79565b6117f361177d60a08401846131c9565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506117bc9250505060c08501856131c9565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061200a92505050565b611850611806606084016040850161284e565b60608401358361181960c08701876131c9565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061211392505050565b600060086000815461186190612d63565b918290555090506118706125e0565b6001836002811115611884576118846128bd565b14806118a15750600083600281111561189f5761189f6128bd565b145b156118e8576118b08480613212565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252505b60018360028111156118fc576118fc6128bd565b148061191957506002836002811115611917576119176128bd565b145b156119655761192b6020850185613212565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060208201525b611975606085016040860161284e565b6001600160a01b0316604082015260608481013590820152336080808301919091526119a49085013542612ea3565b60a0808301919091526119b9908501856131c9565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060c08201526101408101836002811115611a0657611a066128bd565b90816002811115611a1957611a196128bd565b9052506000610120820181905282815260096020526040902081518291908190611a439082613258565b5060208201516001820190611a589082613258565b5060408201516002820180546001600160a01b039283166001600160a01b03199182161790915560608401516003840155608084015160048401805491909316911617905560a0820151600582015560c08201518051611ac291600684019160209091019061265c565b5060e082015160078201556101008201516008820190611ae29082613258565b5061012082015160098201805460ff19166001836003811115611b0757611b076128bd565b021790555061014082015160098201805461ff001916610100836002811115611b3257611b326128bd565b02179055509050507f3a22ceb3631638083346153e05f2d6515953ee712a72cbf4522255cddeabe5a88282604051611b6b929190613317565b60405180910390a150505050565b6005548111156110aa576040516311decb7160e31b815260040160405180910390fd5b6008548111156110aa57604051631a44e05560e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6002546001600160a01b031663d94fe832336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611c65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c899190613330565b8214611ca85760405163f194fae560e01b815260040160405180910390fd5b8051600003611cb5575050565b6000805b82518160ff161015611d035783838260ff1681518110611cdb57611cdb612d37565b602002602001015103611cf15760019150611d03565b80611cfb81613349565b915050611cb9565b5080610c57576040516356b381a560e01b815260040160405180910390fd5b600080611db0838051602091820120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81850152808201929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b60405161190160f01b602082015260228101919091526042810185905260620160408051808303601f190181529190528051602090910120949350505050565b4281606001351015611e1557604051630819bdcd60e01b815260040160405180910390fd5b6000600184611e276020850185612b3c565b604080516000815260208181018084529490945260ff9092168282015291850135606082015290840135608082015260a0016020604051602081039080840390855afa158015611e7b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580611eb05750826001600160a01b0316816001600160a01b031614155b156107c6576040516337e8456b60e01b815260040160405180910390fd5b60006402540be40060075483611ee49190613368565b611eee919061337f565b90508015611f0e57600654611f0e9084906001600160a01b031683611f2f565b6000611f1a82846133a1565b1115610c5757610c578333611f2f84866133a1565b6001600160a01b038316611f4757610c57828261227a565b610c57838383612308565b600081815b8451811015611f9757611f8382868381518110611f7657611f76612d37565b602002602001015161231c565b915080611f8f81612d63565b915050611f57565b509392505050565b6040516001600160a01b03808516602483015283166044820152606481018290526107c69085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261234e565b60005b82518160ff161015610c5757828160ff168151811061202e5761202e612d37565b6020026020010151600260009054906101000a90046001600160a01b03166001600160a01b031663d94fe832848460ff168151811061206f5761206f612d37565b60200260200101516040518263ffffffff1660e01b81526004016120a291906001600160a01b0391909116815260200190565b602060405180830381865afa1580156120bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e39190613330565b1461210157604051631a44e05560e11b815260040160405180910390fd5b8061210b81613349565b91505061200d565b600454815160ff909116101561213c5760405163047d5f7760e51b815260040160405180910390fd5b60005b81518160ff16101561108957600b6000838360ff168151811061216457612164612d37565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000866001600160a01b03166001600160a01b03168152602001908152602001600020548410156121d057604051635bd954f760e11b815260040160405180910390fd5b600c6000838360ff16815181106121e9576121e9612d37565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000846002811115612225576122256128bd565b6002811115612236576122366128bd565b815260208101919091526040016000205460ff1615612268576040516320a7d2a360e11b815260040160405180910390fd5b8061227281613349565b91505061213f565b604080516000808252602082019092526001600160a01b0384169083906040516122a491906133b4565b60006040518083038185875af1925050503d80600081146122e1576040519150601f19603f3d011682016040523d82523d6000602084013e6122e6565b606091505b5050905080610c575760405163b12d13eb60e01b815260040160405180910390fd5b610c576001600160a01b0384168383612420565b6000818310612338576000828152602084905260409020612347565b60008381526020839052604090205b9392505050565b60006123a3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166124509092919063ffffffff16565b805190915015610c5757808060200190518101906123c191906133c6565b610c575760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106b5565b6040516001600160a01b038316602482015260448101829052610c5790849063a9059cbb60e01b90606401611fd3565b606061245f8484600085612467565b949350505050565b6060824710156124c85760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106b5565b600080866001600160a01b031685876040516124e491906133b4565b60006040518083038185875af1925050503d8060008114612521576040519150601f19603f3d011682016040523d82523d6000602084013e612526565b606091505b509150915061253787838387612542565b979650505050505050565b606083156125b15782516000036125aa576001600160a01b0385163b6125aa5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106b5565b508161245f565b61245f83838151156125c65781518083602001fd5b8060405162461bcd60e51b81526004016106b5919061270c565b604051806101600160405280606081526020016060815260200160006001600160a01b031681526020016000815260200160006001600160a01b031681526020016000815260200160608152602001600081526020016060815260200160006003811115612650576126506128bd565b81526020016000905290565b828054828255906000526020600020908101928215612697579160200282015b8281111561269757825182559160200191906001019061267c565b506126a39291506126a7565b5090565b5b808211156126a357600081556001016126a8565b60005b838110156126d75781810151838201526020016126bf565b50506000910152565b600081518084526126f88160208601602086016126bc565b601f01601f19169290920160200192915050565b60208152600061234760208301846126e0565b80356001600160a01b038116811461273657600080fd5b919050565b80151581146110aa57600080fd5b6000806040838503121561275c57600080fd5b6127658361271f565b915060208301356127758161273b565b809150509250929050565b6000806040838503121561279357600080fd5b61279c8361271f565b946020939093013593505050565b60008083601f8401126127bc57600080fd5b5081356001600160401b038111156127d357600080fd5b6020830191508360208260051b85010111156127ee57600080fd5b9250929050565b6000806000806060858703121561280b57600080fd5b6128148561271f565b93506020850135925060408501356001600160401b0381111561283657600080fd5b612842878288016127aa565b95989497509550505050565b60006020828403121561286057600080fd5b6123478261271f565b60006020828403121561287b57600080fd5b5035919050565b600081518084526020808501945080840160005b838110156128b257815187529582019590820190600101612896565b509495945050505050565b634e487b7160e01b600052602160045260246000fd5b600481106128e3576128e36128bd565b9052565b600381106128e3576128e36128bd565b6000610160825181855261290d828601826126e0565b9150506020830151848203602086015261292782826126e0565b915050604083015161294460408601826001600160a01b03169052565b5060608301516060850152608083015161296960808601826001600160a01b03169052565b5060a083015160a085015260c083015184820360c086015261298b8282612882565b91505060e083015160e085015261010080840151858303828701526129b083826126e0565b92505050610120808401516129c7828701826128d3565b5050610140808401516129dc828701826128e7565b5090949350505050565b60208152600061234760208301846128f7565b60008060208385031215612a0c57600080fd5b82356001600160401b03811115612a2257600080fd5b612a2e858286016127aa565b90969095509350505050565b80356003811061273657600080fd5b600060408284031215612a5b57600080fd5b50919050565b600080600060608486031215612a7657600080fd5b83356001600160401b0380821115612a8d57600080fd5b9085019060e08288031215612aa157600080fd5b819450612ab060208701612a3a565b93506040860135915080821115612ac657600080fd5b50612ad386828701612a49565b9150509250925092565b60008060408385031215612af057600080fd5b612af98361271f565b9150612b076020840161271f565b90509250929050565b600080600060608486031215612b2557600080fd5b505081359360208301359350604090920135919050565b600060208284031215612b4e57600080fd5b813560ff8116811461234757600080fd5b60008060408385031215612b7257600080fd5b612b7b8361271f565b9150612b0760208401612a3a565b600080600080600060608688031215612ba157600080fd5b85356001600160401b0380821115612bb857600080fd5b612bc489838a016127aa565b90975095506020880135915080821115612bdd57600080fd5b612be989838a016127aa565b90955093506040880135915080821115612c0257600080fd5b50612c0f88828901612a49565b9150509295509295909350565b600080600080600080868803610100811215612c3757600080fd5b8735965060208801359550612c4e6040890161271f565b945060608801356001600160401b0380821115612c6a57600080fd5b818a0191508a601f830112612c7e57600080fd5b813581811115612c8d57600080fd5b8b6020828501011115612c9f57600080fd5b6020929092019550909350506080607f1982011215612cbd57600080fd5b506080870190509295509295509295565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612d1757607f821691505b602082108103612a5b57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201612d7557612d75612d4d565b5060010190565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612db457612db4612d7c565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612de257612de2612d7c565b604052919050565b600060408236031215612dfc57600080fd5b612e04612d92565b823581526020808401356001600160401b0380821115612e2357600080fd5b9085019036601f830112612e3657600080fd5b813581811115612e4857612e48612d7c565b8060051b9150612e59848301612dba565b8181529183018401918481019036841115612e7357600080fd5b938501935b83851015612e9157843582529385019390850190612e78565b94860194909452509295945050505050565b80820180821115610c8357610c83612d4d565b60008154612ec381612d03565b808552602060018381168015612ee05760018114612efa57612f28565b60ff1985168884015283151560051b880183019550612f28565b866000528260002060005b85811015612f205781548a8201860152908301908401612f05565b890184019650505b505050505092915050565b6000815480845260208085019450836000528060002060005b838110156128b257815487529582019560019182019101612f4c565b828152604060208201526000610160806040840152612f8b6101a0840185612eb6565b603f1980858303016060860152612fa58260018801612eb6565b9150612fbb60028701546001600160a01b031690565b6001600160a01b039081166080870152600387015460a087015260048701541660c0860152600586015460e086015284820381016101008601526130028260068801612f33565b915060078601546101208601528085830301610140860152506130288160088701612eb6565b9050600985015461303e83860160ff83166128d3565b613052610180860160ff8360081c166128e7565b5095945050505050565b6000823560de1983360301811261307257600080fd5b9190910192915050565b60006020828403121561308e57600080fd5b61234782612a3a565b8183823760009101908152919050565b601f821115610c5757600081815260208120601f850160051c810160208610156130ce5750805b601f850160051c820191505b81811015611382578281556001016130da565b6001600160401b0383111561310457613104612d7c565b613118836131128354612d03565b836130a7565b6000601f84116001811461314c57600085156131345750838201355b600019600387901b1c1916600186901b178355611089565b600083815260209020601f19861690835b8281101561317d578685013582556020948501946001909201910161315d565b508682101561319a5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000602082840312156131be57600080fd5b81356123478161273b565b6000808335601e198436030181126131e057600080fd5b8301803591506001600160401b038211156131fa57600080fd5b6020019150600581901b36038213156127ee57600080fd5b6000808335601e1984360301811261322957600080fd5b8301803591506001600160401b0382111561324357600080fd5b6020019150368190038213156127ee57600080fd5b81516001600160401b0381111561327157613271612d7c565b6132858161327f8454612d03565b846130a7565b602080601f8311600181146132ba57600084156132a25750858301515b600019600386901b1c1916600185901b178555611382565b600085815260208120601f198616915b828110156132e9578886015182559484019460019091019084016132ca565b50858210156133075787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b82815260406020820152600061245f60408301846128f7565b60006020828403121561334257600080fd5b5051919050565b600060ff821660ff810361335f5761335f612d4d565b60010192915050565b8082028115828204841417610c8357610c83612d4d565b60008261339c57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610c8357610c83612d4d565b600082516130728184602087016126bc565b6000602082840312156133d857600080fd5b81516123478161273b56fea264697066735822122079f2c78e30208fd5bef3e152c9efb3f1904189df826eb4c91d9f6d42b55640a464736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fcaf86937e41ba038b4fa40baa4b780a
-----Decoded View---------------
Arg [0] : initMerkleRoot (bytes32): 0x0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : farcasterIdRegistry (address): 0x00000000FcAf86937e41bA038B4fA40BAA4B780A
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 00000000000000000000000000000000fcaf86937e41ba038b4fa40baa4b780a
Deployed Bytecode Sourcemap
494:14331:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1267:50;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1267:50:7;;;;;;;;;;;;:::i;:::-;;;;;;;;3430:184;;;;;;;;;;-1:-1:-1;3430:184:7;;;;;:::i;:::-;;:::i;:::-;;6430:95;;;;;;;;;;-1:-1:-1;6430:95:7;;;;;:::i;:::-;719:10:5;11193:36:7;;;;:22;:36;;;;;;;;-1:-1:-1;;;;;11193:43:7;;;;;;;;;:49;;;6430:95;;;3880:227;;;;;;;;;;-1:-1:-1;3880:227:7;;;;;:::i;:::-;;:::i;1323:25::-;;;;;;;;;;;;;;;;;;;1796::15;;;1784:2;1769:18;1323:25:7;1650:177:15;6215:209:7;;;;;;;;;;-1:-1:-1;6215:209:7;;;;;:::i;:::-;;:::i;8465:126::-;;;;;;;;;;-1:-1:-1;8465:126:7;;;;;:::i;:::-;-1:-1:-1;;;;;8557:27:7;8534:4;8557:27;;;:19;:27;;;;;;;;;8465:126;;;;3135:14:15;;3128:22;3110:41;;3098:2;3083:18;8465:126:7;2970:187:15;3743:131:7;;;;;;;;;;-1:-1:-1;3743:131:7;;;;;:::i;:::-;;:::i;1531:36::-;;;;;;;;;;-1:-1:-1;1531:36:7;;;;;;;;;;;3334:4:15;3322:17;;;3304:36;;3292:2;3277:18;1531:36:7;3162:184:15;1573:36:7;;;;;;;;;;;;;;;;3631:106;;;;;;;;;;-1:-1:-1;3631:106:7;;;;;:::i;:::-;;:::i;8713:141::-;;;;;;;;;;-1:-1:-1;8713:141:7;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5992:202::-;;;;;;;;;;-1:-1:-1;5992:202:7;;;;;:::i;:::-;;:::i;4330:280::-;;;;;;:::i;:::-;;:::i;1031:85:9:-;;;;;;;;;;-1:-1:-1;1077:7:9;1103:6;-1:-1:-1;;;;;1103:6:9;1031:85;;;-1:-1:-1;;;;;8271:32:15;;;8253:51;;8241:2;8226:18;1031:85:9;8107:203:15;8860:92:7;;;;;;;;;;-1:-1:-1;8934:11:7;;8860:92;;1648:36;;;;;;;;;;;;;;;;7978:171;;;;;;;;;;-1:-1:-1;7978:171:7;;;;;:::i;:::-;;:::i;5268:619::-;;;;;;:::i;:::-;;:::i;1615:27::-;;;;;;;;;;-1:-1:-1;1615:27:7;;;;-1:-1:-1;;;;;1615:27:7;;;4113:105;;;;;;;;;;-1:-1:-1;4113:105:7;;;;;:::i;:::-;;:::i;8333:126::-;;;;;;;;;;-1:-1:-1;8333:126:7;;;;;:::i;:::-;-1:-1:-1;;;;;8425:27:7;8402:4;8425:27;;;:20;:27;;;;;;;;;8333:126;6531:131;;;;;;;;;;-1:-1:-1;6531:131:7;;;;;:::i;:::-;;:::i;4224:88::-;;;;;;;;;;-1:-1:-1;4224:88:7;;;;;:::i;:::-;;:::i;2089:50::-;;;;;;;;;;;;2131:8;2089:50;;8155:172;;;;;;;;;;-1:-1:-1;8155:172:7;;;;;:::i;:::-;;:::i;4616:646::-;;;;;;:::i;:::-;;:::i;8597:110::-;;;;;;;;;;-1:-1:-1;8597:110:7;;;;;:::i;:::-;-1:-1:-1;;;;;8681:19:7;8658:4;8681:19;;;:11;:19;;;;;;;;;8597:110;5893:93;;;;;;;;;;-1:-1:-1;5893:93:7;;;;;:::i;:::-;;:::i;1470:232:9:-;;;;;;;;;;-1:-1:-1;1470:232:9;;;;;:::i;:::-;;:::i;6668:1292:7:-;;;;;;;;;;-1:-1:-1;6668:1292:7;;;;;:::i;:::-;;:::i;3075:349::-;;;;;;;;;;-1:-1:-1;3075:349:7;;;;;:::i;:::-;;:::i;3430:184::-;1077:7:9;1103:6;-1:-1:-1;;;;;1103:6:9;719:10:5;1243:23:9;1235:68;;;;-1:-1:-1;;;1235:68:9;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;3515:17:7;::::1;3511:58;;3541:28;;-1:-1:-1::0;;;3541:28:7::1;;;;;;;;;;;3511:58;-1:-1:-1::0;;;;;3579:16:7;;;::::1;;::::0;;;:11:::1;:16;::::0;;;;:28;;-1:-1:-1;;3579:28:7::1;::::0;::::1;;::::0;;;::::1;::::0;;3430:184::o;6496:22::-;6430:95;;:::o;3880:227::-;719:10:5;2294:25:7;;;;:11;:25;;;;;;;;2289:86;;2342:22;;-1:-1:-1;;;2342:22:7;;;;;;;;;;;2289:86;-1:-1:-1;;;;;3992:21:7;::::1;3988:62;;4022:28;;-1:-1:-1::0;;;4022:28:7::1;;;;;;;;;;;3988:62;-1:-1:-1::0;;;;;4060:28:7;;;::::1;;::::0;;;:19:::1;:28;::::0;;;;:40;;-1:-1:-1;;4060:40:7::1;::::0;::::1;;::::0;;;::::1;::::0;;3880:227::o;6215:209::-;719:10:5;11193:36:7;;;;:22;:36;;;;;;;;-1:-1:-1;;;;;11193:43:7;;;;;;;;;:49;;;6377:40;6399:17;;6377:21;:40::i;:::-;6215:209;;;;:::o;3743:131::-;719:10:5;2294:25:7;;;;:11;:25;;;;;;;;2289:86;;2342:22;;-1:-1:-1;;;2342:22:7;;;;;;;;;;;2289:86;-1:-1:-1;;;;;3828:27:7;;;::::1;;::::0;;;:20:::1;:27;::::0;;;;:39;;-1:-1:-1;;3828:39:7::1;::::0;::::1;;::::0;;;::::1;::::0;;3743:131::o;3631:106::-;719:10:5;2294:25:7;;;;:11;:25;;;;;;;;2289:86;;2342:22;;-1:-1:-1;;;2342:22:7;;;;;;;;;;;2289:86;3704:10:::1;:26:::0;3631:106::o;8713:141::-;8792:14;;:::i;:::-;8825:22;;;;:15;:22;;;;;;;8818:29;;;;;;;;;;;;8825:22;;8818:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8818:29:7;;;-1:-1:-1;;8818:29:7;;;;-1:-1:-1;;;;;8818:29:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8818:29:7;;;-1:-1:-1;;8818:29:7;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;8818:29:7;8713:141;-1:-1:-1;;8713:141:7:o;5992:202::-;2261:21:0;:19;:21::i;:::-;6099:9:7::1;6094:94;6114:19:::0;;::::1;6094:94;;;6154:23;6165:8;;6174:1;6165:11;;;;;;;:::i;:::-;;;;;;;6154:10;:23::i;:::-;6135:3:::0;::::1;::::0;::::1;:::i;:::-;;;;6094:94;;;;2303:20:0::0;1716:1;2809:22;;2629:209;4330:280:7;2261:21:0;:19;:21::i;:::-;2397:419:7::1;4507:10:::0;2397:419:::1;:::i;:::-;2482:10;::::0;:24;2478:321:::1;;2622:16:::0;;2605:42:::1;::::0;2539:10:::1;::::0;2522:14:::1;::::0;2605:42:::1;::::0;2622:16;2539:10;;2605:42:::1;;15058:19:15::0;;;15115:2;15111:15;-1:-1:-1;;15107:53:15;15102:2;15093:12;;15086:75;15186:2;15177:12;;14901:294;2605:42:7::1;;;;;;;;;;;;;2578:83;;;;;;2563:98;;2680:60;2699:10;:22;;;2723:10;;2735:4;2680:18;:60::i;:::-;2675:113;;2765:23;;-1:-1:-1::0;;;2765:23:7::1;;;;;;;;;;;2675:113;2508:291;;2478:321;4529:45:::2;4544:13;::::0;;;::::2;::::0;::::2;;:::i;:::-;4559:4;:14;;;4529;:45::i;:::-;4584:19;4589:4;4595:7;4584:4;:19::i;:::-;2292:1:0::1;2303:20:::0;1716:1;2809:22;;2629:209;2303:20;4330:280:7;;;:::o;7978:171::-;-1:-1:-1;;;;;8105:30:7;;;8079:7;8105:30;;;:22;:30;;;;;;;;:37;;;;;;;;;;7978:171;;;;;:::o;5268:619::-;2261:21:0;:19;:21::i;:::-;5406:27:7::1;5424:8;5406:17;:27::i;:::-;5443:28;5465:5;5443:21;:28::i;:::-;5482:23;5508:22:::0;;;:15:::1;:22;::::0;;;;;5544:14:::1;::::0;::::1;::::0;::::1;;:47;::::0;::::1;;;;;;:::i;:::-;;5540:91;;5612:19;;-1:-1:-1::0;;;5612:19:7::1;;;;;;;;;;;5540:91;5645:18;::::0;::::1;::::0;-1:-1:-1;;;;;5645:18:7::1;719:10:5::0;5645:34:7::1;5641:65;;5688:18;;-1:-1:-1::0;;;5688:18:7::1;;;;;;;;;;;5641:65;5732:16;::::0;::::1;::::0;5717:40:::1;::::0;-1:-1:-1;;;;;5732:16:7::1;5750:6:::0;5717:14:::1;:40::i;:::-;5789:6;5768:7;:17;;;:27;;;;;;;:::i;:::-;;;;;;;;5827:8;5805:7;:18;;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;5850:30:7::1;::::0;::::1;::::0;::::1;::::0;5865:5;;5872:7;;5850:30:::1;:::i;:::-;;;;;;;;5396:491;2303:20:0::0;1716:1;2809:22;;2629:209;4113:105:7;719:10:5;2294:25:7;;;;:11;:25;;;;;;;;2289:86;;2342:22;;-1:-1:-1;;;2342:22:7;;;;;;;;;;;2289:86;4182:19:::1;:29:::0;;-1:-1:-1;;4182:29:7::1;;::::0;;;::::1;::::0;;;::::1;::::0;;4113:105::o;6531:131::-;6615:40;6637:17;;6615:21;:40::i;4224:88::-;719:10:5;2294:25:7;;;;:11;:25;;;;;;;;2289:86;;2342:22;;-1:-1:-1;;;2342:22:7;;;;;;;;;;;2289:86;4288:11:::1;:17:::0;4224:88::o;8155:172::-;-1:-1:-1;;;;;8286:25:7;;8263:4;8286:25;;;:17;:25;;;;;8263:4;8312:7;8286:34;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;8286:34:7;;;;;8155:172;-1:-1:-1;;;8155:172:7:o;4616:646::-;2261:21:0;:19;:21::i;:::-;2397:419:7::1;4811:10:::0;2397:419:::1;:::i;:::-;2482:10;::::0;:24;2478:321:::1;;2622:16:::0;;2605:42:::1;::::0;2539:10:::1;::::0;2522:14:::1;::::0;2605:42:::1;::::0;2622:16;2539:10;;2605:42:::1;;15058:19:15::0;;;15115:2;15111:15;-1:-1:-1;;15107:53:15;15102:2;15093:12;;15086:75;15186:2;15177:12;;14901:294;2605:42:7::1;;;;;;;;;;;;;2578:83;;;;;;2563:98;;2680:60;2699:10;:22;;;2723:10;;2735:4;2680:18;:60::i;:::-;2675:113;;2765:23;;-1:-1:-1::0;;;2765:23:7::1;;;;;;;;;;;2675:113;2508:291;;2478:321;4833:20:::2;::::0;4863:297:::2;4883:15:::0;;::::2;4863:297;;;4919:25;4924:4;;4929:1;4924:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;4933;;4941:1;4933:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;4919:4;:25::i;:::-;4990:1;4962:4:::0;;4967:1;4962:7;;::::2;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;;;;;::::2;;;:::i;:::-;-1:-1:-1::0;;;;;4962:30:7::2;::::0;4958:192:::2;;5028:4;;5033:1;5028:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;5012:33;::::0;5028:17:::2;;;5012:33:::0;::::2;:::i;:::-;;;4958:192;;;5084:51;5099:4;;5104:1;5099:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;;;;;::::2;;;:::i;:::-;5117:4;;5122:1;5117:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:17;;;5084:14;:51::i;:::-;4900:3:::0;::::2;::::0;::::2;:::i;:::-;;;;4863:297;;;-1:-1:-1::0;5173:16:7;;5169:87:::2;;5205:40;5228:1;5232:12;5205:14;:40::i;:::-;4823:439;2292:1:0::1;2303:20:::0;1716:1;2809:22;;2629:209;2303:20;4616:646:7;;;;;:::o;5893:93::-;2261:21:0;:19;:21::i;:::-;5962:17:7::1;5973:5;5962:10;:17::i;:::-;2303:20:0::0;1716:1;2809:22;;2629:209;2303:20;5893:93:7;:::o;1470:232:9:-;1077:7;1103:6;-1:-1:-1;;;;;1103:6:9;719:10:5;1243:23:9;1235:68;;;;-1:-1:-1;;;1235:68:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;1571:22:9;::::1;1550:107;;;::::0;-1:-1:-1;;;1550:107:9;;19209:2:15;1550:107:9::1;::::0;::::1;19191:21:15::0;19248:2;19228:18;;;19221:30;19287:34;19267:18;;;19260:62;-1:-1:-1;;;19338:18:15;;;19331:36;19384:19;;1550:107:9::1;19007:402:15::0;1550:107:9::1;1667:28;1686:8;1667:18;:28::i;6668:1292:7:-:0;2261:21:0;:19;:21::i;:::-;6885:28:7::1;6907:5;6885:21;:28::i;:::-;-1:-1:-1::0;;;;;6929:28:7;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;6924:90;;6980:23;;-1:-1:-1::0;;;6980:23:7::1;;;;;;;;;;;6924:90;7024:23;7050:22:::0;;;:15:::1;:22;::::0;;;;;7086:14:::1;::::0;::::1;::::0;::::1;;:47;::::0;::::1;;;;;;:::i;:::-;;7082:104;;7156:19;;-1:-1:-1::0;;;7156:19:7::1;;;;;;;;;;;7082:104;7196:47;7213:9;7224:7;:18;;7196:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:47::i;:::-;7253:464;7301:368;1413:111;7459:5:::0;719:10:5;7544:9:7::1;;7528:27;;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;7375:240:::1;::::0;;;;7581:12:::1;::::0;::::1;;::::0;7375:240:::1;;19949:25:15::0;;;20005:2;19990:18;;19983:34;;;;-1:-1:-1;;;;;20053:32:15;;;;20048:2;20033:18;;20026:60;20117:2;20102:18;;20095:34;20160:3;20145:19;;20138:35;19936:3;19921:19;;19690:489;7375:240:7::1;;;;;;;;;;;;;7344:289;;;;;;7651:4;;;;;;;;;;;;;-1:-1:-1::0;;;7651:4:7::1;;::::0;7301:25:::1;:368::i;:::-;7683:7;7704:3;7253:34;:464::i;:::-;7728:14;::::0;::::1;:43:::0;;-1:-1:-1;;7728:43:7::1;7745:26;7728:43;::::0;;7781:17:::1;::::0;::::1;:29:::0;;;7820:24:::1;::::0;::::1;:36;7847:9:::0;;7820:24;:36:::1;:::i;:::-;-1:-1:-1::0;7872:16:7::1;::::0;::::1;::::0;7890:17:::1;::::0;::::1;::::0;7866:42:::1;::::0;-1:-1:-1;;;;;7872:16:7::1;::::0;7866:5:::1;:42::i;:::-;7923:30;7938:5;7945:7;7923:30;;;;;;;:::i;:::-;;;;;;;;6875:1085;2303:20:0::0;1716:1;2809:22;;2629:209;2303:20;6668:1292:7;;;;;;:::o;3075:349::-;1077:7:9;1103:6;-1:-1:-1;;;;;1103:6:9;719:10:5;1243:23:9;1235:68;;;;-1:-1:-1;;;1235:68:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;3201:30:7;::::1;3197:71;;3240:28;;-1:-1:-1::0;;;3240:28:7::1;;;;;;;;;;;3197:71;2131:8;3282:10;:28;3278:68;;;3319:27;;-1:-1:-1::0;;;3319:27:7::1;;;;;;;;;;;3278:68;3356:7;:20:::0;3386:12:::1;:31:::0;;-1:-1:-1;;;;;;3386:31:7::1;-1:-1:-1::0;;;;;3386:31:7;;;::::1;::::0;;;::::1;::::0;;3075:349::o;11255:420::-;11372:1;11344:29;;11340:89;;11396:22;;-1:-1:-1;;;11396:22:7;;;;;;;;;;;11340:89;11488:17;;11506:1;11488:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;719:10:5;11439:31:7;;;;:17;:31;;;;;;;;:46;;;;;;;;:69;;-1:-1:-1;;11439:69:7;;;;;;;;;;11567:17;;-1:-1:-1;11567:20:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;719:10:5;11518:31:7;;;;:17;:31;;;;;;;;11550:13;11518:46;;;;;;;:69;;-1:-1:-1;;11518:69:7;;;;;;;;;;11648:17;;11666:1;11648:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;719:10:5;11597:31:7;;;;:17;:31;;;;;;;;11629:15;11597:48;;;;;;;:71;;-1:-1:-1;;11597:71:7;;;;;;;;;;-1:-1:-1;;11255:420:7:o;2336:287:0:-;1759:1;2468:7;;:19;2460:63;;;;-1:-1:-1;;;2460:63:0;;22564:2:15;2460:63:0;;;22546:21:15;22603:2;22583:18;;;22576:30;22642:33;22622:18;;;22615:61;22693:18;;2460:63:0;22362:355:15;2460:63:0;1759:1;2598:7;:18;2336:287::o;12763:700:7:-;12817:28;12839:5;12817:21;:28::i;:::-;12856:23;12882:22;;;:15;:22;;;;;12919:18;;;;-1:-1:-1;;;;;12919:18:7;719:10:5;12919:34:7;12915:65;;12962:18;;-1:-1:-1;;;12962:18:7;;;;;;;;;;;12915:65;13015:15;12994:7;:18;;;:36;12990:68;;;13039:19;;-1:-1:-1;;;13039:19:7;;;;;;;;;;;12990:68;13090:29;13072:14;;;;;;:47;;;;;;;;:::i;:::-;;13068:91;;13140:19;;-1:-1:-1;;;13140:19:7;;;;;;;;;;;13068:91;13173:17;;;;:21;13169:186;;13243:16;;;;13277:18;;;;13313:17;;;;13210:134;;-1:-1:-1;;;;;13243:16:7;;;;13277:18;;13210:15;:134::i;:::-;13365:14;;;:45;;-1:-1:-1;;13365:45:7;13382:28;13365:45;;;13426:30;;;;;;13441:5;;13365:14;;13426:30;:::i;:::-;;;;;;;;12807:656;12763:700;:::o;1156:184:6:-;1277:4;1329;1300:25;1313:5;1320:4;1300:12;:25::i;:::-;:33;;1156:184;-1:-1:-1;;;;1156:184:6:o;13821:420:7:-;-1:-1:-1;;;;;13899:19:7;;;:42;;;;;13932:9;13922:6;:19;;13899:42;13895:112;;;13964:32;;-1:-1:-1;;;13964:32:7;;;;;;;;;;;13895:112;-1:-1:-1;;;;;14020:19:7;;;14016:219;;-1:-1:-1;;;;;14060:27:7;;;;;;:20;:27;;;;;;;;14055:88;;14112:31;;-1:-1:-1;;;14112:31:7;;;;;;;;;;;14055:88;14157:67;-1:-1:-1;;;;;14157:30:7;;719:10:5;14210:4:7;14217:6;14157:30;:67::i;11681:1076::-;11754:32;11772:4;:13;;;11754:17;:32::i;:::-;11796:59;11814:15;;;;:4;:15;:::i;:::-;11796:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11831:23:7;;-1:-1:-1;;;11831:23:7;;;;;:::i;:::-;11796:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11796:17:7;;-1:-1:-1;;;11796:59:7:i;:::-;11865:135;11891:13;;;;;;;;:::i;:::-;11918:14;;;;11946:7;11967:23;;;;11918:4;11967:23;:::i;:::-;11865:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11865:12:7;;-1:-1:-1;;;11865:135:7:i;:::-;12011:15;12031:11;;12029:13;;;;;:::i;:::-;;;;;-1:-1:-1;12029:13:7;-1:-1:-1;12052:22:7;;:::i;:::-;12099:13;12088:7;:24;;;;;;;;:::i;:::-;;:52;;;-1:-1:-1;12127:13:7;12116:7;:24;;;;;;;;:::i;:::-;;12088:52;12084:119;;;12177:15;:4;;:15;:::i;:::-;12156:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12156:36:7;;;-1:-1:-1;12084:119:7;12227:13;12216:7;:24;;;;;;;;:::i;:::-;;:54;;;-1:-1:-1;12255:15:7;12244:7;:26;;;;;;;;:::i;:::-;;12216:54;12212:121;;;12307:15;;;;:4;:15;:::i;:::-;12286:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;12286:18:7;;;:36;12212:121;12361:13;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12342:32:7;:16;;;:32;12404:14;;;;;12384:17;;;:34;719:10:5;12428:18:7;;;;:33;;;;12492:31;;12510:13;;;12492:15;:31;:::i;:::-;12471:18;;;;:52;;;;12554:15;;;;:4;:15;:::i;:::-;12533:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;12533:18:7;;;:36;12579:15;;;12597:7;12579:25;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;12632:29:7;12615:14;;;:46;;;12672:24;;;:15;:24;;;;;:34;;12615:14;;12672:24;;;:34;;:24;:34;:::i;:::-;-1:-1:-1;12672:34:7;;;;;;;;;;;;:::i;:::-;-1:-1:-1;12672:34:7;;;;;;;;;-1:-1:-1;;;;;12672:34:7;;;-1:-1:-1;;;;;;12672:34:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;12672:34:7;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;12672:34:7;;;;;;;;;-1:-1:-1;;12672:34:7;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;12672:34:7;;;;;;;;;-1:-1:-1;;12672:34:7;;;;;;;;;;;:::i;:::-;;;;;;;;;12721:29;12733:7;12742;12721:29;;;;;;;:::i;:::-;;;;;;;;11744:1013;;11681:1076;;:::o;10955:165::-;11039:11;;11028:8;:22;11024:90;;;11073:30;;-1:-1:-1;;;11073:30:7;;;;;;;;;;;9131:155;9213:11;;9205:5;:19;9201:79;;;9247:22;;-1:-1:-1;;;9247:22:7;;;;;;;;;;;1856:187:9;1929:16;1948:6;;-1:-1:-1;;;;;1964:17:9;;;-1:-1:-1;;;;;;1964:17:9;;;;;;1996:40;;1948:6;;;;;;;1996:40;;1929:16;1996:40;1919:124;1856:187;:::o;9942:613:7:-;10104:21;;-1:-1:-1;;;;;10104:21:7;10092:39;719:10:5;10092:53:7;;-1:-1:-1;;;;;;10092:53:7;;;;;;;-1:-1:-1;;;;;8271:32:15;;;10092:53:7;;;8253:51:15;8226:18;;10092:53:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10079:9;:66;10062:150;;10177:24;;-1:-1:-1;;;10177:24:7;;;;;;;;;;;10062:150;10225:10;:17;10246:1;10225:22;10221:59;;9942:613;;:::o;10221:59::-;10290:9;;10309:169;10331:10;:17;10327:1;:21;;;10309:169;;;10390:9;10373:10;10384:1;10373:13;;;;;;;;;;:::i;:::-;;;;;;;:26;10369:99;;10426:4;10419:11;;10448:5;;10369:99;10350:3;;;;:::i;:::-;;;;10309:169;;;;10492:4;10487:62;;10519:19;;-1:-1:-1;;;10519:19:7;;;;;;;;;;;1760:425:14;1874:7;1893:14;2047:31;2073:4;1314:22;;;;;;;1238:228;;;266:117;1238:228;;;28376:25:15;28417:18;;;28410:34;;;;186:14:14;28460:18:15;;;28453:34;1400:13:14;28503:18:15;;;28496:34;1443:4:14;28546:19:15;;;;28539:61;;;;1238:228:14;;;;;;;;;;28348:19:15;;;;1238:228:14;;1211:269;;;;;;1081:406;2047:31;1977:154;;-1:-1:-1;;;1977:154:14;;;26667:27:15;26710:11;;;26703:27;;;;26746:12;;;26739:28;;;26783:12;;1977:154:14;;;;;;-1:-1:-1;;1977:154:14;;;;;;1950:195;;1977:154;1950:195;;;;;1760:425;-1:-1:-1;;;;1760:425:14:o;497:471::-;686:15;671:3;:12;;;:30;667:68;;;710:25;;-1:-1:-1;;;710:25:14;;;;;;;;;;;667:68;745:24;772:38;782:6;790:5;;;;:3;:5;:::i;:::-;804;772:38;;;;;797:5;772:38;;;;;;27033:25:15;;;;27106:4;27094:17;;;27074:18;;;27067:45;797:5:14;;;;27128:18:15;;;27121:34;804:5:14;;;;27171:18:15;;;27164:34;27005:19;;772:38:14;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;772:38:14;;-1:-1:-1;;772:38:14;;;-1:-1:-1;;;;;;;837:30:14;;;;:81;;;903:15;-1:-1:-1;;;;;883:35:14;:16;-1:-1:-1;;;;;883:35:14;;;837:81;820:141;;;936:25;;-1:-1:-1;;;936:25:14;;;;;;;;;;;13469:346:7;13534:17;2131:8;13564:7;;13555:6;:16;;;;:::i;:::-;13554:36;;;;:::i;:::-;13534:56;-1:-1:-1;13604:13:7;;13600:91;;13656:12;;13633:47;;13649:5;;-1:-1:-1;;;;;13656:12:7;13670:9;13633:15;:47::i;:::-;13725:1;13704:18;13713:9;13704:6;:18;:::i;:::-;:22;13700:109;;;13742:56;13758:5;719:10:5;13779:18:7;13788:9;13779:6;:18;:::i;:::-;-1:-1:-1;;;;;14368:19:7;;14364:130;;14403:20;14412:2;14416:6;14403:8;:20::i;14364:130::-;14454:29;14465:5;14472:2;14476:6;14454:10;:29::i;1994:290:6:-;2077:7;2119:4;2077:7;2133:116;2157:5;:12;2153:1;:16;2133:116;;;2205:33;2215:12;2229:5;2235:1;2229:8;;;;;;;;:::i;:::-;;;;;;;2205:9;:33::i;:::-;2190:48;-1:-1:-1;2171:3:6;;;;:::i;:::-;;;;2133:116;;;-1:-1:-1;2265:12:6;1994:290;-1:-1:-1;;;1994:290:6:o;974:241:3:-;1139:68;;-1:-1:-1;;;;;27995:15:15;;;1139:68:3;;;27977:34:15;28047:15;;28027:18;;;28020:43;28079:18;;;28072:34;;;1112:96:3;;1132:5;;-1:-1:-1;;;1162:27:3;27912:18:15;;1139:68:3;;;;-1:-1:-1;;1139:68:3;;;;;;;;;;;;;;-1:-1:-1;;;;;1139:68:3;-1:-1:-1;;;;;;1139:68:3;;;;;;;;;;1112:19;:96::i;10561:388:7:-;10695:7;10690:253;10712:10;:17;10708:1;:21;;;10690:253;;;10843:10;10854:1;10843:13;;;;;;;;;;:::i;:::-;;;;;;;10783:21;;;;;;;;;-1:-1:-1;;;;;10783:21:7;-1:-1:-1;;;;;10771:39:7;;10811:8;10820:1;10811:11;;;;;;;;;;:::i;:::-;;;;;;;10771:52;;;;;;;;;;;;;;-1:-1:-1;;;;;8271:32:15;;;;8253:51;;8241:2;8226:18;;8107:203;10771:52:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:85;10750:183;;10896:22;;-1:-1:-1;;;10896:22:7;;;;;;;;;;;10750:183;10731:3;;;;:::i;:::-;;;;10690:253;;9292:644;9493:19;;9465:25;;9493:19;;;;-1:-1:-1;9461:116:7;;;9535:31;;-1:-1:-1;;;9535:31:7;;;;;;;;;;;9461:116;9591:7;9586:344;9608:18;:25;9604:1;:29;;;9586:344;;;9667:22;:45;9690:18;9709:1;9690:21;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;9667:45:7;-1:-1:-1;;;;;9667:45:7;;;;;;;;;;;;:52;9713:5;-1:-1:-1;;;;;9667:52:7;-1:-1:-1;;;;;9667:52:7;;;;;;;;;;;;;9658:6;:61;9654:133;;;9746:26;;-1:-1:-1;;;9746:26:7;;;;;;;;;;;9654:133;9804:17;:40;9822:18;9841:1;9822:21;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;9804:40:7;-1:-1:-1;;;;;9804:40:7;;;;;;;;;;;;:49;9845:7;9804:49;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;9804:49:7;;;;9800:120;;;9880:25;;-1:-1:-1;;;9880:25:7;;;;;;;;;;;9800:120;9635:3;;;;:::i;:::-;;;;9586:344;;14639:184;14746:12;;;14705;14746;;;;;;;;;-1:-1:-1;;;;;14723:7:7;;;14738:6;;14723:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14704:55;;;14774:7;14769:47;;14790:26;;-1:-1:-1;;;14790:26:7;;;;;;;;;;;14506:127;14588:38;-1:-1:-1;;;;;14588:26:7;;14615:2;14619:6;14588:26;:38::i;8879:147:6:-;8942:7;8972:1;8968;:5;:51;;9100:13;9191:15;;;9226:4;9219:15;;;9272:4;9256:21;;8968:51;;;9100:13;9191:15;;;9226:4;9219:15;;;9272:4;9256:21;;8976:20;8961:58;8879:147;-1:-1:-1;;;8879:147:6:o;3747:706:3:-;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;-1:-1:-1;;;;;4192:27:3;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:3;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;-1:-1:-1;;;4351:85:3;;29355:2:15;4351:85:3;;;29337:21:15;29394:2;29374:18;;;29367:30;29433:34;29413:18;;;29406:62;-1:-1:-1;;;29484:18:15;;;29477:40;29534:19;;4351:85:3;29153:406:15;763:205:3;902:58;;-1:-1:-1;;;;;29756:32:15;;902:58:3;;;29738:51:15;29805:18;;;29798:34;;;875:86:3;;895:5;;-1:-1:-1;;;925:23:3;29711:18:15;;902:58:3;29564:274:15;3873:223:4;4006:12;4037:52;4059:6;4067:4;4073:1;4076:12;4037:21;:52::i;:::-;4030:59;3873:223;-1:-1:-1;;;;3873:223:4:o;4960:446::-;5125:12;5182:5;5157:21;:30;;5149:81;;;;-1:-1:-1;;;5149:81:4;;30045:2:15;5149:81:4;;;30027:21:15;30084:2;30064:18;;;30057:30;30123:34;30103:18;;;30096:62;-1:-1:-1;;;30174:18:15;;;30167:36;30220:19;;5149:81:4;29843:402:15;5149:81:4;5241:12;5255:23;5282:6;-1:-1:-1;;;;;5282:11:4;5301:5;5308:4;5282:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5240:73;;;;5330:69;5357:6;5365:7;5374:10;5386:12;5330:26;:69::i;:::-;5323:76;4960:446;-1:-1:-1;;;;;;;4960:446:4:o;7466:628::-;7646:12;7674:7;7670:418;;;7701:10;:17;7722:1;7701:22;7697:286;;-1:-1:-1;;;;;1465:19:4;;;7908:60;;;;-1:-1:-1;;;7908:60:4;;30452:2:15;7908:60:4;;;30434:21:15;30491:2;30471:18;;;30464:30;30530:31;30510:18;;;30503:59;30579:18;;7908:60:4;30250:353:15;7908:60:4;-1:-1:-1;8003:10:4;7996:17;;7670:418;8044:33;8052:10;8064:12;8775:17;;:21;8771:379;;9003:10;8997:17;9059:15;9046:10;9042:2;9038:19;9031:44;8771:379;9126:12;9119:20;;-1:-1:-1;;;9119:20:4;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:250:15;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:15;238:16;;231:27;14:250::o;269:271::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;522:2;501:15;-1:-1:-1;;497:29:15;488:39;;;;529:4;484:50;;269:271;-1:-1:-1;;269:271:15:o;545:220::-;694:2;683:9;676:21;657:4;714:45;755:2;744:9;740:18;732:6;714:45;:::i;770:173::-;838:20;;-1:-1:-1;;;;;887:31:15;;877:42;;867:70;;933:1;930;923:12;867:70;770:173;;;:::o;948:118::-;1034:5;1027:13;1020:21;1013:5;1010:32;1000:60;;1056:1;1053;1046:12;1071:315;1136:6;1144;1197:2;1185:9;1176:7;1172:23;1168:32;1165:52;;;1213:1;1210;1203:12;1165:52;1236:29;1255:9;1236:29;:::i;:::-;1226:39;;1315:2;1304:9;1300:18;1287:32;1328:28;1350:5;1328:28;:::i;:::-;1375:5;1365:15;;;1071:315;;;;;:::o;1391:254::-;1459:6;1467;1520:2;1508:9;1499:7;1495:23;1491:32;1488:52;;;1536:1;1533;1526:12;1488:52;1559:29;1578:9;1559:29;:::i;:::-;1549:39;1635:2;1620:18;;;;1607:32;;-1:-1:-1;;;1391:254:15:o;1832:364::-;1892:8;1902:6;1956:3;1949:4;1941:6;1937:17;1933:27;1923:55;;1974:1;1971;1964:12;1923:55;-1:-1:-1;1997:20:15;;-1:-1:-1;;;;;2029:30:15;;2026:50;;;2072:1;2069;2062:12;2026:50;2109:4;2101:6;2097:17;2085:29;;2169:3;2162:4;2152:6;2149:1;2145:14;2137:6;2133:27;2129:38;2126:47;2123:67;;;2186:1;2183;2176:12;2123:67;1832:364;;;;;:::o;2201:573::-;2302:6;2310;2318;2326;2379:2;2367:9;2358:7;2354:23;2350:32;2347:52;;;2395:1;2392;2385:12;2347:52;2418:29;2437:9;2418:29;:::i;:::-;2408:39;;2494:2;2483:9;2479:18;2466:32;2456:42;;2549:2;2538:9;2534:18;2521:32;-1:-1:-1;;;;;2568:6:15;2565:30;2562:50;;;2608:1;2605;2598:12;2562:50;2647:67;2706:7;2697:6;2686:9;2682:22;2647:67;:::i;:::-;2201:573;;;;-1:-1:-1;2733:8:15;-1:-1:-1;;;;2201:573:15:o;2779:186::-;2838:6;2891:2;2879:9;2870:7;2866:23;2862:32;2859:52;;;2907:1;2904;2897:12;2859:52;2930:29;2949:9;2930:29;:::i;3533:180::-;3592:6;3645:2;3633:9;3624:7;3620:23;3616:32;3613:52;;;3661:1;3658;3651:12;3613:52;-1:-1:-1;3684:23:15;;3533:180;-1:-1:-1;3533:180:15:o;4012:435::-;4065:3;4103:5;4097:12;4130:6;4125:3;4118:19;4156:4;4185:2;4180:3;4176:12;4169:19;;4222:2;4215:5;4211:14;4243:1;4253:169;4267:6;4264:1;4261:13;4253:169;;;4328:13;;4316:26;;4362:12;;;;4397:15;;;;4289:1;4282:9;4253:169;;;-1:-1:-1;4438:3:15;;4012:435;-1:-1:-1;;;;;4012:435:15:o;4452:127::-;4513:10;4508:3;4504:20;4501:1;4494:31;4544:4;4541:1;4534:15;4568:4;4565:1;4558:15;4584:142;4667:1;4660:5;4657:12;4647:46;;4673:18;;:::i;:::-;4702;;4584:142::o;4731:138::-;4810:1;4803:5;4800:12;4790:46;;4816:18;;:::i;4874:1448::-;4924:3;4952:6;4993:5;4987:12;5020:2;5015:3;5008:15;5044:45;5085:2;5080:3;5076:12;5062;5044:45;:::i;:::-;5032:57;;;5137:4;5130:5;5126:16;5120:23;5185:3;5179:4;5175:14;5168:4;5163:3;5159:14;5152:38;5213:39;5247:4;5231:14;5213:39;:::i;:::-;5199:53;;;5300:4;5293:5;5289:16;5283:23;5315:50;5359:4;5354:3;5350:14;5334;-1:-1:-1;;;;;3969:31:15;3957:44;;3903:104;5315:50;;5414:4;5407:5;5403:16;5397:23;5390:4;5385:3;5381:14;5374:47;5469:4;5462:5;5458:16;5452:23;5484:50;5528:4;5523:3;5519:14;5503;-1:-1:-1;;;;;3969:31:15;3957:44;;3903:104;5484:50;;5583:4;5576:5;5572:16;5566:23;5559:4;5554:3;5550:14;5543:47;5638:4;5631:5;5627:16;5621:23;5688:3;5680:6;5676:16;5669:4;5664:3;5660:14;5653:40;5716:52;5761:6;5745:14;5716:52;:::i;:::-;5702:66;;;5817:4;5810:5;5806:16;5800:23;5793:4;5788:3;5784:14;5777:47;5843:6;5897:2;5890:5;5886:14;5880:21;5943:3;5935:6;5931:16;5926:2;5921:3;5917:12;5910:38;5971:41;6005:6;5989:14;5971:41;:::i;:::-;5957:55;;;;6031:6;6085:2;6078:5;6074:14;6068:21;6098:57;6151:2;6146:3;6142:12;6126:14;6098:57;:::i;:::-;;;6174:6;6228:2;6221:5;6217:14;6211:21;6241:53;6290:2;6285:3;6281:12;6265:14;6241:53;:::i;:::-;-1:-1:-1;6310:6:15;;4874:1448;-1:-1:-1;;;;4874:1448:15:o;6327:258::-;6506:2;6495:9;6488:21;6469:4;6526:53;6575:2;6564:9;6560:18;6552:6;6526:53;:::i;6590:434::-;6676:6;6684;6737:2;6725:9;6716:7;6712:23;6708:32;6705:52;;;6753:1;6750;6743:12;6705:52;6793:9;6780:23;-1:-1:-1;;;;;6818:6:15;6815:30;6812:50;;;6858:1;6855;6848:12;6812:50;6897:67;6956:7;6947:6;6936:9;6932:22;6897:67;:::i;:::-;6983:8;;6871:93;;-1:-1:-1;6590:434:15;-1:-1:-1;;;;6590:434:15:o;7029:148::-;7102:20;;7151:1;7141:12;;7131:40;;7167:1;7164;7157:12;7182:164;7251:5;7296:2;7287:6;7282:3;7278:16;7274:25;7271:45;;;7312:1;7309;7302:12;7271:45;-1:-1:-1;7334:6:15;7182:164;-1:-1:-1;7182:164:15:o;7351:751::-;7503:6;7511;7519;7572:2;7560:9;7551:7;7547:23;7543:32;7540:52;;;7588:1;7585;7578:12;7540:52;7628:9;7615:23;-1:-1:-1;;;;;7698:2:15;7690:6;7687:14;7684:34;;;7714:1;7711;7704:12;7684:34;7737:22;;;;7793:3;7775:16;;;7771:26;7768:46;;;7810:1;7807;7800:12;7768:46;7833:2;7823:12;;7854:43;7893:2;7882:9;7878:18;7854:43;:::i;:::-;7844:53;;7950:2;7939:9;7935:18;7922:32;7906:48;;7979:2;7969:8;7966:16;7963:36;;;7995:1;7992;7985:12;7963:36;;8018:78;8088:7;8077:8;8066:9;8062:24;8018:78;:::i;:::-;8008:88;;;7351:751;;;;;:::o;8315:260::-;8383:6;8391;8444:2;8432:9;8423:7;8419:23;8415:32;8412:52;;;8460:1;8457;8450:12;8412:52;8483:29;8502:9;8483:29;:::i;:::-;8473:39;;8531:38;8565:2;8554:9;8550:18;8531:38;:::i;:::-;8521:48;;8315:260;;;;;:::o;8580:316::-;8657:6;8665;8673;8726:2;8714:9;8705:7;8701:23;8697:32;8694:52;;;8742:1;8739;8732:12;8694:52;-1:-1:-1;;8765:23:15;;;8835:2;8820:18;;8807:32;;-1:-1:-1;8886:2:15;8871:18;;;8858:32;;8580:316;-1:-1:-1;8580:316:15:o;8901:269::-;8958:6;9011:2;8999:9;8990:7;8986:23;8982:32;8979:52;;;9027:1;9024;9017:12;8979:52;9066:9;9053:23;9116:4;9109:5;9105:16;9098:5;9095:27;9085:55;;9136:1;9133;9126:12;9611:277;9691:6;9699;9752:2;9740:9;9731:7;9727:23;9723:32;9720:52;;;9768:1;9765;9758:12;9720:52;9791:29;9810:9;9791:29;:::i;:::-;9781:39;;9839:43;9878:2;9867:9;9863:18;9839:43;:::i;9893:1058::-;10099:6;10107;10115;10123;10131;10184:2;10172:9;10163:7;10159:23;10155:32;10152:52;;;10200:1;10197;10190:12;10152:52;10240:9;10227:23;-1:-1:-1;;;;;10310:2:15;10302:6;10299:14;10296:34;;;10326:1;10323;10316:12;10296:34;10365:67;10424:7;10415:6;10404:9;10400:22;10365:67;:::i;:::-;10451:8;;-1:-1:-1;10339:93:15;-1:-1:-1;10539:2:15;10524:18;;10511:32;;-1:-1:-1;10555:16:15;;;10552:36;;;10584:1;10581;10574:12;10552:36;10623:69;10684:7;10673:8;10662:9;10658:24;10623:69;:::i;:::-;10711:8;;-1:-1:-1;10597:95:15;-1:-1:-1;10799:2:15;10784:18;;10771:32;;-1:-1:-1;10815:16:15;;;10812:36;;;10844:1;10841;10834:12;10812:36;;10867:78;10937:7;10926:8;10915:9;10911:24;10867:78;:::i;:::-;10857:88;;;9893:1058;;;;;;;;:::o;10956:970::-;11098:6;11106;11114;11122;11130;11138;11182:9;11173:7;11169:23;11212:3;11208:2;11204:12;11201:32;;;11229:1;11226;11219:12;11201:32;11265:9;11252:23;11242:33;;11322:2;11311:9;11307:18;11294:32;11284:42;;11345:38;11379:2;11368:9;11364:18;11345:38;:::i;:::-;11335:48;;11434:2;11423:9;11419:18;11406:32;-1:-1:-1;;;;;11498:2:15;11490:6;11487:14;11484:34;;;11514:1;11511;11504:12;11484:34;11552:6;11541:9;11537:22;11527:32;;11597:7;11590:4;11586:2;11582:13;11578:27;11568:55;;11619:1;11616;11609:12;11568:55;11659:2;11646:16;11685:2;11677:6;11674:14;11671:34;;;11701:1;11698;11691:12;11671:34;11746:7;11741:2;11732:6;11728:2;11724:15;11720:24;11717:37;11714:57;;;11767:1;11764;11757:12;11714:57;11798:2;11790:11;;;;;-1:-1:-1;11820:6:15;;-1:-1:-1;;11861:3:15;-1:-1:-1;;11842:17:15;;11838:27;11835:47;;;11878:1;11875;11868:12;11835:47;;11916:3;11905:9;11901:19;11891:29;;10956:970;;;;;;;;:::o;11931:356::-;12133:2;12115:21;;;12152:18;;;12145:30;12211:34;12206:2;12191:18;;12184:62;12278:2;12263:18;;11931:356::o;12292:380::-;12371:1;12367:12;;;;12414;;;12435:61;;12489:4;12481:6;12477:17;12467:27;;12435:61;12542:2;12534:6;12531:14;12511:18;12508:38;12505:161;;12588:10;12583:3;12579:20;12576:1;12569:31;12623:4;12620:1;12613:15;12651:4;12648:1;12641:15;12677:127;12738:10;12733:3;12729:20;12726:1;12719:31;12769:4;12766:1;12759:15;12793:4;12790:1;12783:15;12809:127;12870:10;12865:3;12861:20;12858:1;12851:31;12901:4;12898:1;12891:15;12925:4;12922:1;12915:15;12941:135;12980:3;13001:17;;;12998:43;;13021:18;;:::i;:::-;-1:-1:-1;13068:1:15;13057:13;;12941:135::o;13081:127::-;13142:10;13137:3;13133:20;13130:1;13123:31;13173:4;13170:1;13163:15;13197:4;13194:1;13187:15;13213:257;13285:4;13279:11;;;13317:17;;-1:-1:-1;;;;;13349:34:15;;13385:22;;;13346:62;13343:88;;;13411:18;;:::i;:::-;13447:4;13440:24;13213:257;:::o;13475:275::-;13546:2;13540:9;13611:2;13592:13;;-1:-1:-1;;13588:27:15;13576:40;;-1:-1:-1;;;;;13631:34:15;;13667:22;;;13628:62;13625:88;;;13693:18;;:::i;:::-;13729:2;13722:22;13475:275;;-1:-1:-1;13475:275:15:o;13755:1141::-;13875:9;13934:4;13926:5;13910:14;13906:26;13902:37;13899:57;;;13952:1;13949;13942:12;13899:57;13980:22;;:::i;:::-;14040:5;14027:19;14018:7;14011:36;14066:2;14115;14108:5;14104:14;14091:28;-1:-1:-1;;;;;14179:2:15;14171:6;14168:14;14165:34;;;14195:1;14192;14185:12;14165:34;14218:18;;;;14274:14;14267:4;14259:13;;14255:34;14245:62;;14303:1;14300;14293:12;14245:62;14339:2;14326:16;14361:2;14357;14354:10;14351:36;;;14367:18;;:::i;:::-;14413:2;14410:1;14406:10;14396:20;;14436:28;14460:2;14456;14452:11;14436:28;:::i;:::-;14498:15;;;14568:11;;;14564:20;;;14529:12;;;;14607:14;14596:26;;14593:46;;;14635:1;14632;14625:12;14593:46;14659:11;;;;14679:142;14695:6;14690:3;14687:15;14679:142;;;14761:17;;14749:30;;14712:12;;;;14799;;;;14679:142;;;14837:16;;;14830:31;;;;-1:-1:-1;14841:7:15;;13755:1141;-1:-1:-1;;;;;13755:1141:15:o;15200:125::-;15265:9;;;15286:10;;;15283:36;;;15299:18;;:::i;15456:772::-;15506:3;15547:5;15541:12;15576:36;15602:9;15576:36;:::i;:::-;15621:19;;;15659:4;15682:1;15699:18;;;15726:146;;;;15886:1;15881:341;;;;15692:530;;15726:146;-1:-1:-1;;15768:24:15;;15754:12;;;15747:46;15840:14;;15833:22;15830:1;15826:30;15817:40;;15813:49;;;-1:-1:-1;15726:146:15;;15881:341;15912:5;15909:1;15902:16;15959:2;15956:1;15946:16;15984:1;15998:174;16012:6;16009:1;16006:13;15998:174;;;16099:14;;16081:11;;;16077:20;;16070:44;16142:16;;;;16027:10;;15998:174;;;16196:11;;16192:20;;;-1:-1:-1;;15692:530:15;;;;;;15456:772;;;;:::o;16376:469::-;16437:3;16475:5;16469:12;16502:6;16497:3;16490:19;16528:4;16557:2;16552:3;16548:12;16541:19;;16579:5;16576:1;16569:16;16621:2;16618:1;16608:16;16642:1;16652:168;16666:6;16663:1;16660:13;16652:168;;;16727:13;;16715:26;;16761:12;;;;16808:1;16796:14;;;;16681:9;16652:168;;16850:1614;17058:6;17047:9;17040:25;17101:2;17096;17085:9;17081:18;17074:30;17021:4;17123:6;17165:2;17160;17149:9;17145:18;17138:30;17191:54;17240:3;17229:9;17225:19;17217:6;17191:54;:::i;:::-;17268:2;17264:7;17335:2;17323:9;17315:6;17311:22;17307:31;17302:2;17291:9;17287:18;17280:59;17362:52;17407:6;17400:4;17392:6;17388:17;17362:52;:::i;:::-;17348:66;;17443:68;17504:4;17496:6;17492:17;17486:24;-1:-1:-1;;;;;16329:36:15;;16233:138;17443:68;-1:-1:-1;;;;;3969:31:15;;;17568:3;17553:19;;3957:44;17628:4;17616:17;;17610:24;17604:3;17589:19;;17582:53;17727:4;17715:17;;17709:24;16329:36;17793:3;17778:19;;3957:44;17853:4;17841:17;;17835:24;17829:3;17814:19;;17807:53;17901:22;;;17897:31;;17891:3;17876:19;;17869:60;17952:63;17905:6;18001:4;17989:17;;17952:63;:::i;:::-;17938:77;;18070:4;18062:6;18058:17;18052:24;18046:3;18035:9;18031:19;18024:53;18142:2;18130:9;18122:6;18118:22;18114:31;18108:3;18097:9;18093:19;18086:60;;18169:52;18214:6;18207:4;18199:6;18195:17;18169:52;:::i;:::-;18155:66;;18265:4;18257:6;18253:17;18247:24;18280:69;18345:2;18334:9;18330:18;18323:4;18312:9;18308:20;18280:69;:::i;:::-;18358:77;18430:3;18419:9;18415:19;18408:4;18396:9;18390:4;18386:20;18382:31;18358:77;:::i;:::-;-1:-1:-1;18452:6:15;16850:1614;-1:-1:-1;;;;;16850:1614:15:o;18469:325::-;18562:4;18620:11;18607:25;18714:3;18710:8;18699;18683:14;18679:29;18675:44;18655:18;18651:69;18641:97;;18734:1;18731;18724:12;18641:97;18755:33;;;;;18469:325;-1:-1:-1;;18469:325:15:o;18799:203::-;18870:6;18923:2;18911:9;18902:7;18898:23;18894:32;18891:52;;;18939:1;18936;18929:12;18891:52;18962:34;18986:9;18962:34;:::i;19414:271::-;19597:6;19589;19584:3;19571:33;19553:3;19623:16;;19648:13;;;19623:16;19414:271;-1:-1:-1;19414:271:15:o;20184:545::-;20286:2;20281:3;20278:11;20275:448;;;20322:1;20347:5;20343:2;20336:17;20392:4;20388:2;20378:19;20462:2;20450:10;20446:19;20443:1;20439:27;20433:4;20429:38;20498:4;20486:10;20483:20;20480:47;;;-1:-1:-1;20521:4:15;20480:47;20576:2;20571:3;20567:12;20564:1;20560:20;20554:4;20550:31;20540:41;;20631:82;20649:2;20642:5;20639:13;20631:82;;;20694:17;;;20675:1;20664:13;20631:82;;20905:1206;-1:-1:-1;;;;;21024:3:15;21021:27;21018:53;;;21051:18;;:::i;:::-;21080:94;21170:3;21130:38;21162:4;21156:11;21130:38;:::i;:::-;21124:4;21080:94;:::i;:::-;21200:1;21225:2;21220:3;21217:11;21242:1;21237:616;;;;21897:1;21914:3;21911:93;;;-1:-1:-1;21970:19:15;;;21957:33;21911:93;-1:-1:-1;;20862:1:15;20858:11;;;20854:24;20850:29;20840:40;20886:1;20882:11;;;20837:57;22017:78;;21210:895;;21237:616;15403:1;15396:14;;;15440:4;15427:18;;-1:-1:-1;;21273:17:15;;;21374:9;21396:229;21410:7;21407:1;21404:14;21396:229;;;21499:19;;;21486:33;21471:49;;21606:4;21591:20;;;;21559:1;21547:14;;;;21426:12;21396:229;;;21400:3;21653;21644:7;21641:16;21638:159;;;21777:1;21773:6;21767:3;21761;21758:1;21754:11;21750:21;21746:34;21742:39;21729:9;21724:3;21720:19;21707:33;21703:79;21695:6;21688:95;21638:159;;;21840:1;21834:3;21831:1;21827:11;21823:19;21817:4;21810:33;21210:895;;20905:1206;;;:::o;22116:241::-;22172:6;22225:2;22213:9;22204:7;22200:23;22196:32;22193:52;;;22241:1;22238;22231:12;22193:52;22280:9;22267:23;22299:28;22321:5;22299:28;:::i;22722:545::-;22815:4;22821:6;22881:11;22868:25;22975:2;22971:7;22960:8;22944:14;22940:29;22936:43;22916:18;22912:68;22902:96;;22994:1;22991;22984:12;22902:96;23021:33;;23073:20;;;-1:-1:-1;;;;;;23105:30:15;;23102:50;;;23148:1;23145;23138:12;23102:50;23181:4;23169:17;;-1:-1:-1;23232:1:15;23228:14;;;23212;23208:35;23198:46;;23195:66;;;23257:1;23254;23247:12;23822:522;23900:4;23906:6;23966:11;23953:25;24060:2;24056:7;24045:8;24029:14;24025:29;24021:43;24001:18;23997:68;23987:96;;24079:1;24076;24069:12;23987:96;24106:33;;24158:20;;;-1:-1:-1;;;;;;24190:30:15;;24187:50;;;24233:1;24230;24223:12;24187:50;24266:4;24254:17;;-1:-1:-1;24297:14:15;24293:27;;;24283:38;;24280:58;;;24334:1;24331;24324:12;24349:1352;24475:3;24469:10;-1:-1:-1;;;;;24494:6:15;24491:30;24488:56;;;24524:18;;:::i;:::-;24553:97;24643:6;24603:38;24635:4;24629:11;24603:38;:::i;:::-;24597:4;24553:97;:::i;:::-;24705:4;;24769:2;24758:14;;24786:1;24781:663;;;;25488:1;25505:6;25502:89;;;-1:-1:-1;25557:19:15;;;25551:26;25502:89;-1:-1:-1;;20862:1:15;20858:11;;;20854:24;20850:29;20840:40;20886:1;20882:11;;;20837:57;25604:81;;24751:944;;24781:663;15403:1;15396:14;;;15440:4;15427:18;;-1:-1:-1;;24817:20:15;;;24935:236;24949:7;24946:1;24943:14;24935:236;;;25038:19;;;25032:26;25017:42;;25130:27;;;;25098:1;25086:14;;;;24965:19;;24935:236;;;24939:3;25199:6;25190:7;25187:19;25184:201;;;25260:19;;;25254:26;-1:-1:-1;;25343:1:15;25339:14;;;25355:3;25335:24;25331:37;25327:42;25312:58;25297:74;;25184:201;-1:-1:-1;;;;;25431:1:15;25415:14;;;25411:22;25398:36;;-1:-1:-1;24349:1352:15:o;25706:329::-;25913:6;25902:9;25895:25;25956:2;25951;25940:9;25936:18;25929:30;25876:4;25976:53;26025:2;26014:9;26010:18;26002:6;25976:53;:::i;26040:184::-;26110:6;26163:2;26151:9;26142:7;26138:23;26134:32;26131:52;;;26179:1;26176;26169:12;26131:52;-1:-1:-1;26202:16:15;;26040:184;-1:-1:-1;26040:184:15:o;26229:175::-;26266:3;26310:4;26303:5;26299:16;26339:4;26330:7;26327:17;26324:43;;26347:18;;:::i;:::-;26396:1;26383:15;;26229:175;-1:-1:-1;;26229:175:15:o;27209:168::-;27282:9;;;27313;;27330:15;;;27324:22;;27310:37;27300:71;;27351:18;;:::i;27382:217::-;27422:1;27448;27438:132;;27492:10;27487:3;27483:20;27480:1;27473:31;27527:4;27524:1;27517:15;27555:4;27552:1;27545:15;27438:132;-1:-1:-1;27584:9:15;;27382:217::o;27604:128::-;27671:9;;;27692:11;;;27689:37;;;27706:18;;:::i;28611:287::-;28740:3;28778:6;28772:13;28794:66;28853:6;28848:3;28841:4;28833:6;28829:17;28794:66;:::i;28903:245::-;28970:6;29023:2;29011:9;29002:7;28998:23;28994:32;28991:52;;;29039:1;29036;29029:12;28991:52;29071:9;29065:16;29090:28;29112:5;29090:28;:::i
Swarm Source
ipfs://79f2c78e30208fd5bef3e152c9efb3f1904189df826eb4c91d9f6d42b55640a4
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.