Overview
ETH Balance
0.000641056612574795 ETH
Eth Value
$2.19 (@ $3,418.75/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,527 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 20088106 | 16 days ago | IN | 0 ETH | 0.00030699 | ||||
Withdraw | 20002482 | 28 days ago | IN | 0 ETH | 0.00033216 | ||||
Withdraw | 19947570 | 36 days ago | IN | 0 ETH | 0.00065865 | ||||
Withdraw | 19458912 | 104 days ago | IN | 0 ETH | 0.00224055 | ||||
Withdraw | 19375919 | 116 days ago | IN | 0 ETH | 0.00614208 | ||||
Withdraw | 19033036 | 164 days ago | IN | 0 ETH | 0.00289569 | ||||
Withdraw | 18906389 | 182 days ago | IN | 0 ETH | 0.00179344 | ||||
Withdraw | 18879534 | 185 days ago | IN | 0 ETH | 0.00207795 | ||||
Withdraw | 18691872 | 212 days ago | IN | 0 ETH | 0.00332498 | ||||
Withdraw | 18691866 | 212 days ago | IN | 0 ETH | 0.00279424 | ||||
Withdraw | 18691841 | 212 days ago | IN | 0 ETH | 0.0017531 | ||||
Withdraw | 18691801 | 212 days ago | IN | 0 ETH | 0.00292723 | ||||
Withdraw | 18691783 | 212 days ago | IN | 0 ETH | 0.00378151 | ||||
Withdraw | 18691776 | 212 days ago | IN | 0 ETH | 0.00414342 | ||||
Withdraw | 18691736 | 212 days ago | IN | 0 ETH | 0.00441265 | ||||
Withdraw | 18562498 | 230 days ago | IN | 0 ETH | 0.00349158 | ||||
Withdraw | 18436487 | 247 days ago | IN | 0 ETH | 0.00173465 | ||||
Withdraw | 18350616 | 260 days ago | IN | 0 ETH | 0.00048261 | ||||
Withdraw | 18234583 | 276 days ago | IN | 0 ETH | 0.00110067 | ||||
Withdraw | 18227782 | 277 days ago | IN | 0 ETH | 0.0016608 | ||||
Withdraw | 18101118 | 294 days ago | IN | 0 ETH | 0.00091279 | ||||
Withdraw | 18073613 | 298 days ago | IN | 0 ETH | 0.00360391 | ||||
Withdraw | 18049920 | 302 days ago | IN | 0 ETH | 0.00142627 | ||||
Withdraw | 17848298 | 330 days ago | IN | 0 ETH | 0.00103162 | ||||
Withdraw | 17794123 | 337 days ago | IN | 0 ETH | 0.00299742 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
18691866 | 212 days ago | 26.11371901 ETH | ||||
18449914 | 246 days ago | 1 wei | ||||
18449914 | 246 days ago | 339 wei | ||||
18449914 | 246 days ago | 338 wei | ||||
17684757 | 353 days ago | 1.18894697 ETH | ||||
17208460 | 420 days ago | 1.10462594 ETH | ||||
16839964 | 472 days ago | 1.79389665 ETH | ||||
16342728 | 541 days ago | 1 wei | ||||
16342728 | 541 days ago | 19.36 ETH | ||||
16342728 | 541 days ago | 19.36 ETH | ||||
16341336 | 542 days ago | 1 wei | ||||
16341336 | 542 days ago | 19.36 ETH | ||||
16341336 | 542 days ago | 19.36 ETH | ||||
16341265 | 542 days ago | 1 wei | ||||
16341265 | 542 days ago | 17.6 ETH | ||||
16341265 | 542 days ago | 17.6 ETH | ||||
16339799 | 542 days ago | 1 wei | ||||
16339799 | 542 days ago | 30 ETH | ||||
16339799 | 542 days ago | 30 ETH | ||||
16338840 | 542 days ago | 1 wei | ||||
16338840 | 542 days ago | 19.36 ETH | ||||
16338840 | 542 days ago | 19.36 ETH | ||||
16337329 | 542 days ago | 1 wei | ||||
16337329 | 542 days ago | 16 ETH | ||||
16337329 | 542 days ago | 16 ETH |
Loading...
Loading
Contract Name:
LiquidityPoolV4
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: LGPL-3.0-or-later pragma solidity 0.8.6; import "./Interf.sol"; import "./CanReclaimTokens.sol"; import './BorrowerProxy.sol'; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "hardhat/console.sol"; contract LiquidityPoolStorageV1 { mapping (address=>IKToken) public kTokens; mapping (address=>bool) public registeredKTokens; mapping (address=>uint256) public loanedAmount; mapping (address=>mapping (address=>uint256)) public adapterLoanedAmount; mapping (address=>uint256) public adapterLimits; uint256 public depositFeeInBips; uint256 public poolFeeInBips; address[] public registeredTokens; address payable feePool; BorrowerProxy public borrower; } contract LiquidityPoolV4 is LiquidityPoolStorageV1, ILiquidityPool, CanReclaimTokens, ReentrancyGuard, Pausable { using SafeERC20 for IERC20; uint256 public constant BIPS_BASE = 10000; address public constant ETHEREUM = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; event Deposited(address indexed _depositor, address indexed _token, uint256 _amount, uint256 _mintAmount); event Withdrew(address indexed _reciever, address indexed _withdrawer, address indexed _token, uint256 _amount, uint256 _burnAmount); event Borrowed(address indexed _borrower, address indexed _token, uint256 _amount, uint256 _fee); event EtherReceived(address indexed _from, uint256 _amount); event AdapterLimitChanged(address indexed _adapter, uint256 _from, uint256 _to); event AdapterBorrowed(address indexed _adapter, address indexed _token, uint256 _amount); event AdapterRepaid(address indexed _adapter, address indexed _token, uint256 _amount); modifier onlyWhitelistedAdapter() { require(adapterLimits[msg.sender] != 0, "JITU: caller is not a whitelisted keeper"); _; } receive () external override payable { emit EtherReceived(_msgSender(), msg.value); } constructor() { borrower = new BorrowerProxy(); } /// @notice updates the deposit fee. /// /// @dev fee is in bips so it should /// satisfy [0 <= fee <= BIPS_BASE] /// @param _depositFeeInBips The new deposit fee. function updateDepositFee(uint256 _depositFeeInBips) external onlyOperator { require(_depositFeeInBips <= BIPS_BASE, "LiquidityPool: fee should be between 0 and BIPS_BASE"); depositFeeInBips = _depositFeeInBips; } /// @notice updates the pool fee. /// /// @dev fee is in bips so it should /// satisfy [0 <= fee <= BIPS_BASE] /// @param _poolFeeInBips The new pool fee. function updatePoolFee(uint256 _poolFeeInBips) external onlyOperator { require(_poolFeeInBips <= BIPS_BASE, "LiquidityPool: fee should be between 0 and BIPS_BASE"); poolFeeInBips = _poolFeeInBips; } /// @notice updates the fee pool. /// /// @param _newFeePool The new fee pool. function updateFeePool(address payable _newFeePool) external onlyOperator { require(_newFeePool != address(0), "LiquidityPoolV2: feepool cannot be 0x0"); feePool = _newFeePool; } /// @notice change the credit limit for the given adapter. /// @param _adapter the address of the keeper /// @param _limitInBips the spending limit of the adapter function updateAdapterLimit(address _adapter, uint256 _limitInBips) external onlyOperator { require(_limitInBips <= BIPS_BASE, "limit should be between 0 and BIPS_BASE"); adapterLimits[_adapter] = _limitInBips; _checkCreditLimit(_adapter); emit AdapterLimitChanged(_adapter, adapterLimits[_adapter], _limitInBips); } /// @notice pauses this contract. function pause() external onlyOperator { _pause(); } /// @notice unpauses this contract. function unpause() external onlyOperator { _unpause(); } /// @notice Renounces operatorship of this contract function renounceOperator() public override(ILiquidityPool, KRoles) { KRoles.renounceOperator(); } /// @notice register a token on this Keeper. /// /// @param _kToken The keeper ERC20 token. function register(IKToken _kToken) external override onlyOperator { require(address(kTokens[_kToken.underlying()]) == address(0x0), "Underlying asset should not have been registered"); require(!registeredKTokens[address(_kToken)], "kToken should not have been registered"); kTokens[_kToken.underlying()] = _kToken; registeredKTokens[address(_kToken)] = true; registeredTokens.push(address(_kToken.underlying())); blacklistRecoverableToken(_kToken.underlying()); } /// @notice Deposit funds to the Keeper Protocol. /// /// @param _token The address of the token contract. /// @param _amount The value of deposit. function deposit(address _token, uint256 _amount) external payable override nonReentrant whenNotPaused returns (uint256) { IKToken kTok = kTokens[_token]; require(address(kTok) != address(0x0), "Token is not registered"); require(_amount > 0, "Deposit amount should be greater than 0"); _transferIn(_token, _amount); uint256 mintAmount = calculateMintAmount(kTok, _token, _amount); require(kTok.mint(_msgSender(), mintAmount), "Failed to mint kTokens"); emit Deposited(_msgSender(), _token, _amount, mintAmount); return mintAmount; } /// @notice Withdraw funds from the Compound Protocol. /// /// @param _to The address of the amount receiver. /// @param _kToken The address of the kToken contract. /// @param _kTokenAmount The value of the kToken amount to be burned. function withdraw(address payable _to, IKToken _kToken, uint256 _kTokenAmount) external override nonReentrant whenNotPaused { require(registeredKTokens[address(_kToken)], "kToken is not registered"); require(_kTokenAmount > 0, "Withdraw amount should be greater than 0"); address token = _kToken.underlying(); uint256 amount = calculateWithdrawAmount(_kToken, token, _kTokenAmount); _kToken.burnFrom(_msgSender(), _kTokenAmount); _transferOut(_to, token, amount); emit Withdrew(_to, _msgSender(), token, amount, _kTokenAmount); } /// @notice borrow assets from this LP, and return them within the same transaction. /// /// @param _token The address of the token contract. /// @param _amount The amont of token. /// @param _data The implementation specific data for the Borrower. function borrow(address _token, uint256 _amount, bytes calldata _data) external nonReentrant whenNotPaused { require(address(kTokens[_token]) != address(0x0), "Token is not registered"); uint256 initialBalance = borrowableBalance(_token); _transferOut(_msgSender(), _token, _amount); borrower.lend(_msgSender(), _data); uint256 finalBalance = borrowableBalance(_token); require(finalBalance >= initialBalance, "Borrower failed to return the borrowed funds"); uint256 fee = finalBalance - initialBalance; uint256 poolFee = calculateFee(poolFeeInBips, fee); emit Borrowed(_msgSender(), _token, _amount, fee); _transferOut(feePool, _token, poolFee); } /// @notice Calculate the given token's outstanding balance of this contract. /// /// @param _token The address of the token contract. /// /// @return Outstanding balance of the given token. function borrowableBalance(address _token) public view override returns (uint256) { if (_token == ETHEREUM) { return address(this).balance; } return IERC20(_token).balanceOf(address(this)); } /// @notice returns the total value locked in the LiquidityPool for the /// given token /// @param _token the address of the token function totalValueLocked(address _token) public view returns (uint256) { return borrowableBalance(_token) + loanedAmount[_token]; } /// @notice Calculate the given owner's outstanding balance for the given token on this contract. /// /// @param _token The address of the token contract. /// @param _owner The address of the token contract. /// /// @return Owner's outstanding balance of the given token. function underlyingBalance(address _token, address _owner) public view override returns (uint256) { uint256 kBalance = kTokens[_token].balanceOf(_owner); uint256 kSupply = kTokens[_token].totalSupply(); if (kBalance > 0) { return (totalValueLocked(_token) * kBalance) / kSupply; } return 0; } /// @notice Migrate funds to the new liquidity provider. /// /// @param _newLP The address of the new LiquidityPool contract. function migrate(ILiquidityPool _newLP) public onlyOperator { for (uint256 i = 0; i < registeredTokens.length; i++) { address token = registeredTokens[i]; kTokens[token].addMinter(address(_newLP)); kTokens[token].renounceMinter(); _newLP.register(kTokens[token]); _transferOut(address(_newLP), token, borrowableBalance(token)); } _newLP.renounceOperator(); } /// @notice adapterBorrow allows supported KeeperDAO adapters to lend /// assets intra block. /// /// @param _token The address of the token contract. /// @param _amount The amont of token. /// @param _data The implementation specific data for the Borrower. function adapterBorrow(address _token, uint256 _amount, bytes calldata _data) external nonReentrant onlyWhitelistedAdapter whenNotPaused { require(address(kTokens[_token]) != address(0x0), "Token is not registered"); loanedAmount[_token] += _amount; adapterLoanedAmount[_msgSender()][_token] += _amount; _checkTokenCreditLimit(_msgSender(), _token); _transferOut(_msgSender(), _token, _amount); borrower.lend(_msgSender(), _data); emit AdapterBorrowed(_msgSender(), _token, _amount); } /// @notice repay allows supported KeeperDAO adapters to repay /// assets intra block. /// /// @param _token The address of the token contract. /// @param _amount The amont of token. function adapterRepay(address _adapter, address _token, uint256 _amount) external payable nonReentrant whenNotPaused { require(address(kTokens[_token]) != address(0x0), "Token is not registered"); // pull the funds from the msg.sender to this contract _transferIn(_token, _amount); uint256 repayAmount = adapterLoanedAmount[_adapter][_token] < _amount ? adapterLoanedAmount[_adapter][_token] : _amount; loanedAmount[_token] -= repayAmount; adapterLoanedAmount[_adapter][_token] -= repayAmount; emit AdapterRepaid(_adapter, _token, repayAmount); } // returns the corresponding kToken for the given underlying token if it exists. function kToken(address _token) external view override returns (IKToken) { return kTokens[_token]; } /// Calculates the amount that will be withdrawn when the given amount of kToken /// is burnt. /// @dev used in the withdraw() function to calculate the amount that will be /// withdrawn. function calculateWithdrawAmount(IKToken _kToken, address _token, uint256 _kTokenAmount) internal view returns (uint256) { uint256 kTokenSupply = _kToken.totalSupply(); require(kTokenSupply != 0, "No KTokens to be burnt"); uint256 poolBalance = borrowableBalance(_token); uint256 withdrawAmount = (_kTokenAmount * (poolBalance + loanedAmount[_token])) / _kToken.totalSupply(); require(withdrawAmount <= poolBalance, "Insufficient pool liquidity"); return withdrawAmount; } /// Calculates the amount of kTokens that will be minted when the given amount /// is deposited. /// @dev used in the deposit() function to calculate the amount of kTokens that /// will be minted. function calculateMintAmount(IKToken _kToken, address _token, uint256 _depositAmount) internal view returns (uint256) { // The borrow balance includes the deposit amount, which is removed here. uint256 initialBalance = totalValueLocked(_token) - _depositAmount; uint256 kTokenSupply = _kToken.totalSupply(); if (kTokenSupply == 0) { return _depositAmount; } // mintAmoount = amountDeposited * (1-fee) * kPool /(pool + amountDeposited * fee) return (applyFee(depositFeeInBips, _depositAmount) * kTokenSupply) / (initialBalance + calculateFee(depositFeeInBips, _depositAmount)); } /// Applies the fee by subtracting fees from the amount and returns /// the amount after deducting the fee. /// @dev it calculates (1 - fee) * amount function applyFee(uint256 _feeInBips, uint256 _amount) internal pure returns (uint256) { return (_amount * (BIPS_BASE - _feeInBips)) / BIPS_BASE; } /// Calculates the fee amount. /// @dev it calculates fee * amount function calculateFee(uint256 _feeInBips, uint256 _amount) internal pure returns (uint256) { return (_amount * _feeInBips) / BIPS_BASE; } /// @notice checks credit limit of the adapter function _checkCreditLimit(address _adapter) internal view { for (uint i = 0; i < registeredTokens.length; i++) { _checkTokenCreditLimit(_adapter, registeredTokens[i]); } } /// @notice checks credit limit of the adapter for the given token function _checkTokenCreditLimit(address _adapter, address _token) internal view { uint256 adapterLimit = (adapterLimits[_adapter] * totalValueLocked(_token)) / BIPS_BASE; require(adapterLoanedAmount[_adapter][_token] <= adapterLimit, "Exceeds the credit limit"); } /// @notice transfers funds into the contract function _transferIn(address _token, uint256 _amount) internal { if (_token != ETHEREUM) { require(msg.value == 0, "LiquidityPool: ETH sent during an ERC20 deposit"); IERC20(_token).safeTransferFrom(_msgSender(), address(this), _amount); } else { require(msg.value >= _amount, "LiquidityPool: incorrect ETH amount"); } } /// @notice transfers funds out of the contract function _transferOut(address _to, address _token, uint256 _amount) internal { if (_token != ETHEREUM) { IERC20(_token).safeTransfer(_to, _amount); } else { (bool success,) = _to.call{ value: _amount }(""); require(success, "LiquidityPool: failed to transfer ETH"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @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: * * ``` * 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}: * * ``` * 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. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping (address => bool) members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @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. * * _Available since v3.1._ */ 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 {_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 Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @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 override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ */ function _checkRole(bytes32 role, address account) internal view { if(!hasRole(role, account)) { revert(string(abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ))); } } /** * @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 override 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. */ function grantRole(bytes32 role, address account) public virtual override 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. */ function revokeRole(bytes32 role, address account) public virtual override 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 granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.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' // solhint-disable-next-line max-line-length 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)); } } /** * @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 // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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); }
// SPDX-License-Identifier: LGPL-3.0-or-later pragma solidity 0.8.6; contract BorrowerProxy { address liquidityPool; constructor() { liquidityPool = msg.sender; } function lend(address _caller, bytes calldata _data) external payable { require(msg.sender == liquidityPool, "BorrowerProxy: Caller is not the liquidity pool"); (bool success,) = _caller.call{ value: msg.value }(_data); require(success, "BorrowerProxy: Borrower contract reverted during execution"); } }
// SPDX-License-Identifier: LGPL-3.0-or-later pragma solidity 0.8.6; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "./KRoles.sol"; contract CanReclaimTokens is KRoles { using SafeERC20 for IERC20; mapping(address => bool) private recoverableTokensBlacklist; function blacklistRecoverableToken(address _token) public onlyOperator { recoverableTokensBlacklist[_token] = true; } /// @notice Allow the owner of the contract to recover funds accidentally /// sent to the contract. To withdraw ETH, the token should be set to `0x0`. function recoverTokens(address _token) external onlyOperator { require( !recoverableTokensBlacklist[_token], "CanReclaimTokens: token is not recoverable" ); if (_token == address(0x0)) { (bool success,) = msg.sender.call{ value: address(this).balance }(""); require(success, "Transfer Failed"); } else { IERC20(_token).safeTransfer( msg.sender, IERC20(_token).balanceOf(address(this)) ); } } }
// SPDX-License-Identifier: LGPL-3.0-or-later pragma solidity 0.8.6; interface IKToken { function underlying() external view returns (address); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function mint(address recipient, uint256 amount) external returns (bool); function burnFrom(address sender, uint256 amount) external; function addMinter(address sender) external; function renounceMinter() external; } interface ILiquidityPool { receive () external payable; function kToken(address _token) external view returns (IKToken); function register(IKToken _kToken) external; function renounceOperator() external; function deposit(address _token, uint256 _amount) external payable returns (uint256); function withdraw(address payable _to, IKToken _kToken, uint256 _kTokenAmount) external; function borrowableBalance(address _token) external view returns (uint256); function underlyingBalance(address _token, address _owner) external view returns (uint256); } interface ILender { receive () external payable; function borrow(address _token, uint256 _amount, bytes calldata _data) external; }
// SPDX-License-Identifier: LGPL-3.0-or-later pragma solidity 0.8.6; import "@openzeppelin/contracts/access/AccessControl.sol"; contract KRoles is AccessControl { bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); event OperatorAdded(address indexed account); event OperatorRemoved(address indexed account); constructor() { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(OPERATOR_ROLE, _msgSender()); } modifier onlyOperator() { require(isOperator(_msgSender()), "OperatorRole: caller does not have the Operator role"); _; } function isOperator(address account) public view returns (bool) { return hasRole(OPERATOR_ROLE, account); } function addOperator(address account) public onlyOperator { _addOperator(account); } function renounceOperator() public virtual { _renounceOperator(msg.sender); } function _addOperator(address account) internal { grantRole(OPERATOR_ROLE, account); emit OperatorAdded(account); } function _renounceOperator(address account) internal { renounceRole(OPERATOR_ROLE, account); emit OperatorRemoved(account); } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "evmVersion": "berlin", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_adapter","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"AdapterBorrowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_adapter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_from","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_to","type":"uint256"}],"name":"AdapterLimitChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_adapter","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"AdapterRepaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_borrower","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"Borrowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_depositor","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"EtherReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"OperatorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_reciever","type":"address"},{"indexed":true,"internalType":"address","name":"_withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_burnAmount","type":"uint256"}],"name":"Withdrew","type":"event"},{"inputs":[],"name":"BIPS_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ETHEREUM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"adapterBorrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"adapterLimits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"adapterLoanedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adapter","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"adapterRepay","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"blacklistRecoverableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"borrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"borrowableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrower","outputs":[{"internalType":"contract BorrowerProxy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositFeeInBips","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"kToken","outputs":[{"internalType":"contract IKToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"kTokens","outputs":[{"internalType":"contract IKToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"loanedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ILiquidityPool","name":"_newLP","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFeeInBips","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IKToken","name":"_kToken","type":"address"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"registeredKTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"registeredTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","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"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"totalValueLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"underlyingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adapter","type":"address"},{"internalType":"uint256","name":"_limitInBips","type":"uint256"}],"name":"updateAdapterLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_depositFeeInBips","type":"uint256"}],"name":"updateDepositFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newFeePool","type":"address"}],"name":"updateFeePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolFeeInBips","type":"uint256"}],"name":"updatePoolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"contract IKToken","name":"_kToken","type":"address"},{"internalType":"uint256","name":"_kTokenAmount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200001f600033620000ac565b6200004b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92933620000ac565b6001600c55600d805460ff19169055604051620000689062000160565b604051809103906000f08015801562000085573d6000803e3d6000fd5b50600980546001600160a01b0319166001600160a01b03929092169190911790556200016e565b620000b88282620000bc565b5050565b6000828152600a602090815260408083206001600160a01b038516845290915290205460ff16620000b8576000828152600a602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200011c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610294806200350c83390190565b61338e806200017e6000396000f3fe6080604052600436106102555760003560e01c80637df1f1b911610139578063b489cfdc116100b6578063d8a7acd61161007a578063d8a7acd61461075b578063d9caed1214610788578063f5b541a6146107a8578063f65d901c146107ca578063f7cdf47c146107ea578063fc5eb0df1461081257600080fd5b8063b489cfdc146106bb578063c2cac04b146106db578063c5b1fad1146106fb578063ce5494bb1461071b578063d547741f1461073b57600080fd5b80639a0ba2ea116100fd5780639a0ba2ea14610647578063a217fddf14610667578063a441f8051461067c578063aef67d781461068f578063afcc4845146106a557600080fd5b80637df1f1b9146105a2578063834edf41146105c25780638456cb59146105f257806391d14854146106075780639870d7fe1461062757600080fd5b80634420e486116101d25780635c975abb116101965780635c975abb146104c457806360426777146104dc5780636d16acfe146105095780636d70f7ae146105425780636e2246a714610562578063736158d01461058257600080fd5b80634420e486146103eb57806347e7ef241461040b57806347e866621461041e5780634aff33c81461046c5780634df0316c1461048c57600080fd5b8063248a9ca311610219578063248a9ca3146103515780632ab6f8db146103815780632f2ff15d1461039657806336568abe146103b65780633f4ba83a146103d657600080fd5b8063017def571461029657806301ffc9a7146102b85780630534e74e146102ed578063055d32491461031157806316114acd1461033157600080fd5b366102915760405134815233907f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b9060200160405180910390a2005b600080fd5b3480156102a257600080fd5b506102b66102b1366004612f4e565b610832565b005b3480156102c457600080fd5b506102d86102d3366004612f8c565b610887565b60405190151581526020015b60405180910390f35b3480156102f957600080fd5b5061030360065481565b6040519081526020016102e4565b34801561031d57600080fd5b506102b661032c366004612e77565b6108be565b34801561033d57600080fd5b506102b661034c366004612dc3565b6109c0565b34801561035d57600080fd5b5061030361036c366004612f4e565b6000908152600a602052604090206001015490565b34801561038d57600080fd5b506102b6610b8e565b3480156103a257600080fd5b506102b66103b1366004612f67565b610b98565b3480156103c257600080fd5b506102b66103d1366004612f67565b610bc3565b3480156103e257600080fd5b506102b6610c3d565b3480156103f757600080fd5b506102b6610406366004612dc3565b610c6a565b610303610419366004612e77565b610fd8565b34801561042a57600080fd5b50610454610439366004612dc3565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102e4565b34801561047857600080fd5b50610303610487366004612dc3565b6111fe565b34801561049857600080fd5b506103036104a7366004612e3e565b600360209081526000928352604080842090915290825290205481565b3480156104d057600080fd5b50600d5460ff166102d8565b3480156104e857600080fd5b506103036104f7366004612dc3565b60026020526000908152604090205481565b34801561051557600080fd5b50610454610524366004612dc3565b6001600160a01b039081166000908152602081905260409020541690565b34801561054e57600080fd5b506102d861055d366004612dc3565b61122a565b34801561056e57600080fd5b506102b661057d366004612ea3565b611244565b34801561058e57600080fd5b5061030361059d366004612dc3565b61143f565b3480156105ae57600080fd5b50600954610454906001600160a01b031681565b3480156105ce57600080fd5b506102d86105dd366004612dc3565b60016020526000908152604090205460ff1681565b3480156105fe57600080fd5b506102b66114e4565b34801561061357600080fd5b506102d8610622366004612f67565b611511565b34801561063357600080fd5b506102b6610642366004612dc3565b61153c565b34801561065357600080fd5b50610454610662366004612f4e565b61156a565b34801561067357600080fd5b50610303600081565b6102b661068a366004612dfd565b611594565b34801561069b57600080fd5b5061030360055481565b3480156106b157600080fd5b5061030361271081565b3480156106c757600080fd5b506102b66106d6366004612ea3565b611743565b3480156106e757600080fd5b506102b66106f6366004612f4e565b61195c565b34801561070757600080fd5b506102b6610716366004612dc3565b6119a8565b34801561072757600080fd5b506102b6610736366004612dc3565b611a54565b34801561074757600080fd5b506102b6610756366004612f67565b611c6c565b34801561076757600080fd5b50610303610776366004612dc3565b60046020526000908152604090205481565b34801561079457600080fd5b506102b66107a3366004612dfd565b611c92565b3480156107b457600080fd5b5061030360008051602061333983398151915281565b3480156107d657600080fd5b506102b66107e5366004612dc3565b611efc565b3480156107f657600080fd5b5061045473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b34801561081e57600080fd5b5061030361082d366004612e3e565b611f45565b61083b3361122a565b6108605760405162461bcd60e51b815260040161085790613127565b60405180910390fd5b6127108111156108825760405162461bcd60e51b8152600401610857906130d3565b600555565b60006001600160e01b03198216637965db0b60e01b14806108b857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6108c73361122a565b6108e35760405162461bcd60e51b815260040161085790613127565b6127108111156109455760405162461bcd60e51b815260206004820152602760248201527f6c696d69742073686f756c64206265206265747765656e203020616e6420424960448201526650535f4241534560c81b6064820152608401610857565b6001600160a01b03821660009081526004602052604090208190556109698261209b565b6001600160a01b0382166000818152600460209081526040918290205482519081529081018490527f8da0430676447c102c151abba561b7c4c84007345e1f9e15751b329095a1e845910160405180910390a25050565b6109c93361122a565b6109e55760405162461bcd60e51b815260040161085790613127565b6001600160a01b0381166000908152600b602052604090205460ff1615610a615760405162461bcd60e51b815260206004820152602a60248201527f43616e5265636c61696d546f6b656e733a20746f6b656e206973206e6f74207260448201526965636f76657261626c6560b01b6064820152608401610857565b6001600160a01b038116610afd57604051600090339047908381818185875af1925050503d8060008114610ab1576040519150601f19603f3d011682016040523d82523d6000602084013e610ab6565b606091505b5050905080610af95760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b6044820152606401610857565b5050565b6040516370a0823160e01b8152306004820152610b8b9033906001600160a01b038416906370a082319060240160206040518083038186803b158015610b4257600080fd5b505afa158015610b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7a9190612fb6565b6001600160a01b03841691906120eb565b50565b610b9661214e565b565b6000828152600a6020526040902060010154610bb48133612157565b610bbe83836121bb565b505050565b6001600160a01b0381163314610c335760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610857565b610af98282612241565b610c463361122a565b610c625760405162461bcd60e51b815260040161085790613127565b610b966122a8565b610c733361122a565b610c8f5760405162461bcd60e51b815260040161085790613127565b60006001600160a01b0316600080836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610cd657600080fd5b505afa158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0e9190612de0565b6001600160a01b0390811682526020820192909252604001600020541614610d915760405162461bcd60e51b815260206004820152603060248201527f556e6465726c79696e672061737365742073686f756c64206e6f74206861766560448201526f081899595b881c9959da5cdd195c995960821b6064820152608401610857565b6001600160a01b03811660009081526001602052604090205460ff1615610e095760405162461bcd60e51b815260206004820152602660248201527f6b546f6b656e2073686f756c64206e6f742068617665206265656e20726567696044820152651cdd195c995960d21b6064820152608401610857565b80600080836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4657600080fd5b505afa158015610e5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7e9190612de0565b6001600160a01b0390811682526020808301939093526040918201600090812080546001600160a01b031916958316959095179094558416808452600180845293829020805460ff19169094179093558051636f307dc360e01b8152905160079392636f307dc39260048082019391829003018186803b158015610f0157600080fd5b505afa158015610f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f399190612de0565b815460018101835560009283526020928390200180546001600160a01b0319166001600160a01b0392831617905560408051636f307dc360e01b81529051610b8b9392851692636f307dc39260048082019391829003018186803b158015610fa057600080fd5b505afa158015610fb4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e59190612de0565b60006002600c541415610ffd5760405162461bcd60e51b8152600401610857906131dc565b6002600c55600d5460ff16156110255760405162461bcd60e51b81526004016108579061317b565b6001600160a01b03808416600090815260208190526040902054168061105d5760405162461bcd60e51b8152600401610857906131a5565b600083116110bd5760405162461bcd60e51b815260206004820152602760248201527f4465706f73697420616d6f756e742073686f756c6420626520677265617465726044820152660207468616e20360cc1b6064820152608401610857565b6110c7848461233b565b60006110d4828686612436565b90506001600160a01b0382166340c10f19336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b15801561112e57600080fd5b505af1158015611142573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111669190612f2c565b6111ab5760405162461bcd60e51b81526020600482015260166024820152754661696c656420746f206d696e74206b546f6b656e7360501b6044820152606401610857565b60408051858152602081018390526001600160a01b0387169133917ff5681f9d0db1b911ac18ee83d515a1cf1051853a9eae418316a2fdf7dea427c5910160405180910390a36001600c55949350505050565b6001600160a01b0381166000908152600260205260408120546112208361143f565b6108b89190613213565b60006108b860008051602061333983398151915283611511565b6002600c5414156112675760405162461bcd60e51b8152600401610857906131dc565b6002600c55600d5460ff161561128f5760405162461bcd60e51b81526004016108579061317b565b6001600160a01b03848116600090815260208190526040902054166112c65760405162461bcd60e51b8152600401610857906131a5565b60006112d18561143f565b90506112de338686612516565b6009546001600160a01b031663d5badabc3385856040518463ffffffff1660e01b815260040161131093929190613060565b600060405180830381600087803b15801561132a57600080fd5b505af115801561133e573d6000803e3d6000fd5b50505050600061134d8661143f565b9050818110156113b45760405162461bcd60e51b815260206004820152602c60248201527f426f72726f776572206661696c656420746f2072657475726e2074686520626f60448201526b72726f7765642066756e647360a01b6064820152608401610857565b60006113c0838361326c565b905060006113d060065483612605565b60408051898152602081018590529192506001600160a01b038a169133917fc14e9e6b4d98a542b05a0f6b64acd5f4cbdb914be88432d87486b664e97071a7910160405180910390a3600854611430906001600160a01b03168983612516565b50506001600c55505050505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561146d575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b1580156114ac57600080fd5b505afa1580156114c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b89190612fb6565b6114ed3361122a565b6115095760405162461bcd60e51b815260040161085790613127565b610b9661261e565b6000918252600a602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6115453361122a565b6115615760405162461bcd60e51b815260040161085790613127565b610b8b81612676565b6007818154811061157a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6002600c5414156115b75760405162461bcd60e51b8152600401610857906131dc565b6002600c55600d5460ff16156115df5760405162461bcd60e51b81526004016108579061317b565b6001600160a01b03828116600090815260208190526040902054166116165760405162461bcd60e51b8152600401610857906131a5565b611620828261233b565b6001600160a01b0380841660009081526003602090815260408083209386168352929052908120548211611654578161167b565b6001600160a01b038085166000908152600360209081526040808320938716835292905220545b6001600160a01b0384166000908152600260205260408120805492935083929091906116a890849061326c565b90915550506001600160a01b038085166000908152600360209081526040808320938716835292905290812080548392906116e490849061326c565b92505081905550826001600160a01b0316846001600160a01b03167f1017f441420ab3db46a0c205e67b32d9ccdb8bbbec77141df434c0dd9bbc722e8360405161173091815260200190565b60405180910390a350506001600c555050565b6002600c5414156117665760405162461bcd60e51b8152600401610857906131dc565b6002600c55336000908152600460205260409020546117d85760405162461bcd60e51b815260206004820152602860248201527f4a4954553a2063616c6c6572206973206e6f7420612077686974656c69737465604482015267321035b2b2b832b960c11b6064820152608401610857565b600d5460ff16156117fb5760405162461bcd60e51b81526004016108579061317b565b6001600160a01b03848116600090815260208190526040902054166118325760405162461bcd60e51b8152600401610857906131a5565b6001600160a01b0384166000908152600260205260408120805485929061185a908490613213565b90915550503360009081526003602090815260408083206001600160a01b038816845290915281208054859290611892908490613213565b909155506118a2905033856126c5565b6118ad338585612516565b6009546001600160a01b031663d5badabc3384846040518463ffffffff1660e01b81526004016118df93929190613060565b600060405180830381600087803b1580156118f957600080fd5b505af115801561190d573d6000803e3d6000fd5b50505050836001600160a01b03166119223390565b6001600160a01b03167f705c701c3ff68c8aada6761e77214df0afca4d8ba23bf1db13334ce91251c8fb8560405161173091815260200190565b6119653361122a565b6119815760405162461bcd60e51b815260040161085790613127565b6127108111156119a35760405162461bcd60e51b8152600401610857906130d3565b600655565b6119b13361122a565b6119cd5760405162461bcd60e51b815260040161085790613127565b6001600160a01b038116611a325760405162461bcd60e51b815260206004820152602660248201527f4c6971756964697479506f6f6c56323a20666565706f6f6c2063616e6e6f742060448201526506265203078360d41b6064820152608401610857565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b611a5d3361122a565b611a795760405162461bcd60e51b815260040161085790613127565b60005b600754811015611c1557600060078281548110611a9b57611a9b6132f7565b6000918252602080832091909101546001600160a01b0390811680845291839052604092839020549251634c1d96ab60e11b81528682166004820152919350919091169063983b2d5690602401600060405180830381600087803b158015611b0257600080fd5b505af1158015611b16573d6000803e3d6000fd5b5050506001600160a01b03808316600090815260208190526040808220548151639865027560e01b81529151931693506398650275926004808301939282900301818387803b158015611b6857600080fd5b505af1158015611b7c573d6000803e3d6000fd5b505050506001600160a01b0381811660009081526020819052604090819020549051632210724360e11b8152908216600482015290841690634420e48690602401600060405180830381600087803b158015611bd757600080fd5b505af1158015611beb573d6000803e3d6000fd5b50505050611c028382611bfd8461143f565b612516565b5080611c0d816132c6565b915050611a7c565b50806001600160a01b0316632ab6f8db6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c5157600080fd5b505af1158015611c65573d6000803e3d6000fd5b5050505050565b6000828152600a6020526040902060010154611c888133612157565b610bbe8383612241565b6002600c541415611cb55760405162461bcd60e51b8152600401610857906131dc565b6002600c55600d5460ff1615611cdd5760405162461bcd60e51b81526004016108579061317b565b6001600160a01b03821660009081526001602052604090205460ff16611d455760405162461bcd60e51b815260206004820152601860248201527f6b546f6b656e206973206e6f74207265676973746572656400000000000000006044820152606401610857565b60008111611da65760405162461bcd60e51b815260206004820152602860248201527f576974686472617720616d6f756e742073686f756c6420626520677265617465604482015267072207468616e20360c41b6064820152608401610857565b6000826001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611de157600080fd5b505afa158015611df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e199190612de0565b90506000611e28848385612778565b90506001600160a01b0384166379cc6790336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101869052604401600060405180830381600087803b158015611e8257600080fd5b505af1158015611e96573d6000803e3d6000fd5b50505050611ea5858383612516565b60408051828152602081018590526001600160a01b03848116923392918916917f66d8849e904432a33a6c0adbb12d9cf486cc99e88c79160e8b1933b6c6644d59910160405180910390a450506001600c55505050565b611f053361122a565b611f215760405162461bcd60e51b815260040161085790613127565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6001600160a01b038281166000908152602081905260408082205490516370a0823160e01b81528484166004820152919283929116906370a082319060240160206040518083038186803b158015611f9c57600080fd5b505afa158015611fb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd49190612fb6565b6001600160a01b038086166000908152602081815260408083205481516318160ddd60e01b81529151959650929492909316926318160ddd9260048083019392829003018186803b15801561202857600080fd5b505afa15801561203c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120609190612fb6565b90508115612090578082612073876111fe565b61207d919061324d565b612087919061322b565b925050506108b8565b506000949350505050565b60005b600754811015610af9576120d982600783815481106120bf576120bf6132f7565b6000918252602090912001546001600160a01b03166126c5565b806120e3816132c6565b91505061209e565b6040516001600160a01b038316602482015260448101829052610bbe90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261293d565b610b9633612a0f565b6121618282611511565b610af957612179816001600160a01b03166014612a5e565b612184836020612a5e565b604051602001612195929190612feb565b60408051601f198184030181529082905262461bcd60e51b8252610857916004016130a0565b6121c58282611511565b610af9576000828152600a602090815260408083206001600160a01b03851684529091529020805460ff191660011790556121fd3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61224b8282611511565b15610af9576000828152600a602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600d5460ff166122f15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610857565b600d805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146123da5734156123c55760405162461bcd60e51b815260206004820152602f60248201527f4c6971756964697479506f6f6c3a204554482073656e7420647572696e67206160448201526e1b88115490cc8c0819195c1bdcda5d608a1b6064820152608401610857565b610af96001600160a01b038316333084612bfa565b80341015610af95760405162461bcd60e51b815260206004820152602360248201527f4c6971756964697479506f6f6c3a20696e636f72726563742045544820616d6f6044820152621d5b9d60ea1b6064820152608401610857565b60008082612443856111fe565b61244d919061326c565b90506000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561248a57600080fd5b505afa15801561249e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c29190612fb6565b9050806124d357839250505061250f565b6124df60055485612605565b6124e99083613213565b816124f660055487612c32565b612500919061324d565b61250a919061322b565b925050505b9392505050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461254e57610bbe6001600160a01b03831684836120eb565b6000836001600160a01b03168260405160006040518083038185875af1925050503d806000811461259b576040519150601f19603f3d011682016040523d82523d6000602084013e6125a0565b606091505b50509050806125ff5760405162461bcd60e51b815260206004820152602560248201527f4c6971756964697479506f6f6c3a206661696c656420746f207472616e7366656044820152640e4408aa8960db1b6064820152608401610857565b50505050565b6000612710612614848461324d565b61250f919061322b565b600d5460ff16156126415760405162461bcd60e51b81526004016108579061317b565b600d805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861231e3390565b61268e60008051602061333983398151915282610b98565b6040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b60006127106126d3836111fe565b6001600160a01b0385166000908152600460205260409020546126f6919061324d565b612700919061322b565b6001600160a01b03808516600090815260036020908152604080832093871683529290522054909150811015610bbe5760405162461bcd60e51b815260206004820152601860248201527f457863656564732074686520637265646974206c696d697400000000000000006044820152606401610857565b600080846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127b457600080fd5b505afa1580156127c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ec9190612fb6565b9050806128345760405162461bcd60e51b8152602060048201526016602482015275139bc812d51bdad95b9cc81d1bc8189948189d5c9b9d60521b6044820152606401610857565b600061283f8561143f565b90506000866001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561287c57600080fd5b505afa158015612890573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128b49190612fb6565b6001600160a01b0387166000908152600260205260409020546128d79084613213565b6128e1908761324d565b6128eb919061322b565b90508181111561250a5760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e7420706f6f6c206c697175696469747900000000006044820152606401610857565b6000612992826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612c4b9092919063ffffffff16565b805190915015610bbe57808060200190518101906129b09190612f2c565b610bbe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610857565b612a2760008051602061333983398151915282610bc3565b6040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b60606000612a6d83600261324d565b612a78906002613213565b67ffffffffffffffff811115612a9057612a9061330d565b6040519080825280601f01601f191660200182016040528015612aba576020820181803683370190505b509050600360fc1b81600081518110612ad557612ad56132f7565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612b0457612b046132f7565b60200101906001600160f81b031916908160001a9053506000612b2884600261324d565b612b33906001613213565b90505b6001811115612bab576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612b6757612b676132f7565b1a60f81b828281518110612b7d57612b7d6132f7565b60200101906001600160f81b031916908160001a90535060049490941c93612ba4816132af565b9050612b36565b50831561250f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610857565b6040516001600160a01b03808516602483015283166044820152606481018290526125ff9085906323b872dd60e01b90608401612117565b6000612710612c41848261326c565b612614908461324d565b6060612c5a8484600085612c62565b949350505050565b606082471015612cc35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610857565b843b612d115760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610857565b600080866001600160a01b03168587604051612d2d9190612fcf565b60006040518083038185875af1925050503d8060008114612d6a576040519150601f19603f3d011682016040523d82523d6000602084013e612d6f565b606091505b5091509150612d7f828286612d8a565b979650505050505050565b60608315612d9957508161250f565b825115612da95782518084602001fd5b8160405162461bcd60e51b815260040161085791906130a0565b600060208284031215612dd557600080fd5b813561250f81613323565b600060208284031215612df257600080fd5b815161250f81613323565b600080600060608486031215612e1257600080fd5b8335612e1d81613323565b92506020840135612e2d81613323565b929592945050506040919091013590565b60008060408385031215612e5157600080fd5b8235612e5c81613323565b91506020830135612e6c81613323565b809150509250929050565b60008060408385031215612e8a57600080fd5b8235612e9581613323565b946020939093013593505050565b60008060008060608587031215612eb957600080fd5b8435612ec481613323565b935060208501359250604085013567ffffffffffffffff80821115612ee857600080fd5b818701915087601f830112612efc57600080fd5b813581811115612f0b57600080fd5b886020828501011115612f1d57600080fd5b95989497505060200194505050565b600060208284031215612f3e57600080fd5b8151801515811461250f57600080fd5b600060208284031215612f6057600080fd5b5035919050565b60008060408385031215612f7a57600080fd5b823591506020830135612e6c81613323565b600060208284031215612f9e57600080fd5b81356001600160e01b03198116811461250f57600080fd5b600060208284031215612fc857600080fd5b5051919050565b60008251612fe1818460208701613283565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613023816017850160208801613283565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613054816028840160208801613283565b01602801949350505050565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b60208152600082518060208401526130bf816040850160208701613283565b601f01601f19169190910160400192915050565b60208082526034908201527f4c6971756964697479506f6f6c3a206665652073686f756c64206265206265746040820152737765656e203020616e6420424950535f4241534560601b606082015260800190565b60208082526034908201527f4f70657261746f72526f6c653a2063616c6c657220646f6573206e6f74206861604082015273766520746865204f70657261746f7220726f6c6560601b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526017908201527f546f6b656e206973206e6f742072656769737465726564000000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115613226576132266132e1565b500190565b60008261324857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613267576132676132e1565b500290565b60008282101561327e5761327e6132e1565b500390565b60005b8381101561329e578181015183820152602001613286565b838111156125ff5750506000910152565b6000816132be576132be6132e1565b506000190190565b60006000198214156132da576132da6132e1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610b8b57600080fdfe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929a264697066735822122080de431c5e95f8a9cf0583e61751f4ba28f241827f96aed7d9a1a42a4b7cd0c764736f6c63430008060033608060405234801561001057600080fd5b50600080546001600160a01b03191633179055610262806100326000396000f3fe60806040526004361061001e5760003560e01c8063d5badabc14610023575b600080fd5b61003661003136600461018b565b610038565b005b6000546001600160a01b031633146100af5760405162461bcd60e51b815260206004820152602f60248201527f426f72726f77657250726f78793a2043616c6c6572206973206e6f742074686560448201526e081b1a5c5d5a591a5d1e481c1bdbdb608a1b60648201526084015b60405180910390fd5b6000836001600160a01b03163484846040516100cc92919061021c565b60006040518083038185875af1925050503d8060008114610109576040519150601f19603f3d011682016040523d82523d6000602084013e61010e565b606091505b50509050806101855760405162461bcd60e51b815260206004820152603a60248201527f426f72726f77657250726f78793a20426f72726f77657220636f6e747261637460448201527f20726576657274656420647572696e6720657865637574696f6e00000000000060648201526084016100a6565b50505050565b6000806000604084860312156101a057600080fd5b83356001600160a01b03811681146101b757600080fd5b9250602084013567ffffffffffffffff808211156101d457600080fd5b818601915086601f8301126101e857600080fd5b8135818111156101f757600080fd5b87602082850101111561020957600080fd5b6020830194508093505050509250925092565b818382376000910190815291905056fea26469706673582212206fe1713266a44597e6a7a866d2239ac3fac47defc6558585b01413500d5481e964736f6c63430008060033
Deployed Bytecode
0x6080604052600436106102555760003560e01c80637df1f1b911610139578063b489cfdc116100b6578063d8a7acd61161007a578063d8a7acd61461075b578063d9caed1214610788578063f5b541a6146107a8578063f65d901c146107ca578063f7cdf47c146107ea578063fc5eb0df1461081257600080fd5b8063b489cfdc146106bb578063c2cac04b146106db578063c5b1fad1146106fb578063ce5494bb1461071b578063d547741f1461073b57600080fd5b80639a0ba2ea116100fd5780639a0ba2ea14610647578063a217fddf14610667578063a441f8051461067c578063aef67d781461068f578063afcc4845146106a557600080fd5b80637df1f1b9146105a2578063834edf41146105c25780638456cb59146105f257806391d14854146106075780639870d7fe1461062757600080fd5b80634420e486116101d25780635c975abb116101965780635c975abb146104c457806360426777146104dc5780636d16acfe146105095780636d70f7ae146105425780636e2246a714610562578063736158d01461058257600080fd5b80634420e486146103eb57806347e7ef241461040b57806347e866621461041e5780634aff33c81461046c5780634df0316c1461048c57600080fd5b8063248a9ca311610219578063248a9ca3146103515780632ab6f8db146103815780632f2ff15d1461039657806336568abe146103b65780633f4ba83a146103d657600080fd5b8063017def571461029657806301ffc9a7146102b85780630534e74e146102ed578063055d32491461031157806316114acd1461033157600080fd5b366102915760405134815233907f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b9060200160405180910390a2005b600080fd5b3480156102a257600080fd5b506102b66102b1366004612f4e565b610832565b005b3480156102c457600080fd5b506102d86102d3366004612f8c565b610887565b60405190151581526020015b60405180910390f35b3480156102f957600080fd5b5061030360065481565b6040519081526020016102e4565b34801561031d57600080fd5b506102b661032c366004612e77565b6108be565b34801561033d57600080fd5b506102b661034c366004612dc3565b6109c0565b34801561035d57600080fd5b5061030361036c366004612f4e565b6000908152600a602052604090206001015490565b34801561038d57600080fd5b506102b6610b8e565b3480156103a257600080fd5b506102b66103b1366004612f67565b610b98565b3480156103c257600080fd5b506102b66103d1366004612f67565b610bc3565b3480156103e257600080fd5b506102b6610c3d565b3480156103f757600080fd5b506102b6610406366004612dc3565b610c6a565b610303610419366004612e77565b610fd8565b34801561042a57600080fd5b50610454610439366004612dc3565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102e4565b34801561047857600080fd5b50610303610487366004612dc3565b6111fe565b34801561049857600080fd5b506103036104a7366004612e3e565b600360209081526000928352604080842090915290825290205481565b3480156104d057600080fd5b50600d5460ff166102d8565b3480156104e857600080fd5b506103036104f7366004612dc3565b60026020526000908152604090205481565b34801561051557600080fd5b50610454610524366004612dc3565b6001600160a01b039081166000908152602081905260409020541690565b34801561054e57600080fd5b506102d861055d366004612dc3565b61122a565b34801561056e57600080fd5b506102b661057d366004612ea3565b611244565b34801561058e57600080fd5b5061030361059d366004612dc3565b61143f565b3480156105ae57600080fd5b50600954610454906001600160a01b031681565b3480156105ce57600080fd5b506102d86105dd366004612dc3565b60016020526000908152604090205460ff1681565b3480156105fe57600080fd5b506102b66114e4565b34801561061357600080fd5b506102d8610622366004612f67565b611511565b34801561063357600080fd5b506102b6610642366004612dc3565b61153c565b34801561065357600080fd5b50610454610662366004612f4e565b61156a565b34801561067357600080fd5b50610303600081565b6102b661068a366004612dfd565b611594565b34801561069b57600080fd5b5061030360055481565b3480156106b157600080fd5b5061030361271081565b3480156106c757600080fd5b506102b66106d6366004612ea3565b611743565b3480156106e757600080fd5b506102b66106f6366004612f4e565b61195c565b34801561070757600080fd5b506102b6610716366004612dc3565b6119a8565b34801561072757600080fd5b506102b6610736366004612dc3565b611a54565b34801561074757600080fd5b506102b6610756366004612f67565b611c6c565b34801561076757600080fd5b50610303610776366004612dc3565b60046020526000908152604090205481565b34801561079457600080fd5b506102b66107a3366004612dfd565b611c92565b3480156107b457600080fd5b5061030360008051602061333983398151915281565b3480156107d657600080fd5b506102b66107e5366004612dc3565b611efc565b3480156107f657600080fd5b5061045473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b34801561081e57600080fd5b5061030361082d366004612e3e565b611f45565b61083b3361122a565b6108605760405162461bcd60e51b815260040161085790613127565b60405180910390fd5b6127108111156108825760405162461bcd60e51b8152600401610857906130d3565b600555565b60006001600160e01b03198216637965db0b60e01b14806108b857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6108c73361122a565b6108e35760405162461bcd60e51b815260040161085790613127565b6127108111156109455760405162461bcd60e51b815260206004820152602760248201527f6c696d69742073686f756c64206265206265747765656e203020616e6420424960448201526650535f4241534560c81b6064820152608401610857565b6001600160a01b03821660009081526004602052604090208190556109698261209b565b6001600160a01b0382166000818152600460209081526040918290205482519081529081018490527f8da0430676447c102c151abba561b7c4c84007345e1f9e15751b329095a1e845910160405180910390a25050565b6109c93361122a565b6109e55760405162461bcd60e51b815260040161085790613127565b6001600160a01b0381166000908152600b602052604090205460ff1615610a615760405162461bcd60e51b815260206004820152602a60248201527f43616e5265636c61696d546f6b656e733a20746f6b656e206973206e6f74207260448201526965636f76657261626c6560b01b6064820152608401610857565b6001600160a01b038116610afd57604051600090339047908381818185875af1925050503d8060008114610ab1576040519150601f19603f3d011682016040523d82523d6000602084013e610ab6565b606091505b5050905080610af95760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b6044820152606401610857565b5050565b6040516370a0823160e01b8152306004820152610b8b9033906001600160a01b038416906370a082319060240160206040518083038186803b158015610b4257600080fd5b505afa158015610b56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7a9190612fb6565b6001600160a01b03841691906120eb565b50565b610b9661214e565b565b6000828152600a6020526040902060010154610bb48133612157565b610bbe83836121bb565b505050565b6001600160a01b0381163314610c335760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610857565b610af98282612241565b610c463361122a565b610c625760405162461bcd60e51b815260040161085790613127565b610b966122a8565b610c733361122a565b610c8f5760405162461bcd60e51b815260040161085790613127565b60006001600160a01b0316600080836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610cd657600080fd5b505afa158015610cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0e9190612de0565b6001600160a01b0390811682526020820192909252604001600020541614610d915760405162461bcd60e51b815260206004820152603060248201527f556e6465726c79696e672061737365742073686f756c64206e6f74206861766560448201526f081899595b881c9959da5cdd195c995960821b6064820152608401610857565b6001600160a01b03811660009081526001602052604090205460ff1615610e095760405162461bcd60e51b815260206004820152602660248201527f6b546f6b656e2073686f756c64206e6f742068617665206265656e20726567696044820152651cdd195c995960d21b6064820152608401610857565b80600080836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4657600080fd5b505afa158015610e5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7e9190612de0565b6001600160a01b0390811682526020808301939093526040918201600090812080546001600160a01b031916958316959095179094558416808452600180845293829020805460ff19169094179093558051636f307dc360e01b8152905160079392636f307dc39260048082019391829003018186803b158015610f0157600080fd5b505afa158015610f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f399190612de0565b815460018101835560009283526020928390200180546001600160a01b0319166001600160a01b0392831617905560408051636f307dc360e01b81529051610b8b9392851692636f307dc39260048082019391829003018186803b158015610fa057600080fd5b505afa158015610fb4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e59190612de0565b60006002600c541415610ffd5760405162461bcd60e51b8152600401610857906131dc565b6002600c55600d5460ff16156110255760405162461bcd60e51b81526004016108579061317b565b6001600160a01b03808416600090815260208190526040902054168061105d5760405162461bcd60e51b8152600401610857906131a5565b600083116110bd5760405162461bcd60e51b815260206004820152602760248201527f4465706f73697420616d6f756e742073686f756c6420626520677265617465726044820152660207468616e20360cc1b6064820152608401610857565b6110c7848461233b565b60006110d4828686612436565b90506001600160a01b0382166340c10f19336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b15801561112e57600080fd5b505af1158015611142573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111669190612f2c565b6111ab5760405162461bcd60e51b81526020600482015260166024820152754661696c656420746f206d696e74206b546f6b656e7360501b6044820152606401610857565b60408051858152602081018390526001600160a01b0387169133917ff5681f9d0db1b911ac18ee83d515a1cf1051853a9eae418316a2fdf7dea427c5910160405180910390a36001600c55949350505050565b6001600160a01b0381166000908152600260205260408120546112208361143f565b6108b89190613213565b60006108b860008051602061333983398151915283611511565b6002600c5414156112675760405162461bcd60e51b8152600401610857906131dc565b6002600c55600d5460ff161561128f5760405162461bcd60e51b81526004016108579061317b565b6001600160a01b03848116600090815260208190526040902054166112c65760405162461bcd60e51b8152600401610857906131a5565b60006112d18561143f565b90506112de338686612516565b6009546001600160a01b031663d5badabc3385856040518463ffffffff1660e01b815260040161131093929190613060565b600060405180830381600087803b15801561132a57600080fd5b505af115801561133e573d6000803e3d6000fd5b50505050600061134d8661143f565b9050818110156113b45760405162461bcd60e51b815260206004820152602c60248201527f426f72726f776572206661696c656420746f2072657475726e2074686520626f60448201526b72726f7765642066756e647360a01b6064820152608401610857565b60006113c0838361326c565b905060006113d060065483612605565b60408051898152602081018590529192506001600160a01b038a169133917fc14e9e6b4d98a542b05a0f6b64acd5f4cbdb914be88432d87486b664e97071a7910160405180910390a3600854611430906001600160a01b03168983612516565b50506001600c55505050505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561146d575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b1580156114ac57600080fd5b505afa1580156114c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b89190612fb6565b6114ed3361122a565b6115095760405162461bcd60e51b815260040161085790613127565b610b9661261e565b6000918252600a602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6115453361122a565b6115615760405162461bcd60e51b815260040161085790613127565b610b8b81612676565b6007818154811061157a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6002600c5414156115b75760405162461bcd60e51b8152600401610857906131dc565b6002600c55600d5460ff16156115df5760405162461bcd60e51b81526004016108579061317b565b6001600160a01b03828116600090815260208190526040902054166116165760405162461bcd60e51b8152600401610857906131a5565b611620828261233b565b6001600160a01b0380841660009081526003602090815260408083209386168352929052908120548211611654578161167b565b6001600160a01b038085166000908152600360209081526040808320938716835292905220545b6001600160a01b0384166000908152600260205260408120805492935083929091906116a890849061326c565b90915550506001600160a01b038085166000908152600360209081526040808320938716835292905290812080548392906116e490849061326c565b92505081905550826001600160a01b0316846001600160a01b03167f1017f441420ab3db46a0c205e67b32d9ccdb8bbbec77141df434c0dd9bbc722e8360405161173091815260200190565b60405180910390a350506001600c555050565b6002600c5414156117665760405162461bcd60e51b8152600401610857906131dc565b6002600c55336000908152600460205260409020546117d85760405162461bcd60e51b815260206004820152602860248201527f4a4954553a2063616c6c6572206973206e6f7420612077686974656c69737465604482015267321035b2b2b832b960c11b6064820152608401610857565b600d5460ff16156117fb5760405162461bcd60e51b81526004016108579061317b565b6001600160a01b03848116600090815260208190526040902054166118325760405162461bcd60e51b8152600401610857906131a5565b6001600160a01b0384166000908152600260205260408120805485929061185a908490613213565b90915550503360009081526003602090815260408083206001600160a01b038816845290915281208054859290611892908490613213565b909155506118a2905033856126c5565b6118ad338585612516565b6009546001600160a01b031663d5badabc3384846040518463ffffffff1660e01b81526004016118df93929190613060565b600060405180830381600087803b1580156118f957600080fd5b505af115801561190d573d6000803e3d6000fd5b50505050836001600160a01b03166119223390565b6001600160a01b03167f705c701c3ff68c8aada6761e77214df0afca4d8ba23bf1db13334ce91251c8fb8560405161173091815260200190565b6119653361122a565b6119815760405162461bcd60e51b815260040161085790613127565b6127108111156119a35760405162461bcd60e51b8152600401610857906130d3565b600655565b6119b13361122a565b6119cd5760405162461bcd60e51b815260040161085790613127565b6001600160a01b038116611a325760405162461bcd60e51b815260206004820152602660248201527f4c6971756964697479506f6f6c56323a20666565706f6f6c2063616e6e6f742060448201526506265203078360d41b6064820152608401610857565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b611a5d3361122a565b611a795760405162461bcd60e51b815260040161085790613127565b60005b600754811015611c1557600060078281548110611a9b57611a9b6132f7565b6000918252602080832091909101546001600160a01b0390811680845291839052604092839020549251634c1d96ab60e11b81528682166004820152919350919091169063983b2d5690602401600060405180830381600087803b158015611b0257600080fd5b505af1158015611b16573d6000803e3d6000fd5b5050506001600160a01b03808316600090815260208190526040808220548151639865027560e01b81529151931693506398650275926004808301939282900301818387803b158015611b6857600080fd5b505af1158015611b7c573d6000803e3d6000fd5b505050506001600160a01b0381811660009081526020819052604090819020549051632210724360e11b8152908216600482015290841690634420e48690602401600060405180830381600087803b158015611bd757600080fd5b505af1158015611beb573d6000803e3d6000fd5b50505050611c028382611bfd8461143f565b612516565b5080611c0d816132c6565b915050611a7c565b50806001600160a01b0316632ab6f8db6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611c5157600080fd5b505af1158015611c65573d6000803e3d6000fd5b5050505050565b6000828152600a6020526040902060010154611c888133612157565b610bbe8383612241565b6002600c541415611cb55760405162461bcd60e51b8152600401610857906131dc565b6002600c55600d5460ff1615611cdd5760405162461bcd60e51b81526004016108579061317b565b6001600160a01b03821660009081526001602052604090205460ff16611d455760405162461bcd60e51b815260206004820152601860248201527f6b546f6b656e206973206e6f74207265676973746572656400000000000000006044820152606401610857565b60008111611da65760405162461bcd60e51b815260206004820152602860248201527f576974686472617720616d6f756e742073686f756c6420626520677265617465604482015267072207468616e20360c41b6064820152608401610857565b6000826001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611de157600080fd5b505afa158015611df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e199190612de0565b90506000611e28848385612778565b90506001600160a01b0384166379cc6790336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101869052604401600060405180830381600087803b158015611e8257600080fd5b505af1158015611e96573d6000803e3d6000fd5b50505050611ea5858383612516565b60408051828152602081018590526001600160a01b03848116923392918916917f66d8849e904432a33a6c0adbb12d9cf486cc99e88c79160e8b1933b6c6644d59910160405180910390a450506001600c55505050565b611f053361122a565b611f215760405162461bcd60e51b815260040161085790613127565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6001600160a01b038281166000908152602081905260408082205490516370a0823160e01b81528484166004820152919283929116906370a082319060240160206040518083038186803b158015611f9c57600080fd5b505afa158015611fb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd49190612fb6565b6001600160a01b038086166000908152602081815260408083205481516318160ddd60e01b81529151959650929492909316926318160ddd9260048083019392829003018186803b15801561202857600080fd5b505afa15801561203c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120609190612fb6565b90508115612090578082612073876111fe565b61207d919061324d565b612087919061322b565b925050506108b8565b506000949350505050565b60005b600754811015610af9576120d982600783815481106120bf576120bf6132f7565b6000918252602090912001546001600160a01b03166126c5565b806120e3816132c6565b91505061209e565b6040516001600160a01b038316602482015260448101829052610bbe90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261293d565b610b9633612a0f565b6121618282611511565b610af957612179816001600160a01b03166014612a5e565b612184836020612a5e565b604051602001612195929190612feb565b60408051601f198184030181529082905262461bcd60e51b8252610857916004016130a0565b6121c58282611511565b610af9576000828152600a602090815260408083206001600160a01b03851684529091529020805460ff191660011790556121fd3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61224b8282611511565b15610af9576000828152600a602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600d5460ff166122f15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610857565b600d805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146123da5734156123c55760405162461bcd60e51b815260206004820152602f60248201527f4c6971756964697479506f6f6c3a204554482073656e7420647572696e67206160448201526e1b88115490cc8c0819195c1bdcda5d608a1b6064820152608401610857565b610af96001600160a01b038316333084612bfa565b80341015610af95760405162461bcd60e51b815260206004820152602360248201527f4c6971756964697479506f6f6c3a20696e636f72726563742045544820616d6f6044820152621d5b9d60ea1b6064820152608401610857565b60008082612443856111fe565b61244d919061326c565b90506000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561248a57600080fd5b505afa15801561249e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c29190612fb6565b9050806124d357839250505061250f565b6124df60055485612605565b6124e99083613213565b816124f660055487612c32565b612500919061324d565b61250a919061322b565b925050505b9392505050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461254e57610bbe6001600160a01b03831684836120eb565b6000836001600160a01b03168260405160006040518083038185875af1925050503d806000811461259b576040519150601f19603f3d011682016040523d82523d6000602084013e6125a0565b606091505b50509050806125ff5760405162461bcd60e51b815260206004820152602560248201527f4c6971756964697479506f6f6c3a206661696c656420746f207472616e7366656044820152640e4408aa8960db1b6064820152608401610857565b50505050565b6000612710612614848461324d565b61250f919061322b565b600d5460ff16156126415760405162461bcd60e51b81526004016108579061317b565b600d805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861231e3390565b61268e60008051602061333983398151915282610b98565b6040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b60006127106126d3836111fe565b6001600160a01b0385166000908152600460205260409020546126f6919061324d565b612700919061322b565b6001600160a01b03808516600090815260036020908152604080832093871683529290522054909150811015610bbe5760405162461bcd60e51b815260206004820152601860248201527f457863656564732074686520637265646974206c696d697400000000000000006044820152606401610857565b600080846001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127b457600080fd5b505afa1580156127c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ec9190612fb6565b9050806128345760405162461bcd60e51b8152602060048201526016602482015275139bc812d51bdad95b9cc81d1bc8189948189d5c9b9d60521b6044820152606401610857565b600061283f8561143f565b90506000866001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561287c57600080fd5b505afa158015612890573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128b49190612fb6565b6001600160a01b0387166000908152600260205260409020546128d79084613213565b6128e1908761324d565b6128eb919061322b565b90508181111561250a5760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e7420706f6f6c206c697175696469747900000000006044820152606401610857565b6000612992826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612c4b9092919063ffffffff16565b805190915015610bbe57808060200190518101906129b09190612f2c565b610bbe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610857565b612a2760008051602061333983398151915282610bc3565b6040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b60606000612a6d83600261324d565b612a78906002613213565b67ffffffffffffffff811115612a9057612a9061330d565b6040519080825280601f01601f191660200182016040528015612aba576020820181803683370190505b509050600360fc1b81600081518110612ad557612ad56132f7565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612b0457612b046132f7565b60200101906001600160f81b031916908160001a9053506000612b2884600261324d565b612b33906001613213565b90505b6001811115612bab576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612b6757612b676132f7565b1a60f81b828281518110612b7d57612b7d6132f7565b60200101906001600160f81b031916908160001a90535060049490941c93612ba4816132af565b9050612b36565b50831561250f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610857565b6040516001600160a01b03808516602483015283166044820152606481018290526125ff9085906323b872dd60e01b90608401612117565b6000612710612c41848261326c565b612614908461324d565b6060612c5a8484600085612c62565b949350505050565b606082471015612cc35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610857565b843b612d115760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610857565b600080866001600160a01b03168587604051612d2d9190612fcf565b60006040518083038185875af1925050503d8060008114612d6a576040519150601f19603f3d011682016040523d82523d6000602084013e612d6f565b606091505b5091509150612d7f828286612d8a565b979650505050505050565b60608315612d9957508161250f565b825115612da95782518084602001fd5b8160405162461bcd60e51b815260040161085791906130a0565b600060208284031215612dd557600080fd5b813561250f81613323565b600060208284031215612df257600080fd5b815161250f81613323565b600080600060608486031215612e1257600080fd5b8335612e1d81613323565b92506020840135612e2d81613323565b929592945050506040919091013590565b60008060408385031215612e5157600080fd5b8235612e5c81613323565b91506020830135612e6c81613323565b809150509250929050565b60008060408385031215612e8a57600080fd5b8235612e9581613323565b946020939093013593505050565b60008060008060608587031215612eb957600080fd5b8435612ec481613323565b935060208501359250604085013567ffffffffffffffff80821115612ee857600080fd5b818701915087601f830112612efc57600080fd5b813581811115612f0b57600080fd5b886020828501011115612f1d57600080fd5b95989497505060200194505050565b600060208284031215612f3e57600080fd5b8151801515811461250f57600080fd5b600060208284031215612f6057600080fd5b5035919050565b60008060408385031215612f7a57600080fd5b823591506020830135612e6c81613323565b600060208284031215612f9e57600080fd5b81356001600160e01b03198116811461250f57600080fd5b600060208284031215612fc857600080fd5b5051919050565b60008251612fe1818460208701613283565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613023816017850160208801613283565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613054816028840160208801613283565b01602801949350505050565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b60208152600082518060208401526130bf816040850160208701613283565b601f01601f19169190910160400192915050565b60208082526034908201527f4c6971756964697479506f6f6c3a206665652073686f756c64206265206265746040820152737765656e203020616e6420424950535f4241534560601b606082015260800190565b60208082526034908201527f4f70657261746f72526f6c653a2063616c6c657220646f6573206e6f74206861604082015273766520746865204f70657261746f7220726f6c6560601b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526017908201527f546f6b656e206973206e6f742072656769737465726564000000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115613226576132266132e1565b500190565b60008261324857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613267576132676132e1565b500290565b60008282101561327e5761327e6132e1565b500390565b60005b8381101561329e578181015183820152602001613286565b838111156125ff5750506000910152565b6000816132be576132be6132e1565b506000190190565b60006000198214156132da576132da6132e1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610b8b57600080fdfe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929a264697066735822122080de431c5e95f8a9cf0583e61751f4ba28f241827f96aed7d9a1a42a4b7cd0c764736f6c63430008060033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 97.25% | $3,418.75 | 119.3328 | $407,968.96 | |
ETH | 2.01% | $0.805043 | 10,459.3679 | $8,420.24 | |
ETH | 0.72% | $4,384.36 | 0.693 | $3,038.21 | |
ETH | <0.01% | $0.999465 | 23.2359 | $23.22 | |
ETH | <0.01% | $0.999993 | 9.014 | $9.01 | |
ETH | <0.01% | $3,418.75 | 0.00064106 | $2.19 | |
ETH | <0.01% | $0.02273 | 5 | $0.1136 | |
AVAX | 0.01% | $28.23 | 2.2 | $62.11 | |
BSC | <0.01% | $0.022732 | 10 | $0.2273 |
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.