Source Code
Overview
ETH Balance
10.012759 ETH
Token Holdings
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 25,949 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 7623571 | 132 days ago | IN | 0.000759 ETH | 0.00007481 | ||||
Keep | 7565444 | 140 days ago | IN | 0 ETH | 0.00036668 | ||||
Keep | 7565431 | 140 days ago | IN | 0 ETH | 0.0003844 | ||||
Keep | 7565366 | 140 days ago | IN | 0 ETH | 0.0005057 | ||||
Keep | 7565355 | 140 days ago | IN | 0 ETH | 0.00057669 | ||||
Keep | 7565338 | 140 days ago | IN | 0 ETH | 0.00064132 | ||||
Keep | 7565307 | 140 days ago | IN | 0 ETH | 0.00099142 | ||||
Release | 7553127 | 142 days ago | IN | 0 ETH | 0.00164663 | ||||
Release | 7553127 | 142 days ago | IN | 0 ETH | 0.00164663 | ||||
Keep | 7553113 | 142 days ago | IN | 0 ETH | 0.02078989 | ||||
Keep | 7553086 | 142 days ago | IN | 0 ETH | 0.02350105 | ||||
Keep | 7552913 | 142 days ago | IN | 0 ETH | 0.04086656 | ||||
Keep | 7552817 | 142 days ago | IN | 0 ETH | 0.03100493 | ||||
Keep | 7552759 | 142 days ago | IN | 0 ETH | 0.02580397 | ||||
Keep | 7552681 | 142 days ago | IN | 0 ETH | 0.02171694 | ||||
Keep | 7552661 | 142 days ago | IN | 0 ETH | 0.02087761 | ||||
Keep | 7552570 | 142 days ago | IN | 0 ETH | 0.0158101 | ||||
Release | 7546934 | 143 days ago | IN | 0 ETH | 0.00094361 | ||||
Release | 7546934 | 143 days ago | IN | 0 ETH | 0.0091858 | ||||
Release | 7546626 | 143 days ago | IN | 0 ETH | 0.00079598 | ||||
Release | 7546626 | 143 days ago | IN | 0 ETH | 0.00805945 | ||||
Release | 7545952 | 143 days ago | IN | 0 ETH | 0.00076705 | ||||
Release | 7545952 | 143 days ago | IN | 0 ETH | 0.00785776 | ||||
Release | 7545923 | 143 days ago | IN | 0 ETH | 0.00056773 | ||||
Release | 7545923 | 143 days ago | IN | 0 ETH | 0.00056773 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Transfer | 7453450 | 156 days ago | 10 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
CagaKeeper
Compiler Version
v0.8.25+commit.b61c2a91
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-04-05 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) pragma solidity ^0.8.20; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.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); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // File: CagaKeeper.sol pragma solidity ^0.8.20; contract CagaKeeper is AccessControl { bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); event Keeped( address indexed userWallet, address indexed sourceContract, uint256 amount, string _name, string _ticker, uint8 _decimals ); event Released ( address indexed userWallet, address indexed sourceContract, uint256 amount ); mapping (address => uint256) public keeped; //contract / balance constructor() { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(OPERATOR_ROLE, msg.sender); _grantRole(OPERATOR_ROLE, 0x4150E51980114468AA8309bB72f027d8BfF41353); _grantRole(OPERATOR_ROLE, 0xDD0f61e0E8bd130610d3f73084A0d8FC22fDB336); _grantRole(OPERATOR_ROLE, 0xA69F73E78715A31Ae7F2E13710100D7Cdd9570c0); } receive() external payable {} fallback() external payable {} function keep(address _sourceContract, address _forWallet, uint256 _value) public payable { if (_sourceContract == 0x00000000000000000000000000000000000000ff) { require(msg.value >= _value, "send proper value"); (bool successCaga,) = payable(address(this)).call{value: msg.value}(""); require(successCaga, "Unable to transfer CAGA"); keeped[_sourceContract] += _value; emit Keeped( _forWallet, _sourceContract, _value, "", "", 18); } else { require(msg.sender == _forWallet || hasRole(OPERATOR_ROLE, msg.sender), "must be user or owner"); ERC20 erc20 = ERC20(_sourceContract); bool succeed = erc20.transferFrom(msg.sender, address(this), _value); require(succeed, "cannot keep erc20"); keeped[_sourceContract] += _value; emit Keeped( _forWallet, _sourceContract, _value, erc20.name(), erc20.symbol(), erc20.decimals()); } } function release(address _userWallet, address _sourceContract, uint256 _releaseBalance) public payable onlyRole(OPERATOR_ROLE) { if (_sourceContract == 0x00000000000000000000000000000000000000ff) { require(_releaseBalance <= keeped[_sourceContract], "cannot release this amount"); payable(_userWallet).transfer(_releaseBalance); keeped[_sourceContract] -= _releaseBalance; emit Released(_userWallet, _sourceContract, _releaseBalance); } else { require(_releaseBalance <= keeped[_sourceContract], "cannot release this amount"); ERC20 erc20 = ERC20(_sourceContract); bool succeed = erc20.transfer(_userWallet, _releaseBalance); require(succeed, "cannot release erc20"); keeped[_sourceContract] -= _releaseBalance; emit Released(_userWallet, _sourceContract, _releaseBalance); } } }
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userWallet","type":"address"},{"indexed":true,"internalType":"address","name":"sourceContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"},{"indexed":false,"internalType":"string","name":"_ticker","type":"string"},{"indexed":false,"internalType":"uint8","name":"_decimals","type":"uint8"}],"name":"Keeped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userWallet","type":"address"},{"indexed":true,"internalType":"address","name":"sourceContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sourceContract","type":"address"},{"internalType":"address","name":"_forWallet","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"keep","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"keeped","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userWallet","type":"address"},{"internalType":"address","name":"_sourceContract","type":"address"},{"internalType":"uint256","name":"_releaseBalance","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561000f575f80fd5b506100225f801b3361012860201b60201c565b506100537f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9293361012860201b60201c565b506100987f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929734150e51980114468aa8309bb72f027d8bff4135361012860201b60201c565b506100dd7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92973dd0f61e0e8bd130610d3f73084a0d8fc22fdb33661012860201b60201c565b506101227f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92973a69f73e78715a31ae7f2e13710100d7cdd9570c061012860201b60201c565b50610287565b5f610139838361021d60201b60201c565b6102135760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506101b061028060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050610217565b5f90505b92915050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b611acc806102945f395ff3fe60806040526004361061009f575f3560e01c80635ddc1d97116100635780635ddc1d971461018c5780638bfb07c9146101c857806391d14854146101e4578063a217fddf14610220578063d547741f1461024a578063f5b541a614610272576100a6565b806301ffc9a7146100a8578063248a9ca3146100e45780632f2ff15d1461012057806336568abe146101485780635d7828ba14610170576100a6565b366100a657005b005b3480156100b3575f80fd5b506100ce60048036038101906100c991906110d4565b61029c565b6040516100db9190611119565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190611165565b610315565b604051610117919061119f565b60405180910390f35b34801561012b575f80fd5b5061014660048036038101906101419190611212565b610331565b005b348015610153575f80fd5b5061016e60048036038101906101699190611212565b610353565b005b61018a60048036038101906101859190611283565b6103ce565b005b348015610197575f80fd5b506101b260048036038101906101ad91906112d3565b610921565b6040516101bf919061130d565b60405180910390f35b6101e260048036038101906101dd9190611283565b610936565b005b3480156101ef575f80fd5b5061020a60048036038101906102059190611212565b610d18565b6040516102179190611119565b60405180910390f35b34801561022b575f80fd5b50610234610d7b565b604051610241919061119f565b60405180910390f35b348015610255575f80fd5b50610270600480360381019061026b9190611212565b610d81565b005b34801561027d575f80fd5b50610286610da3565b604051610293919061119f565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061030e575061030d82610dc7565b5b9050919050565b5f805f8381526020019081526020015f20600101549050919050565b61033a82610315565b61034381610e30565b61034d8383610e44565b50505050565b61035b610f2d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146103bf576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103c98282610f34565b505050565b60ff73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105ae5780341015610445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043c90611380565b60405180910390fd5b5f3073ffffffffffffffffffffffffffffffffffffffff163460405161046a906113cb565b5f6040518083038185875af1925050503d805f81146104a4576040519150601f19603f3d011682016040523d82523d5f602084013e6104a9565b606091505b50509050806104ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e490611429565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105399190611474565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f81b9bac85408f04722ced18aff599f470b05ece4894c7a619d1f6c288f6f5efb8460126040516105a0929190611515565b60405180910390a35061091c565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061060e575061060d7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92933610d18565b5b61064d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610644906115ac565b60405180910390fd5b5f8390505f8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b815260040161068f939291906115d9565b6020604051808303815f875af11580156106ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106cf9190611638565b905080610711576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610708906116ad565b60405180910390fd5b8260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461075d9190611474565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f81b9bac85408f04722ced18aff599f470b05ece4894c7a619d1f6c288f6f5efb858573ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa1580156107fc573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906108249190611807565b8673ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561086c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906108949190611807565b8773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109019190611878565b60405161091194939291906118f4565b60405180910390a350505b505050565b6001602052805f5260405f205f915090505481565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961096081610e30565b60ff73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b155760015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054821115610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b9061198f565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f19350505050158015610a57573d5f803e3d5ffd5b508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610aa491906119ad565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f5284604051610b08919061130d565b60405180910390a3610d12565b60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054821115610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c9061198f565b60405180910390fd5b5f8390505f8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87866040518363ffffffff1660e01b8152600401610bd59291906119e0565b6020604051808303815f875af1158015610bf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c159190611638565b905080610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e90611a51565b60405180910390fd5b8360015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610ca391906119ad565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f5286604051610d07919061130d565b60405180910390a350505b50505050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f801b81565b610d8a82610315565b610d9381610e30565b610d9d8383610f34565b50505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610e4181610e3c610f2d565b61101d565b50565b5f610e4f8383610d18565b610f235760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610ec0610f2d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050610f27565b5f90505b92915050565b5f33905090565b5f610f3f8383610d18565b15611013575f805f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610fb0610f2d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050611017565b5f90505b92915050565b6110278282610d18565b61106a5780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401611061929190611a6f565b60405180910390fd5b5050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6110b38161107f565b81146110bd575f80fd5b50565b5f813590506110ce816110aa565b92915050565b5f602082840312156110e9576110e8611077565b5b5f6110f6848285016110c0565b91505092915050565b5f8115159050919050565b611113816110ff565b82525050565b5f60208201905061112c5f83018461110a565b92915050565b5f819050919050565b61114481611132565b811461114e575f80fd5b50565b5f8135905061115f8161113b565b92915050565b5f6020828403121561117a57611179611077565b5b5f61118784828501611151565b91505092915050565b61119981611132565b82525050565b5f6020820190506111b25f830184611190565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6111e1826111b8565b9050919050565b6111f1816111d7565b81146111fb575f80fd5b50565b5f8135905061120c816111e8565b92915050565b5f806040838503121561122857611227611077565b5b5f61123585828601611151565b9250506020611246858286016111fe565b9150509250929050565b5f819050919050565b61126281611250565b811461126c575f80fd5b50565b5f8135905061127d81611259565b92915050565b5f805f6060848603121561129a57611299611077565b5b5f6112a7868287016111fe565b93505060206112b8868287016111fe565b92505060406112c98682870161126f565b9150509250925092565b5f602082840312156112e8576112e7611077565b5b5f6112f5848285016111fe565b91505092915050565b61130781611250565b82525050565b5f6020820190506113205f8301846112fe565b92915050565b5f82825260208201905092915050565b7f73656e642070726f7065722076616c75650000000000000000000000000000005f82015250565b5f61136a601183611326565b915061137582611336565b602082019050919050565b5f6020820190508181035f8301526113978161135e565b9050919050565b5f81905092915050565b50565b5f6113b65f8361139e565b91506113c1826113a8565b5f82019050919050565b5f6113d5826113ab565b9150819050919050565b7f556e61626c6520746f207472616e7366657220434147410000000000000000005f82015250565b5f611413601783611326565b915061141e826113df565b602082019050919050565b5f6020820190508181035f83015261144081611407565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61147e82611250565b915061148983611250565b92508282019050808211156114a1576114a0611447565b5b92915050565b5f6114b25f83611326565b91506114bd826113a8565b5f82019050919050565b5f819050919050565b5f60ff82169050919050565b5f819050919050565b5f6114ff6114fa6114f5846114c7565b6114dc565b6114d0565b9050919050565b61150f816114e5565b82525050565b5f6080820190506115285f8301856112fe565b8181036020830152611539816114a7565b9050818103604083015261154c816114a7565b905061155b6060830184611506565b9392505050565b7f6d7573742062652075736572206f72206f776e657200000000000000000000005f82015250565b5f611596601583611326565b91506115a182611562565b602082019050919050565b5f6020820190508181035f8301526115c38161158a565b9050919050565b6115d3816111d7565b82525050565b5f6060820190506115ec5f8301866115ca565b6115f960208301856115ca565b61160660408301846112fe565b949350505050565b611617816110ff565b8114611621575f80fd5b50565b5f815190506116328161160e565b92915050565b5f6020828403121561164d5761164c611077565b5b5f61165a84828501611624565b91505092915050565b7f63616e6e6f74206b6565702065726332300000000000000000000000000000005f82015250565b5f611697601183611326565b91506116a282611663565b602082019050919050565b5f6020820190508181035f8301526116c48161168b565b9050919050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611719826116d3565b810181811067ffffffffffffffff82111715611738576117376116e3565b5b80604052505050565b5f61174a61106e565b90506117568282611710565b919050565b5f67ffffffffffffffff821115611775576117746116e3565b5b61177e826116d3565b9050602081019050919050565b8281835e5f83830152505050565b5f6117ab6117a68461175b565b611741565b9050828152602081018484840111156117c7576117c66116cf565b5b6117d284828561178b565b509392505050565b5f82601f8301126117ee576117ed6116cb565b5b81516117fe848260208601611799565b91505092915050565b5f6020828403121561181c5761181b611077565b5b5f82015167ffffffffffffffff8111156118395761183861107b565b5b611845848285016117da565b91505092915050565b611857816114d0565b8114611861575f80fd5b50565b5f815190506118728161184e565b92915050565b5f6020828403121561188d5761188c611077565b5b5f61189a84828501611864565b91505092915050565b5f81519050919050565b5f6118b7826118a3565b6118c18185611326565b93506118d181856020860161178b565b6118da816116d3565b840191505092915050565b6118ee816114d0565b82525050565b5f6080820190506119075f8301876112fe565b818103602083015261191981866118ad565b9050818103604083015261192d81856118ad565b905061193c60608301846118e5565b95945050505050565b7f63616e6e6f742072656c65617365207468697320616d6f756e740000000000005f82015250565b5f611979601a83611326565b915061198482611945565b602082019050919050565b5f6020820190508181035f8301526119a68161196d565b9050919050565b5f6119b782611250565b91506119c283611250565b92508282039050818111156119da576119d9611447565b5b92915050565b5f6040820190506119f35f8301856115ca565b611a0060208301846112fe565b9392505050565b7f63616e6e6f742072656c656173652065726332300000000000000000000000005f82015250565b5f611a3b601483611326565b9150611a4682611a07565b602082019050919050565b5f6020820190508181035f830152611a6881611a2f565b9050919050565b5f604082019050611a825f8301856115ca565b611a8f6020830184611190565b939250505056fea2646970667358221220f6c4e4105b82d32161cfbe2c3ae5d8980ddba49d6426b99962ae682022bb855864736f6c63430008190033
Deployed Bytecode
0x60806040526004361061009f575f3560e01c80635ddc1d97116100635780635ddc1d971461018c5780638bfb07c9146101c857806391d14854146101e4578063a217fddf14610220578063d547741f1461024a578063f5b541a614610272576100a6565b806301ffc9a7146100a8578063248a9ca3146100e45780632f2ff15d1461012057806336568abe146101485780635d7828ba14610170576100a6565b366100a657005b005b3480156100b3575f80fd5b506100ce60048036038101906100c991906110d4565b61029c565b6040516100db9190611119565b60405180910390f35b3480156100ef575f80fd5b5061010a60048036038101906101059190611165565b610315565b604051610117919061119f565b60405180910390f35b34801561012b575f80fd5b5061014660048036038101906101419190611212565b610331565b005b348015610153575f80fd5b5061016e60048036038101906101699190611212565b610353565b005b61018a60048036038101906101859190611283565b6103ce565b005b348015610197575f80fd5b506101b260048036038101906101ad91906112d3565b610921565b6040516101bf919061130d565b60405180910390f35b6101e260048036038101906101dd9190611283565b610936565b005b3480156101ef575f80fd5b5061020a60048036038101906102059190611212565b610d18565b6040516102179190611119565b60405180910390f35b34801561022b575f80fd5b50610234610d7b565b604051610241919061119f565b60405180910390f35b348015610255575f80fd5b50610270600480360381019061026b9190611212565b610d81565b005b34801561027d575f80fd5b50610286610da3565b604051610293919061119f565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061030e575061030d82610dc7565b5b9050919050565b5f805f8381526020019081526020015f20600101549050919050565b61033a82610315565b61034381610e30565b61034d8383610e44565b50505050565b61035b610f2d565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146103bf576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103c98282610f34565b505050565b60ff73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105ae5780341015610445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043c90611380565b60405180910390fd5b5f3073ffffffffffffffffffffffffffffffffffffffff163460405161046a906113cb565b5f6040518083038185875af1925050503d805f81146104a4576040519150601f19603f3d011682016040523d82523d5f602084013e6104a9565b606091505b50509050806104ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e490611429565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546105399190611474565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f81b9bac85408f04722ced18aff599f470b05ece4894c7a619d1f6c288f6f5efb8460126040516105a0929190611515565b60405180910390a35061091c565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061060e575061060d7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92933610d18565b5b61064d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610644906115ac565b60405180910390fd5b5f8390505f8173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b815260040161068f939291906115d9565b6020604051808303815f875af11580156106ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106cf9190611638565b905080610711576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610708906116ad565b60405180910390fd5b8260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461075d9190611474565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f81b9bac85408f04722ced18aff599f470b05ece4894c7a619d1f6c288f6f5efb858573ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa1580156107fc573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906108249190611807565b8673ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561086c573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906108949190611807565b8773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109019190611878565b60405161091194939291906118f4565b60405180910390a350505b505050565b6001602052805f5260405f205f915090505481565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961096081610e30565b60ff73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b155760015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054821115610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b9061198f565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f19350505050158015610a57573d5f803e3d5ffd5b508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610aa491906119ad565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f5284604051610b08919061130d565b60405180910390a3610d12565b60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054821115610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c9061198f565b60405180910390fd5b5f8390505f8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87866040518363ffffffff1660e01b8152600401610bd59291906119e0565b6020604051808303815f875af1158015610bf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c159190611638565b905080610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4e90611a51565b60405180910390fd5b8360015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610ca391906119ad565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f5286604051610d07919061130d565b60405180910390a350505b50505050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f801b81565b610d8a82610315565b610d9381610e30565b610d9d8383610f34565b50505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610e4181610e3c610f2d565b61101d565b50565b5f610e4f8383610d18565b610f235760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610ec0610f2d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050610f27565b5f90505b92915050565b5f33905090565b5f610f3f8383610d18565b15611013575f805f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610fb0610f2d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050611017565b5f90505b92915050565b6110278282610d18565b61106a5780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401611061929190611a6f565b60405180910390fd5b5050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6110b38161107f565b81146110bd575f80fd5b50565b5f813590506110ce816110aa565b92915050565b5f602082840312156110e9576110e8611077565b5b5f6110f6848285016110c0565b91505092915050565b5f8115159050919050565b611113816110ff565b82525050565b5f60208201905061112c5f83018461110a565b92915050565b5f819050919050565b61114481611132565b811461114e575f80fd5b50565b5f8135905061115f8161113b565b92915050565b5f6020828403121561117a57611179611077565b5b5f61118784828501611151565b91505092915050565b61119981611132565b82525050565b5f6020820190506111b25f830184611190565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6111e1826111b8565b9050919050565b6111f1816111d7565b81146111fb575f80fd5b50565b5f8135905061120c816111e8565b92915050565b5f806040838503121561122857611227611077565b5b5f61123585828601611151565b9250506020611246858286016111fe565b9150509250929050565b5f819050919050565b61126281611250565b811461126c575f80fd5b50565b5f8135905061127d81611259565b92915050565b5f805f6060848603121561129a57611299611077565b5b5f6112a7868287016111fe565b93505060206112b8868287016111fe565b92505060406112c98682870161126f565b9150509250925092565b5f602082840312156112e8576112e7611077565b5b5f6112f5848285016111fe565b91505092915050565b61130781611250565b82525050565b5f6020820190506113205f8301846112fe565b92915050565b5f82825260208201905092915050565b7f73656e642070726f7065722076616c75650000000000000000000000000000005f82015250565b5f61136a601183611326565b915061137582611336565b602082019050919050565b5f6020820190508181035f8301526113978161135e565b9050919050565b5f81905092915050565b50565b5f6113b65f8361139e565b91506113c1826113a8565b5f82019050919050565b5f6113d5826113ab565b9150819050919050565b7f556e61626c6520746f207472616e7366657220434147410000000000000000005f82015250565b5f611413601783611326565b915061141e826113df565b602082019050919050565b5f6020820190508181035f83015261144081611407565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61147e82611250565b915061148983611250565b92508282019050808211156114a1576114a0611447565b5b92915050565b5f6114b25f83611326565b91506114bd826113a8565b5f82019050919050565b5f819050919050565b5f60ff82169050919050565b5f819050919050565b5f6114ff6114fa6114f5846114c7565b6114dc565b6114d0565b9050919050565b61150f816114e5565b82525050565b5f6080820190506115285f8301856112fe565b8181036020830152611539816114a7565b9050818103604083015261154c816114a7565b905061155b6060830184611506565b9392505050565b7f6d7573742062652075736572206f72206f776e657200000000000000000000005f82015250565b5f611596601583611326565b91506115a182611562565b602082019050919050565b5f6020820190508181035f8301526115c38161158a565b9050919050565b6115d3816111d7565b82525050565b5f6060820190506115ec5f8301866115ca565b6115f960208301856115ca565b61160660408301846112fe565b949350505050565b611617816110ff565b8114611621575f80fd5b50565b5f815190506116328161160e565b92915050565b5f6020828403121561164d5761164c611077565b5b5f61165a84828501611624565b91505092915050565b7f63616e6e6f74206b6565702065726332300000000000000000000000000000005f82015250565b5f611697601183611326565b91506116a282611663565b602082019050919050565b5f6020820190508181035f8301526116c48161168b565b9050919050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611719826116d3565b810181811067ffffffffffffffff82111715611738576117376116e3565b5b80604052505050565b5f61174a61106e565b90506117568282611710565b919050565b5f67ffffffffffffffff821115611775576117746116e3565b5b61177e826116d3565b9050602081019050919050565b8281835e5f83830152505050565b5f6117ab6117a68461175b565b611741565b9050828152602081018484840111156117c7576117c66116cf565b5b6117d284828561178b565b509392505050565b5f82601f8301126117ee576117ed6116cb565b5b81516117fe848260208601611799565b91505092915050565b5f6020828403121561181c5761181b611077565b5b5f82015167ffffffffffffffff8111156118395761183861107b565b5b611845848285016117da565b91505092915050565b611857816114d0565b8114611861575f80fd5b50565b5f815190506118728161184e565b92915050565b5f6020828403121561188d5761188c611077565b5b5f61189a84828501611864565b91505092915050565b5f81519050919050565b5f6118b7826118a3565b6118c18185611326565b93506118d181856020860161178b565b6118da816116d3565b840191505092915050565b6118ee816114d0565b82525050565b5f6080820190506119075f8301876112fe565b818103602083015261191981866118ad565b9050818103604083015261192d81856118ad565b905061193c60608301846118e5565b95945050505050565b7f63616e6e6f742072656c65617365207468697320616d6f756e740000000000005f82015250565b5f611979601a83611326565b915061198482611945565b602082019050919050565b5f6020820190508181035f8301526119a68161196d565b9050919050565b5f6119b782611250565b91506119c283611250565b92508282039050818111156119da576119d9611447565b5b92915050565b5f6040820190506119f35f8301856115ca565b611a0060208301846112fe565b9392505050565b7f63616e6e6f742072656c656173652065726332300000000000000000000000005f82015250565b5f611a3b601483611326565b9150611a4682611a07565b602082019050919050565b5f6020820190508181035f830152611a6881611a2f565b9050919050565b5f604082019050611a825f8301856115ca565b611a8f6020830184611190565b939250505056fea2646970667358221220f6c4e4105b82d32161cfbe2c3ae5d8980ddba49d6426b99962ae682022bb855864736f6c63430008190033
Deployed Bytecode Sourcemap
30192:3116:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8784:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10064:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10496:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11633:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31156:1202;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30644:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32366:939;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9080:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8392:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10927:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30236:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8784:204;8869:4;8908:32;8893:47;;;:11;:47;;;;:87;;;;8944:36;8968:11;8944:23;:36::i;:::-;8893:87;8886:94;;8784:204;;;:::o;10064:122::-;10129:7;10156:6;:12;10163:4;10156:12;;;;;;;;;;;:22;;;10149:29;;10064:122;;;:::o;10496:138::-;10570:18;10583:4;10570:12;:18::i;:::-;8676:16;8687:4;8676:10;:16::i;:::-;10601:25:::1;10612:4;10618:7;10601:10;:25::i;:::-;;10496:138:::0;;;:::o;11633:251::-;11749:12;:10;:12::i;:::-;11727:34;;:18;:34;;;11723:104;;11785:30;;;;;;;;;;;;;;11723:104;11839:37;11851:4;11857:18;11839:11;:37::i;:::-;;11633:251;;:::o;31156:1202::-;31280:42;31261:61;;:15;:61;;;31257:1094;;31360:6;31347:9;:19;;31339:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;31404:16;31441:4;31425:27;;31460:9;31425:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31403:71;;;31497:11;31489:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;31578:6;31551;:23;31558:15;31551:23;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;31658:15;31604:158;;31629:10;31604:158;;;31692:6;31759:2;31604:158;;;;;;;:::i;:::-;;;;;;;;31324:450;31257:1094;;;31817:10;31803:24;;:10;:24;;;:62;;;;31831:34;30276:26;31854:10;31831:7;:34::i;:::-;31803:62;31795:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;31906:11;31926:15;31906:36;;31957:12;31972:5;:18;;;31991:10;32011:4;32018:6;31972:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31957:68;;32048:7;32040:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;32119:6;32092;:23;32099:15;32092:23;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;32199:15;32145:194;;32170:10;32145:194;;;32233:6;32258:5;:10;;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32289:5;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32322:5;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32145:194;;;;;;;;;:::i;:::-;;;;;;;;31780:571;;31257:1094;31156:1202;;;:::o;30644:42::-;;;;;;;;;;;;;;;;;:::o;32366:939::-;30276:26;8676:16;8687:4;8676:10;:16::i;:::-;32527:42:::1;32508:61;;:15;:61;;::::0;32504:794:::1;;32613:6;:23;32620:15;32613:23;;;;;;;;;;;;;;;;32594:15;:42;;32586:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;32690:11;32682:29;;:46;32712:15;32682:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;32770:15;32743:6;:23;32750:15;32743:23;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;32827:15;32805:55;;32814:11;32805:55;;;32844:15;32805:55;;;;;;:::i;:::-;;;;;;;;32504:794;;;32920:6;:23;32927:15;32920:23;;;;;;;;;;;;;;;;32901:15;:42;;32893:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;32989:11;33009:15;32989:36;;33040:12;33055:5;:14;;;33070:11;33083:15;33055:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33040:59;;33122:7;33114:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;33196:15;33169:6;:23;33176:15;33169:23;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;33253:15;33231:55;;33240:11;33231:55;;;33270:15;33231:55;;;;;;:::i;:::-;;;;;;;;32878:420;;32504:794;32366:939:::0;;;;:::o;9080:138::-;9157:4;9181:6;:12;9188:4;9181:12;;;;;;;;;;;:20;;:29;9202:7;9181:29;;;;;;;;;;;;;;;;;;;;;;;;;9174:36;;9080:138;;;;:::o;8392:49::-;8437:4;8392:49;;;:::o;10927:140::-;11002:18;11015:4;11002:12;:18::i;:::-;8676:16;8687:4;8676:10;:16::i;:::-;11033:26:::1;11045:4;11051:7;11033:11;:26::i;:::-;;10927:140:::0;;;:::o;30236:66::-;30276:26;30236:66;:::o;1714:148::-;1790:4;1829:25;1814:40;;;:11;:40;;;;1807:47;;1714:148;;;:::o;9433:105::-;9500:30;9511:4;9517:12;:10;:12::i;:::-;9500:10;:30::i;:::-;9433:105;:::o;12510:324::-;12587:4;12609:22;12617:4;12623:7;12609;:22::i;:::-;12604:223;;12680:4;12648:6;:12;12655:4;12648:12;;;;;;;;;;;:20;;:29;12669:7;12648:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;12731:12;:10;:12::i;:::-;12704:40;;12722:7;12704:40;;12716:4;12704:40;;;;;;;;;;12766:4;12759:11;;;;12604:223;12810:5;12803:12;;12510:324;;;;;:::o;5954:98::-;6007:7;6034:10;6027:17;;5954:98;:::o;13078:325::-;13156:4;13177:22;13185:4;13191:7;13177;:22::i;:::-;13173:223;;;13248:5;13216:6;:12;13223:4;13216:12;;;;;;;;;;;:20;;:29;13237:7;13216:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;13300:12;:10;:12::i;:::-;13273:40;;13291:7;13273:40;;13285:4;13273:40;;;;;;;;;;13335:4;13328:11;;;;13173:223;13379:5;13372:12;;13078:325;;;;;:::o;9674:201::-;9763:22;9771:4;9777:7;9763;:22::i;:::-;9758:110;;9842:7;9851:4;9809:47;;;;;;;;;;;;:::i;:::-;;;;;;;;9758:110;9674:201;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:118::-;2296:24;2314:5;2296:24;:::i;:::-;2291:3;2284:37;2209:118;;:::o;2333:222::-;2426:4;2464:2;2453:9;2449:18;2441:26;;2477:71;2545:1;2534:9;2530:17;2521:6;2477:71;:::i;:::-;2333:222;;;;:::o;2561:126::-;2598:7;2638:42;2631:5;2627:54;2616:65;;2561:126;;;:::o;2693:96::-;2730:7;2759:24;2777:5;2759:24;:::i;:::-;2748:35;;2693:96;;;:::o;2795:122::-;2868:24;2886:5;2868:24;:::i;:::-;2861:5;2858:35;2848:63;;2907:1;2904;2897:12;2848:63;2795:122;:::o;2923:139::-;2969:5;3007:6;2994:20;2985:29;;3023:33;3050:5;3023:33;:::i;:::-;2923:139;;;;:::o;3068:474::-;3136:6;3144;3193:2;3181:9;3172:7;3168:23;3164:32;3161:119;;;3199:79;;:::i;:::-;3161:119;3319:1;3344:53;3389:7;3380:6;3369:9;3365:22;3344:53;:::i;:::-;3334:63;;3290:117;3446:2;3472:53;3517:7;3508:6;3497:9;3493:22;3472:53;:::i;:::-;3462:63;;3417:118;3068:474;;;;;:::o;3548:77::-;3585:7;3614:5;3603:16;;3548:77;;;:::o;3631:122::-;3704:24;3722:5;3704:24;:::i;:::-;3697:5;3694:35;3684:63;;3743:1;3740;3733:12;3684:63;3631:122;:::o;3759:139::-;3805:5;3843:6;3830:20;3821:29;;3859:33;3886:5;3859:33;:::i;:::-;3759:139;;;;:::o;3904:619::-;3981:6;3989;3997;4046:2;4034:9;4025:7;4021:23;4017:32;4014:119;;;4052:79;;:::i;:::-;4014:119;4172:1;4197:53;4242:7;4233:6;4222:9;4218:22;4197:53;:::i;:::-;4187:63;;4143:117;4299:2;4325:53;4370:7;4361:6;4350:9;4346:22;4325:53;:::i;:::-;4315:63;;4270:118;4427:2;4453:53;4498:7;4489:6;4478:9;4474:22;4453:53;:::i;:::-;4443:63;;4398:118;3904:619;;;;;:::o;4529:329::-;4588:6;4637:2;4625:9;4616:7;4612:23;4608:32;4605:119;;;4643:79;;:::i;:::-;4605:119;4763:1;4788:53;4833:7;4824:6;4813:9;4809:22;4788:53;:::i;:::-;4778:63;;4734:117;4529:329;;;;:::o;4864:118::-;4951:24;4969:5;4951:24;:::i;:::-;4946:3;4939:37;4864:118;;:::o;4988:222::-;5081:4;5119:2;5108:9;5104:18;5096:26;;5132:71;5200:1;5189:9;5185:17;5176:6;5132:71;:::i;:::-;4988:222;;;;:::o;5216:169::-;5300:11;5334:6;5329:3;5322:19;5374:4;5369:3;5365:14;5350:29;;5216:169;;;;:::o;5391:167::-;5531:19;5527:1;5519:6;5515:14;5508:43;5391:167;:::o;5564:366::-;5706:3;5727:67;5791:2;5786:3;5727:67;:::i;:::-;5720:74;;5803:93;5892:3;5803:93;:::i;:::-;5921:2;5916:3;5912:12;5905:19;;5564:366;;;:::o;5936:419::-;6102:4;6140:2;6129:9;6125:18;6117:26;;6189:9;6183:4;6179:20;6175:1;6164:9;6160:17;6153:47;6217:131;6343:4;6217:131;:::i;:::-;6209:139;;5936:419;;;:::o;6361:147::-;6462:11;6499:3;6484:18;;6361:147;;;;:::o;6514:114::-;;:::o;6634:398::-;6793:3;6814:83;6895:1;6890:3;6814:83;:::i;:::-;6807:90;;6906:93;6995:3;6906:93;:::i;:::-;7024:1;7019:3;7015:11;7008:18;;6634:398;;;:::o;7038:379::-;7222:3;7244:147;7387:3;7244:147;:::i;:::-;7237:154;;7408:3;7401:10;;7038:379;;;:::o;7423:173::-;7563:25;7559:1;7551:6;7547:14;7540:49;7423:173;:::o;7602:366::-;7744:3;7765:67;7829:2;7824:3;7765:67;:::i;:::-;7758:74;;7841:93;7930:3;7841:93;:::i;:::-;7959:2;7954:3;7950:12;7943:19;;7602:366;;;:::o;7974:419::-;8140:4;8178:2;8167:9;8163:18;8155:26;;8227:9;8221:4;8217:20;8213:1;8202:9;8198:17;8191:47;8255:131;8381:4;8255:131;:::i;:::-;8247:139;;7974:419;;;:::o;8399:180::-;8447:77;8444:1;8437:88;8544:4;8541:1;8534:15;8568:4;8565:1;8558:15;8585:191;8625:3;8644:20;8662:1;8644:20;:::i;:::-;8639:25;;8678:20;8696:1;8678:20;:::i;:::-;8673:25;;8721:1;8718;8714:9;8707:16;;8742:3;8739:1;8736:10;8733:36;;;8749:18;;:::i;:::-;8733:36;8585:191;;;;:::o;8782:364::-;8924:3;8945:66;9009:1;9004:3;8945:66;:::i;:::-;8938:73;;9020:93;9109:3;9020:93;:::i;:::-;9138:1;9133:3;9129:11;9122:18;;8782:364;;;:::o;9152:86::-;9198:7;9227:5;9216:16;;9152:86;;;:::o;9244:::-;9279:7;9319:4;9312:5;9308:16;9297:27;;9244:86;;;:::o;9336:60::-;9364:3;9385:5;9378:12;;9336:60;;;:::o;9402:156::-;9459:9;9492:60;9508:43;9517:33;9544:5;9517:33;:::i;:::-;9508:43;:::i;:::-;9492:60;:::i;:::-;9479:73;;9402:156;;;:::o;9564:145::-;9658:44;9696:5;9658:44;:::i;:::-;9653:3;9646:57;9564:145;;:::o;9715:961::-;10045:4;10083:3;10072:9;10068:19;10060:27;;10097:71;10165:1;10154:9;10150:17;10141:6;10097:71;:::i;:::-;10215:9;10209:4;10205:20;10200:2;10189:9;10185:18;10178:48;10243:131;10369:4;10243:131;:::i;:::-;10235:139;;10421:9;10415:4;10411:20;10406:2;10395:9;10391:18;10384:48;10449:131;10575:4;10449:131;:::i;:::-;10441:139;;10590:79;10665:2;10654:9;10650:18;10641:6;10590:79;:::i;:::-;9715:961;;;;;:::o;10682:171::-;10822:23;10818:1;10810:6;10806:14;10799:47;10682:171;:::o;10859:366::-;11001:3;11022:67;11086:2;11081:3;11022:67;:::i;:::-;11015:74;;11098:93;11187:3;11098:93;:::i;:::-;11216:2;11211:3;11207:12;11200:19;;10859:366;;;:::o;11231:419::-;11397:4;11435:2;11424:9;11420:18;11412:26;;11484:9;11478:4;11474:20;11470:1;11459:9;11455:17;11448:47;11512:131;11638:4;11512:131;:::i;:::-;11504:139;;11231:419;;;:::o;11656:118::-;11743:24;11761:5;11743:24;:::i;:::-;11738:3;11731:37;11656:118;;:::o;11780:442::-;11929:4;11967:2;11956:9;11952:18;11944:26;;11980:71;12048:1;12037:9;12033:17;12024:6;11980:71;:::i;:::-;12061:72;12129:2;12118:9;12114:18;12105:6;12061:72;:::i;:::-;12143;12211:2;12200:9;12196:18;12187:6;12143:72;:::i;:::-;11780:442;;;;;;:::o;12228:116::-;12298:21;12313:5;12298:21;:::i;:::-;12291:5;12288:32;12278:60;;12334:1;12331;12324:12;12278:60;12228:116;:::o;12350:137::-;12404:5;12435:6;12429:13;12420:22;;12451:30;12475:5;12451:30;:::i;:::-;12350:137;;;;:::o;12493:345::-;12560:6;12609:2;12597:9;12588:7;12584:23;12580:32;12577:119;;;12615:79;;:::i;:::-;12577:119;12735:1;12760:61;12813:7;12804:6;12793:9;12789:22;12760:61;:::i;:::-;12750:71;;12706:125;12493:345;;;;:::o;12844:167::-;12984:19;12980:1;12972:6;12968:14;12961:43;12844:167;:::o;13017:366::-;13159:3;13180:67;13244:2;13239:3;13180:67;:::i;:::-;13173:74;;13256:93;13345:3;13256:93;:::i;:::-;13374:2;13369:3;13365:12;13358:19;;13017:366;;;:::o;13389:419::-;13555:4;13593:2;13582:9;13578:18;13570:26;;13642:9;13636:4;13632:20;13628:1;13617:9;13613:17;13606:47;13670:131;13796:4;13670:131;:::i;:::-;13662:139;;13389:419;;;:::o;13814:117::-;13923:1;13920;13913:12;13937:117;14046:1;14043;14036:12;14060:102;14101:6;14152:2;14148:7;14143:2;14136:5;14132:14;14128:28;14118:38;;14060:102;;;:::o;14168:180::-;14216:77;14213:1;14206:88;14313:4;14310:1;14303:15;14337:4;14334:1;14327:15;14354:281;14437:27;14459:4;14437:27;:::i;:::-;14429:6;14425:40;14567:6;14555:10;14552:22;14531:18;14519:10;14516:34;14513:62;14510:88;;;14578:18;;:::i;:::-;14510:88;14618:10;14614:2;14607:22;14397:238;14354:281;;:::o;14641:129::-;14675:6;14702:20;;:::i;:::-;14692:30;;14731:33;14759:4;14751:6;14731:33;:::i;:::-;14641:129;;;:::o;14776:308::-;14838:4;14928:18;14920:6;14917:30;14914:56;;;14950:18;;:::i;:::-;14914:56;14988:29;15010:6;14988:29;:::i;:::-;14980:37;;15072:4;15066;15062:15;15054:23;;14776:308;;;:::o;15090:139::-;15179:6;15174:3;15169;15163:23;15220:1;15211:6;15206:3;15202:16;15195:27;15090:139;;;:::o;15235:434::-;15324:5;15349:66;15365:49;15407:6;15365:49;:::i;:::-;15349:66;:::i;:::-;15340:75;;15438:6;15431:5;15424:21;15476:4;15469:5;15465:16;15514:3;15505:6;15500:3;15496:16;15493:25;15490:112;;;15521:79;;:::i;:::-;15490:112;15611:52;15656:6;15651:3;15646;15611:52;:::i;:::-;15330:339;15235:434;;;;;:::o;15689:355::-;15756:5;15805:3;15798:4;15790:6;15786:17;15782:27;15772:122;;15813:79;;:::i;:::-;15772:122;15923:6;15917:13;15948:90;16034:3;16026:6;16019:4;16011:6;16007:17;15948:90;:::i;:::-;15939:99;;15762:282;15689:355;;;;:::o;16050:524::-;16130:6;16179:2;16167:9;16158:7;16154:23;16150:32;16147:119;;;16185:79;;:::i;:::-;16147:119;16326:1;16315:9;16311:17;16305:24;16356:18;16348:6;16345:30;16342:117;;;16378:79;;:::i;:::-;16342:117;16483:74;16549:7;16540:6;16529:9;16525:22;16483:74;:::i;:::-;16473:84;;16276:291;16050:524;;;;:::o;16580:118::-;16651:22;16667:5;16651:22;:::i;:::-;16644:5;16641:33;16631:61;;16688:1;16685;16678:12;16631:61;16580:118;:::o;16704:139::-;16759:5;16790:6;16784:13;16775:22;;16806:31;16831:5;16806:31;:::i;:::-;16704:139;;;;:::o;16849:347::-;16917:6;16966:2;16954:9;16945:7;16941:23;16937:32;16934:119;;;16972:79;;:::i;:::-;16934:119;17092:1;17117:62;17171:7;17162:6;17151:9;17147:22;17117:62;:::i;:::-;17107:72;;17063:126;16849:347;;;;:::o;17202:99::-;17254:6;17288:5;17282:12;17272:22;;17202:99;;;:::o;17307:377::-;17395:3;17423:39;17456:5;17423:39;:::i;:::-;17478:71;17542:6;17537:3;17478:71;:::i;:::-;17471:78;;17558:65;17616:6;17611:3;17604:4;17597:5;17593:16;17558:65;:::i;:::-;17648:29;17670:6;17648:29;:::i;:::-;17643:3;17639:39;17632:46;;17399:285;17307:377;;;;:::o;17690:112::-;17773:22;17789:5;17773:22;:::i;:::-;17768:3;17761:35;17690:112;;:::o;17808:727::-;18021:4;18059:3;18048:9;18044:19;18036:27;;18073:71;18141:1;18130:9;18126:17;18117:6;18073:71;:::i;:::-;18191:9;18185:4;18181:20;18176:2;18165:9;18161:18;18154:48;18219:78;18292:4;18283:6;18219:78;:::i;:::-;18211:86;;18344:9;18338:4;18334:20;18329:2;18318:9;18314:18;18307:48;18372:78;18445:4;18436:6;18372:78;:::i;:::-;18364:86;;18460:68;18524:2;18513:9;18509:18;18500:6;18460:68;:::i;:::-;17808:727;;;;;;;:::o;18541:176::-;18681:28;18677:1;18669:6;18665:14;18658:52;18541:176;:::o;18723:366::-;18865:3;18886:67;18950:2;18945:3;18886:67;:::i;:::-;18879:74;;18962:93;19051:3;18962:93;:::i;:::-;19080:2;19075:3;19071:12;19064:19;;18723:366;;;:::o;19095:419::-;19261:4;19299:2;19288:9;19284:18;19276:26;;19348:9;19342:4;19338:20;19334:1;19323:9;19319:17;19312:47;19376:131;19502:4;19376:131;:::i;:::-;19368:139;;19095:419;;;:::o;19520:194::-;19560:4;19580:20;19598:1;19580:20;:::i;:::-;19575:25;;19614:20;19632:1;19614:20;:::i;:::-;19609:25;;19658:1;19655;19651:9;19643:17;;19682:1;19676:4;19673:11;19670:37;;;19687:18;;:::i;:::-;19670:37;19520:194;;;;:::o;19720:332::-;19841:4;19879:2;19868:9;19864:18;19856:26;;19892:71;19960:1;19949:9;19945:17;19936:6;19892:71;:::i;:::-;19973:72;20041:2;20030:9;20026:18;20017:6;19973:72;:::i;:::-;19720:332;;;;;:::o;20058:170::-;20198:22;20194:1;20186:6;20182:14;20175:46;20058:170;:::o;20234:366::-;20376:3;20397:67;20461:2;20456:3;20397:67;:::i;:::-;20390:74;;20473:93;20562:3;20473:93;:::i;:::-;20591:2;20586:3;20582:12;20575:19;;20234:366;;;:::o;20606:419::-;20772:4;20810:2;20799:9;20795:18;20787:26;;20859:9;20853:4;20849:20;20845:1;20834:9;20830:17;20823:47;20887:131;21013:4;20887:131;:::i;:::-;20879:139;;20606:419;;;:::o;21031:332::-;21152:4;21190:2;21179:9;21175:18;21167:26;;21203:71;21271:1;21260:9;21256:17;21247:6;21203:71;:::i;:::-;21284:72;21352:2;21341:9;21337:18;21328:6;21284:72;:::i;:::-;21031:332;;;;;:::o
Swarm Source
ipfs://f6c4e4105b82d32161cfbe2c3ae5d8980ddba49d6426b99962ae682022bb8558
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.