Source Code
Latest 25 from a total of 722 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 21694126 | 198 days ago | IN | 0 ETH | 0 | ||||
| Claim All | 21694115 | 198 days ago | IN | 0 ETH | 0 | ||||
| Withdraw | 21652192 | 199 days ago | IN | 0 ETH | 0 | ||||
| Claim All | 21652174 | 199 days ago | IN | 0 ETH | 0 | ||||
| Stake | 21615834 | 200 days ago | IN | 0 ETH | 0 | ||||
| Claim All | 21584565 | 201 days ago | IN | 0 ETH | 0.00000023 | ||||
| Withdraw | 21584561 | 201 days ago | IN | 0 ETH | 0.00000027 | ||||
| Withdraw | 21572139 | 201 days ago | IN | 0 ETH | 0.00000022 | ||||
| Withdraw | 21571315 | 201 days ago | IN | 0 ETH | 0.0000002 | ||||
| Claim All | 21571283 | 201 days ago | IN | 0 ETH | 0.00000022 | ||||
| Claim All | 21569529 | 201 days ago | IN | 0 ETH | 0.0000002 | ||||
| Claim All | 21568179 | 201 days ago | IN | 0 ETH | 0.00000013 | ||||
| Withdraw | 21567760 | 201 days ago | IN | 0 ETH | 0.00000011 | ||||
| Claim All | 21567737 | 201 days ago | IN | 0 ETH | 0.00000007 | ||||
| Claim All | 21567704 | 201 days ago | IN | 0 ETH | 0.00000012 | ||||
| Withdraw | 21567166 | 201 days ago | IN | 0 ETH | 0.00000009 | ||||
| Claim All | 21567154 | 201 days ago | IN | 0 ETH | 0.0000001 | ||||
| Withdraw | 21566387 | 201 days ago | IN | 0 ETH | 0.00000005 | ||||
| Claim All | 21566375 | 201 days ago | IN | 0 ETH | 0.00000005 | ||||
| Withdraw | 21566314 | 201 days ago | IN | 0 ETH | 0.00000005 | ||||
| Claim All | 21566307 | 201 days ago | IN | 0 ETH | 0.00000005 | ||||
| Withdraw | 21565824 | 201 days ago | IN | 0 ETH | 0.00000004 | ||||
| Claim All | 21565669 | 201 days ago | IN | 0 ETH | 0.00000004 | ||||
| Withdraw | 21565440 | 201 days ago | IN | 0 ETH | 0.00000027 | ||||
| Claim All | 21565431 | 201 days ago | IN | 0 ETH | 0.00000026 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 26898099 | 78 days ago | 0.00000045 ETH | ||||
| 26898055 | 78 days ago | 0.00000035 ETH | ||||
| 25658520 | 106 days ago | 0.00000128 ETH | ||||
| 25658465 | 106 days ago | 0.00000121 ETH | ||||
| 25658378 | 106 days ago | 0.00000121 ETH | ||||
| 25658333 | 106 days ago | 0.00000077 ETH | ||||
| 25656900 | 106 days ago | 0.00000058 ETH | ||||
| 23864712 | 148 days ago | 0.00000033 ETH | ||||
| 23117338 | 165 days ago | 0.00000282 ETH | ||||
| 23060049 | 167 days ago | 0.0002936 ETH | ||||
| 21694144 | 198 days ago | 0.0029906 ETH | ||||
| 21652210 | 199 days ago | 0.00001598 ETH | ||||
| 21652174 | 199 days ago | 0.00004684 ETH | ||||
| 21652174 | 199 days ago | 0.15623274 ETH | ||||
| 21578931 | 201 days ago | 0.00000005 ETH | ||||
| 21578897 | 201 days ago | 0.00083243 ETH | ||||
| 21572636 | 201 days ago | 0.00313529 ETH | ||||
| 21572270 | 201 days ago | 0.00243938 ETH | ||||
| 21572011 | 201 days ago | 0.01595125 ETH | ||||
| 21571283 | 201 days ago | 0.00549808 ETH | ||||
| 21571283 | 201 days ago | 18.33717194 ETH | ||||
| 21568289 | 201 days ago | 0.00003574 ETH | ||||
| 21567970 | 201 days ago | 0.00562786 ETH | ||||
| 21567704 | 201 days ago | 0.00161802 ETH | ||||
| 21567704 | 201 days ago | 5.39642417 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PtyPoolBuyLowV2
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 100 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
import "hardhat/console.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/math/Math.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "../libs/Constants.sol";
import "../libs/TokensTransfer.sol";
import "../interfaces/IBlast.sol";
import "../interfaces/IBlastPoints.sol";
import "../interfaces/IProtocolSettings.sol";
import "../interfaces/IUsb.sol";
import "../interfaces/IVault.sol";
import "../interfaces/IWandProtocol.sol";
import "../settings/ProtocolOwner.sol";
contract PtyPoolBuyLowV2 is ProtocolOwner, ReentrancyGuard {
using SafeMath for uint256;
using SafeERC20 for IERC20;
/* ========== STATE VARIABLES ========== */
IProtocolSettings public immutable settings;
IVault internal immutable _vault;
address internal _stakingUsbToken; // $USB
address internal _targetAssetToken; // $ETH / $WBTC / ...
address internal _stakingYieldsMarginToken; // $ETHx / ...
address internal _matchingYieldsAssetToken; // $ETH / ...
uint256 internal _totalStakingShares; // $USB LP shares
mapping(address => uint256) internal _userStakingShares;
uint256 internal _accruedMatchingYields; // $ETH / $WBTC / ...
uint256 internal _matchingYieldsPerShare;
mapping(address => uint256) internal _userMatchingYieldsPerSharePaid;
mapping(address => uint256) internal _userMatchingYields;
uint256 internal _targetTokensPerShare; // $ETH / $WBTC / ...
mapping(address => uint256) internal _userTargetTokensPerSharePaid;
mapping(address => uint256) internal _userTargetTokens;
uint256 internal _stakingYieldsPerShare; // $ETHx / ...
mapping(address => uint256) internal _userStakingYieldsPerSharePaid;
mapping(address => uint256) internal _userStakingYields;
/* ========== CONSTRUCTOR ========== */
constructor(
address _wandProtocol,
address _settings,
address _vault_,
address _stakingYieldsToken_,
address _matchingYieldsToken_
) ProtocolOwner(_wandProtocol) {
settings = IProtocolSettings(_settings);
_vault = IVault(_vault_);
_stakingYieldsMarginToken = _stakingYieldsToken_;
_matchingYieldsAssetToken = _matchingYieldsToken_;
_stakingUsbToken = wandProtocol.usbToken();
_targetAssetToken = _vault.assetToken();
require(_targetAssetToken == _matchingYieldsAssetToken, "PtyPoolBuyLowV2: target token and matching yields token mismatch");
}
receive() external payable {}
/* ========== VIEWS ========== */
function vault() public view returns (address) {
return address(_vault);
}
// $USB
function stakingToken() public view returns (address) {
return _stakingUsbToken;
}
// $ETH
function targetToken() public view returns (address) {
return _targetAssetToken;
}
// $ETHx
function stakingYieldsToken() public view returns (address) {
return _stakingYieldsMarginToken;
}
// $ETH
function matchingYieldsToken() public view returns (address) {
return _matchingYieldsAssetToken;
}
function totalStakingShares() public view returns (uint256) {
return _totalStakingShares;
}
function totalStakingBalance() external view returns (uint256) {
return _totalStakingBalance();
}
function userStakingShares(address account) public view returns (uint256) {
return _userStakingShares[account];
}
function userStakingBalance(address account) external view returns (uint256) {
return _userStakingBalance(account);
}
// $ETHx
function earnedStakingYields(address account) public view returns (uint256) {
return _userStakingShares[account].mul(_stakingYieldsPerShare.sub(_userStakingYieldsPerSharePaid[account])).div(1e18).add(_userStakingYields[account]);
}
// $ETH
function earnedMatchingYields(address account) public view returns (uint256) {
return _userStakingShares[account].mul(_matchingYieldsPerShare.sub(_userMatchingYieldsPerSharePaid[account])).div(1e18).add(_userMatchingYields[account]);
}
// $ETH
function earnedMatchedToken(address account) public view returns (uint256) {
return _userStakingShares[account].mul(_targetTokensPerShare.sub(_userTargetTokensPerSharePaid[account])).div(1e18).add(_userTargetTokens[account]);
}
function getStakingSharesByBalance(uint256 stakingBalance) external view returns (uint256) {
return _getStakingSharesByBalance(stakingBalance);
}
function getStakingBalanceByShares(uint256 stakingShares) external view returns (uint256) {
return _getStakingBalanceByShares(stakingShares);
}
// $ETH
function getAccruedMatchingYields() public view returns (uint256) {
return _accruedMatchingYields;
}
function claimableYields() public view returns (uint256) {
address blastAddress = wandProtocol.blastAddress();
if (blastAddress != address(0)) {
IBlast blast = IBlast(wandProtocol.blastAddress());
return blast.readClaimableYield(address(this));
}
return 0;
}
/* ========== MUTATIVE FUNCTIONS ========== */
function stake(uint256 amount) external nonReentrant onUserAction
updateStakingYields(_msgSender()) updateMatchingYields(_msgSender()) updateTargetTokens(_msgSender()) {
require(amount > 0, "Cannot stake 0");
uint256 sharesAmount = _getStakingSharesByBalance(amount);
_totalStakingShares = _totalStakingShares.add(sharesAmount);
_userStakingShares[_msgSender()] = _userStakingShares[_msgSender()].add(sharesAmount);
TokensTransfer.transferTokens(_stakingUsbToken, _msgSender(), address(this), amount);
emit Staked(_msgSender(), amount);
}
function withdraw(uint256 amount) public nonReentrant onUserAction
updateStakingYields(_msgSender()) updateMatchingYields(_msgSender()) updateTargetTokens(_msgSender()) {
require(amount > 0, "Cannot withdraw 0");
require(amount <= _userStakingBalance(_msgSender()), "Insufficient balance");
uint256 sharesAmount = _getStakingSharesByBalance(amount);
_totalStakingShares = _totalStakingShares.sub(sharesAmount);
_userStakingShares[_msgSender()] = _userStakingShares[_msgSender()].sub(sharesAmount);
TokensTransfer.transferTokens(_stakingUsbToken, address(this), _msgSender(), amount);
emit Withdrawn(_msgSender(), amount);
}
function getStakingYields() public nonReentrant onUserAction updateStakingYields(_msgSender()) {
uint256 userYields = _userStakingYields[_msgSender()];
if (userYields > 0) {
_userStakingYields[_msgSender()] = 0;
TokensTransfer.transferTokens(_stakingYieldsMarginToken, address(this), _msgSender(), userYields);
emit StakingYieldsPaid(_msgSender(), userYields);
}
}
function getMatchingYields() public nonReentrant onUserAction updateMatchingYields(_msgSender()) {
uint256 userYields = _userMatchingYields[_msgSender()];
if (userYields > 0) {
_userMatchingYields[_msgSender()] = 0;
TokensTransfer.transferTokens(_matchingYieldsAssetToken, address(this), _msgSender(), userYields);
emit MatchingYieldsPaid(_msgSender(), userYields);
}
}
function getMatchingOutTokens() public nonReentrant onUserAction updateTargetTokens(_msgSender()) {
uint256 userMatchedTokens = _userTargetTokens[_msgSender()];
if (userMatchedTokens > 0) {
_userTargetTokens[_msgSender()] = 0;
TokensTransfer.transferTokens(_targetAssetToken, address(this), _msgSender(), userMatchedTokens);
emit MatchedTokenPaid(_msgSender(), userMatchedTokens);
}
}
/**
* @notice Useful for Pty Pools Buy Low, since matching out tokens and yields tokens are all asset tokens.
*/
function getMatchingTokensAndYields() external {
getMatchingOutTokens();
getMatchingYields();
}
function claimAll() external {
getMatchingOutTokens();
getMatchingYields();
getStakingYields();
}
function exit() external {
withdraw(_userStakingBalance(_msgSender()));
getStakingYields();
getMatchingYields();
getMatchingOutTokens();
}
/* ========== RESTRICTED FUNCTIONS ========== */
/**
* Rescue tokens that are accidently sent to this contract
*/
function rescue(address token, address recipient) external nonReentrant onlyOwner {
require(token != address(0) && recipient != address(0), "Zero address detected");
require(token != _stakingUsbToken && token != _targetAssetToken && token != _stakingYieldsMarginToken && token != _matchingYieldsAssetToken, "Cannot rescue staking or yield tokens");
uint256 amount;
if (token == Constants.NATIVE_TOKEN) {
amount = address(this).balance;
}
else {
amount = IERC20(token).balanceOf(address(this));
}
require(amount > 0, "No tokens to rescue");
TokensTransfer.transferTokens(token, address(this), recipient, amount);
emit TokenRescued(token, recipient, amount);
}
/**
* Unclaimed $ETH in the pool will accrue yields from blast. Admin could claim the yields and send to the treasury.
*/
function claimYields(address recipient) external nonReentrant onlyOwner {
address blastAddress = wandProtocol.blastAddress();
if (blastAddress != address(0)) {
IBlast blast = IBlast(wandProtocol.blastAddress());
uint256 yields = blast.readClaimableYield(address(this));
if (yields > 0) {
blast.claimAllYield(address(this), recipient);
}
}
}
function configureBlastYieldsAndGas() external nonReentrant onlyVault {
address blastAddress = wandProtocol.blastAddress();
if (blastAddress != address(0)) {
IBlast blast = IBlast(wandProtocol.blastAddress());
blast.configureClaimableYield();
blast.configureClaimableGas();
}
}
function configureBlastPoints() external nonReentrant onlyVault {
address blastPointsAddress = wandProtocol.blastPointsAddress();
address blastPointsOperatorAddress = wandProtocol.blastPointsOperator();
if (blastPointsAddress != address(0) && blastPointsOperatorAddress != address(0)) {
IBlastPoints blastPoints = IBlastPoints(blastPointsAddress);
blastPoints.configurePointsOperator(blastPointsOperatorAddress);
}
}
// $ETHx; $ETHx should be transferred to this contract before calling this function
function addStakingYields(uint256 yieldsAmount) external nonReentrant updateStakingYields(address(0)) onlyVault {
require(yieldsAmount > 0, "Too small yields amount");
require(_totalStakingShares > 0, "No user stakes");
_stakingYieldsPerShare = _stakingYieldsPerShare.add(yieldsAmount.mul(1e18).div(_totalStakingShares));
emit StakingYieldsAdded(yieldsAmount);
}
// $ETH; $ETH should be transferred to this contract before calling this function
function addMatchingYields(uint256 yieldsAmount) external nonReentrant updateMatchingYields(address(0)) onlyVault {
require(yieldsAmount > 0, "Too small yields amount");
require(_totalStakingShares > 0, "No user stakes");
_accruedMatchingYields = _accruedMatchingYields.add(yieldsAmount);
emit MatchingYieldsAdded(yieldsAmount);
}
// $ETH; before calling this function, $USB should be burned, and $ETH should be transferred to this contract
function notifyBuyLowTriggered(uint256 assetAmountAdded) external nonReentrant updateTargetTokens(address(0)) onlyVault {
// require(_vault.vaultMode() == Constants.VaultMode.AdjustmentBelowAARS, "Vault not in adjustment below AARS mode");
_targetTokensPerShare = _targetTokensPerShare.add(assetAmountAdded.mul(1e18).div(_totalStakingShares));
emit MatchedTokensAdded(assetAmountAdded);
if (_accruedMatchingYields > 0) {
_matchingYieldsPerShare = _matchingYieldsPerShare.add(_accruedMatchingYields.mul(1e18).div(_totalStakingShares));
_accruedMatchingYields = 0;
}
}
/* ================= INTERNAL Functions ================ */
function _userStakingBalance(address account) internal view returns (uint256) {
return _getStakingBalanceByShares(_userStakingShares[account]);
}
function _totalStakingBalance() internal view returns (uint256) {
return IERC20(_stakingUsbToken).balanceOf(address(this));
}
function _getStakingSharesByBalance(uint256 stakingBalance) internal view returns (uint256) {
if (_totalStakingBalance() == 0 || _totalStakingShares == 0) return stakingBalance;
return stakingBalance
.mul(_totalStakingShares)
.div(_totalStakingBalance());
}
function _getStakingBalanceByShares(uint256 stakingShares) internal view returns (uint256) {
if (_totalStakingShares == 0) return 0;
return stakingShares
.mul(_totalStakingBalance())
.div(_totalStakingShares);
}
/* ========== MODIFIERS ========== */
modifier onUserAction() {
_;
address blastAddress = wandProtocol.blastAddress();
if (blastAddress != address(0)) {
IBlast blast = IBlast(blastAddress);
(uint256 etherSeconds, uint256 etherBalance, ,) = blast.readGasParams(address(this));
if (etherSeconds > 0 && etherBalance > 0) {
blast.claimAllGas(address(this), settings.treasury());
}
}
}
modifier onlyVault() {
require(_msgSender() == address(_vault), "Caller is not Vault");
_;
}
modifier updateStakingYields(address account) {
if (account != address(0)) {
_userStakingYields[account] = earnedStakingYields(account);
_userStakingYieldsPerSharePaid[account] = _stakingYieldsPerShare;
}
_;
}
modifier updateMatchingYields(address account) {
if (account != address(0)) {
_userMatchingYields[account] = earnedMatchingYields(account);
_userMatchingYieldsPerSharePaid[account] = _matchingYieldsPerShare;
}
_;
}
modifier updateTargetTokens(address account) {
if (account != address(0)) {
_userTargetTokens[account] = earnedMatchedToken(account);
_userTargetTokensPerSharePaid[account] = _targetTokensPerShare;
}
_;
}
/* ========== EVENTS ========== */
event Staked(address indexed user, uint256 amount);
event Withdrawn(address indexed user, uint256 amount);
event StakingYieldsAdded(uint256 yields);
event MatchingYieldsAdded(uint256 yields);
event MatchedTokensAdded(uint256 amount);
event StakingYieldsPaid(address indexed user, uint256 yields);
event MatchingYieldsPaid(address indexed user, uint256 yields);
event MatchedTokenPaid(address indexed user, uint256 amount);
event TokenRescued(address indexed token, address indexed recipient, uint256 amount);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/IERC20Permit.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
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");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to
* 0 before setting it to a non-zero value.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
* Revert on invalid signature.
*/
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// 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 cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/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.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1, "Math: mulDiv overflow");
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
enum YieldMode {
AUTOMATIC,
VOID,
CLAIMABLE
}
enum GasMode {
VOID,
CLAIMABLE
}
interface IBlast{
// configure
function configureContract(address contractAddress, YieldMode _yield, GasMode gasMode, address governor) external;
function configure(YieldMode _yield, GasMode gasMode, address governor) external;
// base configuration options
function configureClaimableYield() external;
function configureClaimableYieldOnBehalf(address contractAddress) external;
function configureAutomaticYield() external;
function configureAutomaticYieldOnBehalf(address contractAddress) external;
function configureVoidYield() external;
function configureVoidYieldOnBehalf(address contractAddress) external;
function configureClaimableGas() external;
function configureClaimableGasOnBehalf(address contractAddress) external;
function configureVoidGas() external;
function configureVoidGasOnBehalf(address contractAddress) external;
function configureGovernor(address _governor) external;
function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external;
// claim yield
function claimYield(address contractAddress, address recipientOfYield, uint256 amount) external returns (uint256);
function claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256);
// claim gas
function claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256);
function claimGasAtMinClaimRate(address contractAddress, address recipientOfGas, uint256 minClaimRateBips) external returns (uint256);
function claimMaxGas(address contractAddress, address recipientOfGas) external returns (uint256);
function claimGas(address contractAddress, address recipientOfGas, uint256 gasToClaim, uint256 gasSecondsToConsume) external returns (uint256);
// read functions
function readClaimableYield(address contractAddress) external view returns (uint256);
function readYieldConfiguration(address contractAddress) external view returns (uint8);
function readGasParams(address contractAddress) external view returns (uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode);
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
interface IBlastPoints {
function configurePointsOperator(address operator) external;
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
interface IProtocolSettings {
function treasury() external view returns (address);
function decimals() external view returns (uint256);
function isValidParam(bytes32 param, uint256 value) external view returns (bool);
function paramDefaultValue(bytes32 param) external view returns (uint256);
function vaultParamValue(address vault, bytes32 param) external view returns (uint256);
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IUsb is IERC20 {
function decimals() external view returns (uint8);
function getBalanceByShares(uint256 sharesAmount) external view returns (uint256);
function getSharesByBalance(uint256 balance) external view returns (uint256);
function configureBlastYieldsAndGas() external;
function mint(address to, uint256 amount) external returns (uint256);
function burn(address account, uint256 amount) external returns (uint256);
function transferShares(address to, uint256 sharesAmount) external returns (uint256);
function rebase(uint256 addedSupply) external;
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
import "../libs/Constants.sol";
interface IVault {
function vaultType() external pure returns (Constants.VaultType);
function AARDecimals() external pure returns (uint256);
function usbToken() external view returns (address);
function assetToken() external view returns (address);
function assetTokenDecimals() external view returns (uint8);
function assetTokenPrice() external view returns (uint256, uint256);
function assetBalance() external view returns (uint256);
function usbTotalSupply() external view returns (uint256);
function marginToken() external view returns (address);
function vaultMode() external view returns (Constants.VaultMode);
function paramValue(bytes32 param) external view returns (uint256);
function AARBelowSafeLineTime() external view returns (uint256);
function AARBelowCircuitBreakerLineTime() external view returns (uint256);
function configureBlastYieldsAndGas() external;
function configureBlastPoints() external;
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
interface IWandProtocol {
function protocolOwner() external view returns (address);
function usbToken() external view returns (address);
function blastAddress() external view returns (address);
function blastPointsAddress() external view returns (address);
function blastPointsOperator() external view returns (address);
function isVault(address vaultAddress) external view returns (bool);
function isVaultAsset(address assetToken) external view returns (bool);
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
library Constants {
/**
* @notice The address interpreted as native token of the chain.
*/
address public constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
uint256 public constant PROTOCOL_DECIMALS = 10;
struct Terms {
uint256 T1;
uint256 T2;
uint256 T3;
uint256 T4;
uint256 T5;
uint256 T6;
uint256 T7;
uint256 T8;
}
enum VaultType {
Volatile,
Stable
}
enum VaultMode {
Empty,
Stability,
AdjustmentBelowAARS,
AdjustmentAboveAARU
}
struct VaultState {
uint256 M_ETH;
uint256 P_ETH;
uint256 P_ETH_DECIMALS;
uint256 M_USB_ETH;
uint256 M_ETHx;
uint256 aar;
uint256 AART;
uint256 AARS;
uint256 AARU;
uint256 AARC;
uint256 AARDecimals;
uint256 RateR;
uint256 AARBelowSafeLineTime;
uint256 AARBelowCircuitBreakerLineTime;
}
struct StableVaultState {
uint256 M_USDC;
uint256 P_USDC;
uint256 P_USDC_DECIMALS;
uint256 M_USB_USDC;
uint256 M_USDCx;
uint256 aar;
// uint256 AART;
uint256 AARS;
// uint256 AARU;
// uint256 AARC;
uint256 AARDecimals;
uint256 RateR;
uint256 AARBelowSafeLineTime;
}
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "./Constants.sol";
library TokensTransfer {
using SafeERC20 for IERC20;
/// @dev Transfers a given amount of token.
function transferTokens(
address token,
address from,
address to,
uint256 amount
) internal {
if (token == Constants.NATIVE_TOKEN) {
safeTransferNativeToken(from, to, amount);
}
else {
safeTransferERC20(token, from, to, amount);
}
}
/// @dev Transfers `amount` of native token to `to`.
function safeTransferNativeToken(address from, address to, uint256 amount) internal {
require(from != to, "Same address");
require(from != address(0) && to != address(0), "Zero address");
require(from == address(this) || to == address(this), "One of the addresses must be this contract");
require(amount > 0, "Amount must be greater than 0");
if (to == address(this)) {
require(msg.value == amount, "Incorrect msg.value");
return;
}
// solhint-disable avoid-low-level-calls
// slither-disable-next-line low-level-calls
(bool success, ) = to.call{ value: amount }("");
require(success, "Native token transfer failed");
}
/// @dev Transfer `amount` of ERC20 token from `from` to `to`.
function safeTransferERC20(
address token,
address from,
address to,
uint256 amount
) internal {
require(from != to, "Same address");
require(from != address(0) && to != address(0), "Zero address");
// require(from == address(this) || to == address(this), "One of the addresses must be this contract");
require(amount > 0, "Amount must be greater than 0");
if (from == address(this)) {
IERC20(token).safeTransfer(to, amount);
}
else {
IERC20(token).safeTransferFrom(from, to, amount);
}
}
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
import "@openzeppelin/contracts/utils/Context.sol";
import "../interfaces/IWandProtocol.sol";
abstract contract ProtocolOwner is Context {
IWandProtocol public immutable wandProtocol;
constructor(address _wandProtocol_) {
require(_wandProtocol_ != address(0), "Zero address detected");
wandProtocol = IWandProtocol(_wandProtocol_);
}
modifier onlyProtocol() {
require(_msgSender() == address(wandProtocol), "Ownable: caller is not the protocol");
_;
}
modifier onlyOwner() {
require(_msgSender() == IWandProtocol(wandProtocol).protocolOwner(), "Ownable: caller is not the owner");
_;
}
function owner() public view returns(address) {
return IWandProtocol(wandProtocol).protocolOwner();
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS =
0x000000000000000000636F6e736F6c652e6c6f67;
function _sendLogPayloadImplementation(bytes memory payload) internal view {
address consoleAddress = CONSOLE_ADDRESS;
/// @solidity memory-safe-assembly
assembly {
pop(
staticcall(
gas(),
consoleAddress,
add(payload, 32),
mload(payload),
0,
0
)
)
}
}
function _castToPure(
function(bytes memory) internal view fnIn
) internal pure returns (function(bytes memory) pure fnOut) {
assembly {
fnOut := fnIn
}
}
function _sendLogPayload(bytes memory payload) internal pure {
_castToPure(_sendLogPayloadImplementation)(payload);
}
function log() internal pure {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
}
function logUint(uint256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function logString(string memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
}
function logBytes1(bytes1 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
}
function logBytes2(bytes2 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
}
function logBytes3(bytes3 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
}
function logBytes4(bytes4 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
}
function logBytes5(bytes5 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
}
function logBytes6(bytes6 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
}
function logBytes7(bytes7 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
}
function logBytes8(bytes8 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
}
function logBytes9(bytes9 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
}
function logBytes10(bytes10 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
}
function logBytes11(bytes11 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
}
function logBytes12(bytes12 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
}
function logBytes13(bytes13 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
}
function logBytes14(bytes14 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
}
function logBytes15(bytes15 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
}
function logBytes16(bytes16 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
}
function logBytes17(bytes17 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
}
function logBytes18(bytes18 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
}
function logBytes19(bytes19 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
}
function logBytes20(bytes20 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
}
function logBytes21(bytes21 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
}
function logBytes22(bytes22 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
}
function logBytes23(bytes23 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
}
function logBytes24(bytes24 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
}
function logBytes25(bytes25 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
}
function logBytes26(bytes26 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
}
function logBytes27(bytes27 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
}
function logBytes28(bytes28 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
}
function logBytes29(bytes29 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
}
function logBytes30(bytes30 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
}
function logBytes31(bytes31 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
}
function logBytes32(bytes32 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
}
function log(uint256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function log(string memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function log(bool p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function log(address p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function log(uint256 p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
}
function log(uint256 p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
}
function log(uint256 p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
}
function log(uint256 p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
}
function log(string memory p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
}
function log(string memory p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
}
function log(string memory p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
}
function log(string memory p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
}
function log(bool p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
}
function log(bool p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
}
function log(bool p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
}
function log(bool p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
}
function log(address p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
}
function log(address p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
}
function log(address p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
}
function log(address p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
}
function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
}
function log(uint256 p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
}
function log(uint256 p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
}
function log(uint256 p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
}
function log(uint256 p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
}
function log(uint256 p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
}
function log(uint256 p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
}
function log(uint256 p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
}
function log(uint256 p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
}
function log(string memory p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
}
function log(string memory p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
}
function log(string memory p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
}
function log(string memory p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
}
function log(string memory p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
}
function log(string memory p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
}
function log(string memory p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
}
function log(string memory p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
}
function log(string memory p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
}
function log(string memory p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
}
function log(string memory p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
}
function log(string memory p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
}
function log(bool p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
}
function log(bool p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
}
function log(bool p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
}
function log(bool p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
}
function log(bool p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
}
function log(bool p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
}
function log(bool p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
}
function log(bool p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
}
function log(bool p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
}
function log(bool p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
}
function log(bool p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
}
function log(bool p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
}
function log(bool p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
}
function log(bool p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
}
function log(bool p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
}
function log(bool p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
}
function log(address p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
}
function log(address p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
}
function log(address p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
}
function log(address p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
}
function log(address p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
}
function log(address p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
}
function log(address p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
}
function log(address p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
}
function log(address p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
}
function log(address p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
}
function log(address p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
}
function log(address p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
}
function log(address p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
}
function log(address p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
}
function log(address p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
}
function log(address p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
_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 pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
_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 pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
_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 pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
_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 pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
_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 pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
_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 pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
_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 pure {
_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 pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
}
}{
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 100,
"details": {
"yulDetails": {
"optimizerSteps": "u"
}
}
},
"viaIR": true,
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_wandProtocol","type":"address"},{"internalType":"address","name":"_settings","type":"address"},{"internalType":"address","name":"_vault_","type":"address"},{"internalType":"address","name":"_stakingYieldsToken_","type":"address"},{"internalType":"address","name":"_matchingYieldsToken_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MatchedTokenPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MatchedTokensAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"yields","type":"uint256"}],"name":"MatchingYieldsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"yields","type":"uint256"}],"name":"MatchingYieldsPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"yields","type":"uint256"}],"name":"StakingYieldsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"yields","type":"uint256"}],"name":"StakingYieldsPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenRescued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint256","name":"yieldsAmount","type":"uint256"}],"name":"addMatchingYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"yieldsAmount","type":"uint256"}],"name":"addStakingYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"claimYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimableYields","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"configureBlastPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configureBlastYieldsAndGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earnedMatchedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earnedMatchingYields","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earnedStakingYields","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAccruedMatchingYields","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMatchingOutTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMatchingTokensAndYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMatchingYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakingShares","type":"uint256"}],"name":"getStakingBalanceByShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakingBalance","type":"uint256"}],"name":"getStakingSharesByBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"matchingYieldsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetAmountAdded","type":"uint256"}],"name":"notifyBuyLowTriggered","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settings","outputs":[{"internalType":"contract IProtocolSettings","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingYieldsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"userStakingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"userStakingShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wandProtocol","outputs":[{"internalType":"contract IWandProtocol","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60e0604052346200009557620000226200001862000178565b93929092620002ae565b604051612c2f6200054182396080518181816103ee0152818161077c01528181610ab501528181610ccb01528181611ef20152818161224f015281816122a3015281816124e00152612676015260a05181818161067e0152610dbe015260c05181818161080501526124ae0152612c2f90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b03821117620000d257604052565b6200009a565b90620000ef620000e760405190565b9283620000b0565b565b6001600160a01b031690565b90565b6001600160a01b038116036200009557565b90505190620000ef8262000100565b919060a08382031262000095576200013a818462000112565b926200014a826020830162000112565b92620000fd6200015e846040850162000112565b936200016e816060860162000112565b9360800162000112565b6200019b62003170803803806200018f81620000d8565b92833981019062000121565b9091929394565b620000fd90620000f1906001600160a01b031682565b620000fd90620001a2565b620000fd90620001b8565b906001600160a01b03905b9181191691161790565b90620001f7620000fd620001ff92620001c3565b8254620001ce565b9055565b906020828203126200009557620000fd9162000112565b6040513d6000823e3d90fd5b6020808252620000fd91016040808252906020017f507479506f6f6c4275794c6f7756323a2074617267657420746f6b656e20616e81527f64206d61746368696e67207969656c647320746f6b656e206d69736d6174636860208201520190565b156200028f57565b60405162461bcd60e51b815280620002aa6004820162000226565b0390fd5b620002e792620002d3620002ef969593620002cd620002dc9462000487565b620001c3565b60a052620001c3565b60c0526003620001e3565b6004620001e3565b6200032560206200030c620002cd6080516001600160a01b031690565b632e207121906200031c60405190565b93849260e01b90565b825260049082905afa80156200041b576200034c9160009162000421575b506001620001e3565b62000379602062000369620002cd60c0516001600160a01b031690565b631083f761906200031c60405190565b825260049082905afa80156200041b57620003a091600091620003e6575b506002620001e3565b620000ef620003b76002546001600160a01b031690565b620003df620003d2620000f16004546001600160a01b031690565b916001600160a01b031690565b1462000287565b6200040c915060203d811162000413575b620004038183620000b0565b81019062000203565b3862000397565b503d620003f7565b6200021a565b6200043d915060203d81116200041357620004038183620000b0565b3862000343565b620000fd620000fd620000fd9290565b620000fd600162000444565b9060001990620001d9565b906200047f620000fd620001ff9262000444565b825462000460565b620004929062000510565b620000ef620004a062000454565b60006200046b565b620000f1620000fd620000fd9290565b620000fd90620004a8565b15620004cb57565b60405162461bcd60e51b815260206004820152601560248201527f5a65726f206164647265737320646574656374656400000000000000000000006044820152606490fd5b6200053b90620002cd62000529620000f16000620004b8565b6001600160a01b0383161415620004c3565b60805256fe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80630245f3191461023b5780630777e629146102365780630deab882146102315780630e58f7ab1461022c5780631b2a1914146102275780632e1a7d4d14610222578063327107f71461021d57806339db85c5146102185780633fef6dc1146102135780634e29a3331461020e5780634fdf5d1d1461020957806350c29a87146102045780636e9b6bf7146101ff57806370c6a17e146101fa57806372f702f3146101f557806374b0244a146101f0578063819b3b6c146101eb57806389a2166a146101e65780638da5cb5b146101e157806392a15942146101dc578063966d13ee146101d7578063a61fa677146101d2578063a694fc3a146101cd578063b36684ac146101c8578063ba4ef6d5146101c3578063c55bc29f146101be578063d1058e59146101b9578063d9a023e0146101b4578063ddef1953146101af578063e06174e4146101aa578063e766c835146101a5578063e833e07c146101a0578063e9fad8ee1461019b5763fbfa77cf0361000e576106ed565b6106d5565b6106bd565b6106a2565b610669565b610651565b610636565b61061e565b610606565b6105eb565b6105d3565b6105bb565b6105a0565b610585565b61056d565b610552565b610537565b61051f565b610504565b6104e9565b6104ce565b6104b3565b610498565b61046b565b61041a565b6103d9565b610382565b610367565b61034f565b610337565b610310565b6102d0565b6102a4565b610250565b600091031261024b57565b600080fd5b3461024b57610260366004610240565b610268611d68565b604051005b0390f35b805b0361024b57565b9050359061028782610271565b565b9060208282031261024b5761029d9161027a565b90565b9052565b3461024b5761026d6102bf6102ba366004610289565b610a5d565b6040515b9182918290815260200190565b3461024b576102e0366004610240565b61026d6102bf610ab0565b6001600160a01b031690565b6102a0906102eb565b60208101929161028791906102f7565b3461024b57610320366004610240565b61026d61032b610850565b60405191829182610300565b3461024b5761026861034a366004610289565b612956565b3461024b57610268610362366004610289565b611bcc565b3461024b57610377366004610240565b61026d61032b610846565b3461024b57610268610395366004610289565b612a11565b61029d906102eb906001600160a01b031682565b61029d9061039a565b61029d906103ae565b6102a0906103b7565b60208101929161028791906103c0565b3461024b576103e9366004610240565b61026d7f00000000000000000000000000000000000000000000000000000000000000005b604051918291826103c9565b3461024b5761042a366004610240565b610268612652565b610273816102eb565b9050359061028782610432565b919060408382031261024b5761029d90610462818561043b565b9360200161043b565b3461024b5761026861047e366004610448565b9061222d565b9060208282031261024b5761029d9161043b565b3461024b5761026d6102bf6104ae366004610484565b6108d1565b3461024b5761026d6102bf6104c9366004610289565b610a66565b3461024b576104de366004610240565b61026d6102bf610875565b3461024b576104f9366004610240565b61026d61032b61083c565b3461024b5761026d6102bf61051a366004610484565b61089f565b3461024b5761052f366004610240565b610268611ca1565b3461024b57610547366004610240565b61026d61032b61085a565b3461024b57610562366004610240565b61026d61032b610772565b3461024b57610268610580366004610289565b612b35565b3461024b5761026d6102bf61059b366004610484565b6108bb565b3461024b576105b0366004610240565b61026d6102bf610a6f565b3461024b576102686105ce366004610289565b611128565b3461024b576102686105e6366004610484565b612443565b3461024b5761026d6102bf610601366004610484565b6109db565b3461024b57610616366004610240565b610268611e37565b3461024b5761062e366004610240565b610268611e47565b3461024b5761026d6102bf61064c366004610484565b610a1c565b3461024b57610661366004610240565b6102686127c6565b3461024b57610679366004610240565b61026d7f000000000000000000000000000000000000000000000000000000000000000061040e565b3461024b576106b2366004610240565b61026d6102bf61087f565b3461024b576106cd366004610240565b610268611e2f565b3461024b576106e5366004610240565b610268611e5f565b3461024b576106fd366004610240565b61026d61032b610800565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761074057604052565b610708565b9050519061028782610432565b9060208282031261024b5761029d91610745565b6040513d6000823e3d90fd5b6107b860206107a07f00000000000000000000000000000000000000000000000000000000000000006103b7565b63c1d6ba69906107af60405190565b93849260e01b90565b825260049082905afa9081156107fb576000916107d3575090565b61029d915060203d81116107f4575b6107ec818361071e565b810190610752565b503d6107e2565b610766565b61029d7f00000000000000000000000000000000000000000000000000000000000000006103b7565b61029d906102eb565b61029d9054610829565b61029d6001610832565b61029d6002610832565b61029d6003610832565b61029d6004610832565b61029d9081565b61029d9054610864565b61029d600561086b565b61029d612b55565b90610891906103b7565b600052602052604060002090565b6108b661029d916108ae600090565b506006610887565b61086b565b61029d90612b3e565b61029d61029d61029d9290565b61029d906109356108b661092d6109166108ef6108b6866006610887565b6109106108fc600e61086b565b61090a6108b689600f610887565b9061097a565b90610997565b610927670de0b6b3a76400006108c4565b906109d1565b926010610887565b90610963565b634e487b7160e01b600052601160045260246000fd5b9190820180921161095e57565b61093b565b61029d9190610951565b9190820391821161095e57565b61029d919061096d565b8181029291811591840414171561095e57565b61029d9190610984565b634e487b7160e01b600052601260045260246000fd5b906109c1565b9190565b9081156109cc570490565b6109a1565b61029d91906109b7565b61029d906109356108b6610a146109166109f96108b6866006610887565b610910610a06600861086b565b61090a6108b6896009610887565b92600a610887565b61029d906109356108b6610a55610916610a3a6108b6866006610887565b610910610a47600b61086b565b61090a6108b689600c610887565b92600d610887565b61029d90612b6a565b61029d90612bc1565b61029d600761086b565b6102eb61029d61029d9290565b61029d90610a79565b9050519061028782610271565b9060208282031261024b5761029d91610a8f565b610ad97f00000000000000000000000000000000000000000000000000000000000000006103b7565b6349d3d5e1610ae760405190565b90610af28160e01b90565b8252602082600481865afa9182156107fb57600092610c0a575b50600091610b2a610b24610b1f85610a86565b6102eb565b916102eb565b03610b3a575061029d91506108c4565b60209150610b4b926107af60405190565b825260049082905afa9081156107fb57610b7b610b76610baf93602093600091610bed575b506103b7565b6103b7565b63ec3278e890610ba4610b8d306103b7565b92610b9760405190565b9586948593849360e01b90565b835260048301610300565b03915afa9081156107fb57600091610bc5575090565b61029d915060203d8111610be6575b610bde818361071e565b810190610a9c565b503d610bd4565b610c049150843d81116107f4576107ec818361071e565b38610b70565b610c2391925060203d81116107f4576107ec818361071e565b9038610b0c565b610c3b90610c36611187565b610cb8565b6102876111b9565b6002111561024b57565b9050519061028782610c43565b60808183031261024b57610c6e8282610a8f565b9261029d610c7f8460208501610a8f565b93610c8d8160408601610a8f565b93606001610c4d565b916020610287929493610cb1604082019660008301906102f7565b01906102f7565b610cc190610f0a565b610cfe6020610cef7f00000000000000000000000000000000000000000000000000000000000000006103b7565b6349d3d5e1906107af60405190565b825260049082905afa9081156107fb57600091610ed8575b50600090610d26610b1f83610a86565b610d2f826102eb565b03610d38575050565b610b76610d44916103b7565b63dde798a4610d52306103b7565b90610d66610d5f60405190565b9160e01b90565b815260808180610d798560048301610300565b0381865afa80156107fb576000918291610ea5575b50610d9b6109bd866108c4565b119081610e90575b50610dad57505050565b610dfa9163954fa5ee936020610de27f00000000000000000000000000000000000000000000000000000000000000006103b7565b6361d027b390610df160405190565b96879260e01b90565b825260049082905afa9384156107fb57600094610e6a575b50610e349060209495610e3f610e2760405190565b9788968795869460e01b90565b845260048401610c96565b03925af180156107fb57610e505750565b610e679060203d8111610be657610bde818361071e565b50565b6020945090610e88610e3492863d81116107f4576107ec818361071e565b945090610e12565b9050610e9e6109bd856108c4565b1138610da3565b9050610ec8915060803d8111610ed1575b610ec0818361071e565b810190610c5a565b50919091610d8e565b503d610eb6565b610ef0915060203d81116107f4576107ec818361071e565b38610d16565b9061029d61029d610f06926108c4565b9055565b6102879033610f1c610b1f6000610a86565b610f25826102eb565b03610f31575b50610f6c565b80610f51610f41610f66936108d1565b610f4c836010610887565b610ef6565b610f4c610f5e600e61086b565b91600f610887565b38610f2b565b6102879033610f7e610b1f6000610a86565b610f87826102eb565b03610f93575b50610fc9565b80610fae610fa3610fc3936109db565b610f4c83600a610887565b610f4c610fbb600861086b565b916009610887565b38610f8d565b6102879033610fdb610b1f6000610a86565b610fe4826102eb565b03610ff0575b5061106b565b8061100b61100061102093610a1c565b610f4c83600d610887565b610f4c611018600b61086b565b91600c610887565b38610fea565b0190565b1561103157565b60405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b6044820152606490fd5b0390fd5b61107f61107860006108c4565b821161102a565b6110c86110ce61108e83612b6a565b6110ab6110a48261109f600561086b565b610963565b6005610ef6565b610f4c6006916110b83390565b94859161109f6108b68487610887565b92610887565b6110ec826110dc6001610832565b836110e6306103b7565b916111c4565b6111236111197f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d926103b7565b926102c360405190565b0390a2565b61028790610c2a565b61029d60026108c4565b1561114257565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b610287611194600061086b565b6111a861119f611131565b9182141561113b565b6000610ef6565b61029d60016108c4565b6102876111a86111af565b9291906111e473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102eb565b6111ed856102eb565b036111fc57610287935061141b565b61028793611528565b1561120c57565b60405162461bcd60e51b815260206004820152600c60248201526b53616d65206164647265737360a01b6044820152606490fd5b1561124757565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b1561128257565b60405162461bcd60e51b815260206004820152602a60248201527f4f6e65206f662074686520616464726573736573206d757374206265207468696044820152691cc818dbdb9d1c9858dd60b21b6064820152608490fd5b156112e157565b60405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b1561132d57565b60405162461bcd60e51b8152602060048201526013602482015272496e636f7272656374206d73672e76616c756560681b6044820152606490fd5b9061028761137560405190565b928361071e565b67ffffffffffffffff811161074057602090601f01601f19160190565b906113ab6113a68361137c565b611368565b918252565b3d156113ca576113bf3d611399565b903d6000602084013e565b606090565b156113d657565b60405162461bcd60e51b815260206004820152601c60248201527f4e617469766520746f6b656e207472616e73666572206661696c6564000000006044820152606490fd5b90611438611428826102eb565b611431846102eb565b1415611205565b6114a660009261146b61144a85610a86565b611453816102eb565b61145c846102eb565b1415908161150d575b50611240565b611474306103b7565b90611481610b24836102eb565b1480156114ef575b6114929061127b565b610b1f61149e856108c4565b865b116112da565b6114af826102eb565b146114d8578190610287936114c360405190565b90818003925af16114d26113b0565b506113cf565b5050610287906114e96109bd349290565b14611326565b506114926114fc826102eb565b611505856102eb565b149050611489565b61151791506102eb565b611520856102eb565b141538611465565b929190611540611537836102eb565b611431836102eb565b61157f611579600061157461155482610a86565b61155d816102eb565b611566876102eb565b141590816115bc5750611240565b6108c4565b846114a0565b61158b610b1f306103b7565b611594826102eb565b036115ab57506115a6610287936103b7565b611614565b6115b7610287946103b7565b611686565b6115c691506102eb565b611520876102eb565b6115e86115e261029d9263ffffffff1690565b60e01b90565b6001600160e01b03191690565b916020610287929493611610604082019660008301906102f7565b0152565b6116576004926116486102879561162e63a9059cbb6115cf565b9261163860405190565b96879460208601908152016115f5565b6020820181038252038361071e565b61177f565b604090611610610287949695939661167c606084019860008501906102f7565b60208301906102f7565b9061165790611648610287956004956116a26323b872dd6115cf565b936116ac60405190565b978895602087019081520161165c565b6116c66020611399565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602082015290565b61029d6116bc565b801515610273565b90505190610287826116f7565b9060208282031261024b5761029d916116ff565b1561172757565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b6102879161178f61179e926103b7565b906117986116ef565b916117dc565b80516117ad6109bd60006108c4565b149081156117bc575b50611720565b6117d6915060206117cb825190565b81830101910161170c565b386117b6565b61029d92916117eb60006108c4565b9161184c565b156117f857565b60405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608490fd5b90600061029d9493819261185e606090565b5061187561186b306103b7565b83903110156117f1565b60208101905191855af16118876113b0565b916118d9565b1561189457565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b9192901561190b575081516118f16109bd60006108c4565b146118fa575090565b61190661029d91611911565b61188d565b8261198b565b3b61191f6109bd60006108c4565b1190565b60005b8381106119365750506000910152565b8181015183820152602001611926565b6119676119706020936110269361195b815190565b80835293849260200190565b95869101611923565b601f01601f191690565b602080825261029d92910190611946565b90611994825190565b6119a16109bd60006108c4565b11156119b05750805190602001fd5b611067906119bd60405190565b62461bcd60e51b81529182916004830161197a565b610c3b906119de611187565b610cc19061028790336119f4610b1f6000610a86565b6119fd826102eb565b03611a09575b50611a1f565b80610f51610f41611a19936108d1565b38611a03565b6102879033611a31610b1f6000610a86565b611a3a826102eb565b03611a46575b50611a5c565b80610fae610fa3611a56936109db565b38611a40565b6102879033611a6e610b1f6000610a86565b611a77826102eb565b03611a83575b50611b1c565b8061100b611000611a9393610a1c565b38611a7d565b15611aa057565b60405162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b6044820152606490fd5b15611ae057565b60405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606490fd5b611b30611b2960006108c4565b8211611a99565b33611b48611b4061029d83612b3e565b831115611ad9565b611b81611b5483612b6a565b611b6a6110a482611b65600561086b565b61097a565b610f4c836110c8600693611b656108b68487610887565b611b9f8282611b906001610832565b611b99306103b7565b906111c4565b6111236111197f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5926103b7565b610287906119d2565b611bdd611187565b610c3b610cc133611bf1610b1f6000610a86565b611bfa826102eb565b03611c09575b50610287611c1f565b80610f51610f41611c19936108d1565b38611c00565b601033611c2f6108b68284610887565b91600090611c3c826108c4565b8411611c49575b50505050565b610f4c836110c8611c59946108c4565b611c688282611b906003610832565b611c956111197f28c7e971bf13651f36ecae43985878241a3c9f1bbf46da9bb4dbf4baf6d146c5926103b7565b0390a238808080611c43565b610287611bd5565b611cb1611187565b610c3b610cc133611cc5610b1f6000610a86565b611cce826102eb565b03611cdd575b50610287611cf3565b80610fae610fa3611ced936109db565b38611cd4565b600a33611d036108b68284610887565b91600090611d10826108c4565b8411611d1c5750505050565b610f4c836110c8611d2c946108c4565b611d3b8282611b906004610832565b611c956111197f16170af92486b13822506c799b60d90566db7dd7a9948d206c487895e7f1c7a7926103b7565b610287611ca9565b611d78611187565b610c3b610cc133611d8c610b1f6000610a86565b611d95826102eb565b03611da4575b50610287611dba565b8061100b611000611db493610a1c565b38611d9b565b600d33611dca6108b68284610887565b91600090611dd7826108c4565b8411611de35750505050565b610f4c836110c8611df3946108c4565b611e028282611b906002610832565b611c956111197f028a7618a2d8f77fcfce10a6c69e1a551ddbdcc42846c1041a449b94d2f01660926103b7565b610287611d70565b611e3f611e2f565b610287611d68565b611e4f611e2f565b611e57611d68565b610287611ca1565b611e6b61036233612b3e565b611e73611ca1565b611e7b611d68565b610287611e2f565b90610c3b91611e90611187565b611ee5565b15611e9c57565b60405162461bcd60e51b815280611067600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b903391611f1660206107a07f00000000000000000000000000000000000000000000000000000000000000006103b7565b825260049082905afa9384156107fb57611f42610b2461028796611f4894600091611f4d575b506102eb565b14611e95565b61204b565b611f65915060203d81116107f4576107ec818361071e565b38611f3c565b15611f7257565b60405162461bcd60e51b815260206004820152601560248201527416995c9bc81859191c995cdcc819195d1958dd1959605a1b6044820152606490fd5b15611fb657565b60405162461bcd60e51b815260206004820152602560248201527f43616e6e6f7420726573637565207374616b696e67206f72207969656c6420746044820152646f6b656e7360d81b6064820152608490fd5b1561201057565b60405162461bcd60e51b81526020600482015260136024820152724e6f20746f6b656e7320746f2072657363756560681b6044820152606490fd5b9060009161207c61205b84610a86565b612064816102eb565b61206d846102eb565b14159081612212575b50611f6b565b612089610b1f6001610832565b612092826102eb565b1415806121f4575b806121d6575b806121b3575b6120af90611faf565b6120cc73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102eb565b6120d5826102eb565b03612150576120f76120f06120e9306103b7565b31946108c4565b8411612009565b61210b8383612105306103b7565b846111c4565b61214b61214161213b7f4143f7b5cb6ea007914c32b8a3e64cebc051d7f493fa0755454da1e47701e125936103b7565b936103b7565b936102c360405190565b0390a3565b6121736020612161610b76846103b7565b6370a0823190610ba4610b8d306103b7565b03915afa9081156107fb576120f7916120f091600091612195575b50946108c4565b6121ad915060203d8111610be657610bde818361071e565b3861218e565b506120af6121c4610b1f6004610832565b6121cd836102eb565b141590506120a6565b506121e4610b1f6003610832565b6121ed826102eb565b14156120a0565b50612202610b1f6002610832565b61220b826102eb565b141561209a565b61221c91506102eb565b612225846102eb565b141538612076565b9061028791611e83565b610c3b90612243611187565b339061227360206107a07f00000000000000000000000000000000000000000000000000000000000000006103b7565b825260049082905afa9283156107fb57611f42610b246102879561229e94600091611f4d57506102eb565b6122c77f00000000000000000000000000000000000000000000000000000000000000006103b7565b6349d3d5e16122d560405190565b916122e08260e01b90565b8352602083600481845afa9283156107fb57600093612423575b5060009261230d610b24610b1f86610a86565b036123185750505050565b612328916020916107af60405190565b825260049082905afa9081156107fb5761234d91610b769160009161240b57506103b7565b63ec3278e89061235c306103b7565b91612369610d5f60405190565b81526020818061237c8660048301610300565b0381855afa9081156107fb576000916123ed575b5061239d6109bd856108c4565b1115611c4357610e3460209363860043b66123ba610e2760405190565b03925af180156107fb576123d1575b808080611c43565b6123e89060203d8111610be657610bde818361071e565b6123c9565b612405915060203d8111610be657610bde818361071e565b38612390565b610c04915060203d81116107f4576107ec818361071e565b61243c91935060203d81116107f4576107ec818361071e565b91386122fa565b61028790612237565b612454611187565b610c3b61249e565b1561246357565b60405162461bcd60e51b815260206004820152601360248201527210d85b1b195c881a5cc81b9bdd0815985d5b1d606a1b6044820152606490fd5b6124d8335b6124d2610b24610b1f7f00000000000000000000000000000000000000000000000000000000000000006103b7565b1461245c565b6102876125047f00000000000000000000000000000000000000000000000000000000000000006103b7565b6349d3d5e161251260405190565b9161251d8260e01b90565b8352602083600481845afa9283156107fb57600093612632575b5060009261254a610b24610b1f86610a86565b0361255457505050565b612564916020916107af60405190565b825260049082905afa9081156107fb5761258991610b769160009161240b57506103b7565b63f098767a813b1561024b576125a1610d5f60405190565b8152828160048183865af180156107fb57612616575b50634e606c4790803b1561024b576125d49183916107af60405190565b8252818381600481015b03925af180156107fb576125f0575050565b8161028792903d1061260f575b612607818361071e565b810190610240565b503d6125fd565b61262c90833d851161260f57612607818361071e565b386125b7565b61264b91935060203d81116107f4576107ec818361071e565b9138612537565b61028761244c565b612662611187565b610c3b61266e336124a3565b61028761269a7f00000000000000000000000000000000000000000000000000000000000000006103b7565b63095f363c906126b36126ac60405190565b9260e01b90565b8252602082600481845afa9182156107fb576000926127a0575b5060206126e3916340ae3e14906107af60405190565b825260049082905afa9081156107fb57600091612782575b5060009161270883610a86565b612711816102eb565b61271a836102eb565b14159081612767575b5061272d57505050565b610b76612739916103b7565b906336b91f2b90823b1561024b576125de92610ba485809461275a60405190565b9687958694859360e01b90565b61277191506102eb565b61277a836102eb565b141538612723565b61279a915060203d81116107f4576107ec818361071e565b386126fb565b6126e39192506127be602091823d81116107f4576107ec818361071e565b9291506126cd565b61028761265a565b610c3b906127da611187565b610287906127e86000610a86565b6127f1816102eb565b6127fa826102eb565b03612806575b5061281c565b80610f51610f41612816936108d1565b38612800565b61028790612829336124a3565b6128b1565b1561283557565b60405162461bcd60e51b8152602060048201526017602482015276151bdbc81cdb585b1b081e5a595b191cc8185b5bdd5b9d604a1b6044820152606490fd5b1561287b57565b60405162461bcd60e51b815260206004820152600e60248201526d4e6f2075736572207374616b657360901b6044820152606490fd5b6128e560006128c96128c2826108c4565b841161282e565b6128df6109bd6128d9600561086b565b926108c4565b11612874565b61292361291c6128f5600e61086b565b61093561291261290c670de0b6b3a76400006108c4565b86610997565b610927600561086b565b600e610ef6565b6129517fef9997e3cc5a6aa364e4fcd642a78d1829153c8cc7d9c1d1f8a4d8a8f550340b916102c360405190565b0390a1565b610287906127ce565b610c3b9061296b611187565b610287906129796000610a86565b612982816102eb565b61298b826102eb565b03612997575b506129ad565b80610fae610fa36129a7936109db565b38612991565b610287906129ba336124a3565b6129cb60006128c96128c2826108c4565b6129e36129dc8261109f600761086b565b6007610ef6565b6129517f2c73fdf4d1f9c370b0d2bf8570e6b5e4d9fbb6369480509c6c4f6f2e01e090c6916102c360405190565b6102879061295f565b610c3b90612a26611187565b61028790612a346000610a86565b612a3d816102eb565b612a46826102eb565b03612a52575b50612a68565b8061100b611000612a6293610a1c565b38612a4c565b61028790612a75336124a3565b612a7f600b61086b565b90612aac612aa5612a97670de0b6b3a76400006108c4565b936109356129128686610997565b600b610ef6565b612ada7f548c13486a320e74478d352afe4d4686c434957a45d93c376a871a8a4b9fa6f9916102c360405190565b0390a1612ae7600761086b565b90600091612af76109bd846108c4565b11612b00575050565b61028791611574612b2e6129dc93610935612912612b1e600861086b565b92612b29600761086b565b610997565b6008610ef6565b61028790612a1a565b612b506108b661029d926108ae600090565b612bc1565b610baf6020612161610b76610b766001610832565b612b72612b55565b600090612b816109bd836108c4565b14908115612ba8575b5061029d57612ba061029d91610910600561086b565b610927612b55565b9050612bba6109bd6128d9600561086b565b1438612b8a565b612bcb600561086b565b600090612bda6109bd836108c4565b14612bef575061291261029d91610910612b55565b61029d91506108c456fea264697066735822122054736a480149a79d8cfaae7bf5cffbeb6cc5df5e6e52b5ea0f779436b2d6d30764736f6c6343000812003300000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f87933000000000000000000000000691867213c0d43c167e7c035e489ae36f3286141000000000000000000000000d79d6fe06f4c2b17291015169d1443f50d0c2838000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
Deployed Bytecode
0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80630245f3191461023b5780630777e629146102365780630deab882146102315780630e58f7ab1461022c5780631b2a1914146102275780632e1a7d4d14610222578063327107f71461021d57806339db85c5146102185780633fef6dc1146102135780634e29a3331461020e5780634fdf5d1d1461020957806350c29a87146102045780636e9b6bf7146101ff57806370c6a17e146101fa57806372f702f3146101f557806374b0244a146101f0578063819b3b6c146101eb57806389a2166a146101e65780638da5cb5b146101e157806392a15942146101dc578063966d13ee146101d7578063a61fa677146101d2578063a694fc3a146101cd578063b36684ac146101c8578063ba4ef6d5146101c3578063c55bc29f146101be578063d1058e59146101b9578063d9a023e0146101b4578063ddef1953146101af578063e06174e4146101aa578063e766c835146101a5578063e833e07c146101a0578063e9fad8ee1461019b5763fbfa77cf0361000e576106ed565b6106d5565b6106bd565b6106a2565b610669565b610651565b610636565b61061e565b610606565b6105eb565b6105d3565b6105bb565b6105a0565b610585565b61056d565b610552565b610537565b61051f565b610504565b6104e9565b6104ce565b6104b3565b610498565b61046b565b61041a565b6103d9565b610382565b610367565b61034f565b610337565b610310565b6102d0565b6102a4565b610250565b600091031261024b57565b600080fd5b3461024b57610260366004610240565b610268611d68565b604051005b0390f35b805b0361024b57565b9050359061028782610271565b565b9060208282031261024b5761029d9161027a565b90565b9052565b3461024b5761026d6102bf6102ba366004610289565b610a5d565b6040515b9182918290815260200190565b3461024b576102e0366004610240565b61026d6102bf610ab0565b6001600160a01b031690565b6102a0906102eb565b60208101929161028791906102f7565b3461024b57610320366004610240565b61026d61032b610850565b60405191829182610300565b3461024b5761026861034a366004610289565b612956565b3461024b57610268610362366004610289565b611bcc565b3461024b57610377366004610240565b61026d61032b610846565b3461024b57610268610395366004610289565b612a11565b61029d906102eb906001600160a01b031682565b61029d9061039a565b61029d906103ae565b6102a0906103b7565b60208101929161028791906103c0565b3461024b576103e9366004610240565b61026d7f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b5b604051918291826103c9565b3461024b5761042a366004610240565b610268612652565b610273816102eb565b9050359061028782610432565b919060408382031261024b5761029d90610462818561043b565b9360200161043b565b3461024b5761026861047e366004610448565b9061222d565b9060208282031261024b5761029d9161043b565b3461024b5761026d6102bf6104ae366004610484565b6108d1565b3461024b5761026d6102bf6104c9366004610289565b610a66565b3461024b576104de366004610240565b61026d6102bf610875565b3461024b576104f9366004610240565b61026d61032b61083c565b3461024b5761026d6102bf61051a366004610484565b61089f565b3461024b5761052f366004610240565b610268611ca1565b3461024b57610547366004610240565b61026d61032b61085a565b3461024b57610562366004610240565b61026d61032b610772565b3461024b57610268610580366004610289565b612b35565b3461024b5761026d6102bf61059b366004610484565b6108bb565b3461024b576105b0366004610240565b61026d6102bf610a6f565b3461024b576102686105ce366004610289565b611128565b3461024b576102686105e6366004610484565b612443565b3461024b5761026d6102bf610601366004610484565b6109db565b3461024b57610616366004610240565b610268611e37565b3461024b5761062e366004610240565b610268611e47565b3461024b5761026d6102bf61064c366004610484565b610a1c565b3461024b57610661366004610240565b6102686127c6565b3461024b57610679366004610240565b61026d7f0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f8793361040e565b3461024b576106b2366004610240565b61026d6102bf61087f565b3461024b576106cd366004610240565b610268611e2f565b3461024b576106e5366004610240565b610268611e5f565b3461024b576106fd366004610240565b61026d61032b610800565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761074057604052565b610708565b9050519061028782610432565b9060208282031261024b5761029d91610745565b6040513d6000823e3d90fd5b6107b860206107a07f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b6103b7565b63c1d6ba69906107af60405190565b93849260e01b90565b825260049082905afa9081156107fb576000916107d3575090565b61029d915060203d81116107f4575b6107ec818361071e565b810190610752565b503d6107e2565b610766565b61029d7f000000000000000000000000691867213c0d43c167e7c035e489ae36f32861416103b7565b61029d906102eb565b61029d9054610829565b61029d6001610832565b61029d6002610832565b61029d6003610832565b61029d6004610832565b61029d9081565b61029d9054610864565b61029d600561086b565b61029d612b55565b90610891906103b7565b600052602052604060002090565b6108b661029d916108ae600090565b506006610887565b61086b565b61029d90612b3e565b61029d61029d61029d9290565b61029d906109356108b661092d6109166108ef6108b6866006610887565b6109106108fc600e61086b565b61090a6108b689600f610887565b9061097a565b90610997565b610927670de0b6b3a76400006108c4565b906109d1565b926010610887565b90610963565b634e487b7160e01b600052601160045260246000fd5b9190820180921161095e57565b61093b565b61029d9190610951565b9190820391821161095e57565b61029d919061096d565b8181029291811591840414171561095e57565b61029d9190610984565b634e487b7160e01b600052601260045260246000fd5b906109c1565b9190565b9081156109cc570490565b6109a1565b61029d91906109b7565b61029d906109356108b6610a146109166109f96108b6866006610887565b610910610a06600861086b565b61090a6108b6896009610887565b92600a610887565b61029d906109356108b6610a55610916610a3a6108b6866006610887565b610910610a47600b61086b565b61090a6108b689600c610887565b92600d610887565b61029d90612b6a565b61029d90612bc1565b61029d600761086b565b6102eb61029d61029d9290565b61029d90610a79565b9050519061028782610271565b9060208282031261024b5761029d91610a8f565b610ad97f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b6103b7565b6349d3d5e1610ae760405190565b90610af28160e01b90565b8252602082600481865afa9182156107fb57600092610c0a575b50600091610b2a610b24610b1f85610a86565b6102eb565b916102eb565b03610b3a575061029d91506108c4565b60209150610b4b926107af60405190565b825260049082905afa9081156107fb57610b7b610b76610baf93602093600091610bed575b506103b7565b6103b7565b63ec3278e890610ba4610b8d306103b7565b92610b9760405190565b9586948593849360e01b90565b835260048301610300565b03915afa9081156107fb57600091610bc5575090565b61029d915060203d8111610be6575b610bde818361071e565b810190610a9c565b503d610bd4565b610c049150843d81116107f4576107ec818361071e565b38610b70565b610c2391925060203d81116107f4576107ec818361071e565b9038610b0c565b610c3b90610c36611187565b610cb8565b6102876111b9565b6002111561024b57565b9050519061028782610c43565b60808183031261024b57610c6e8282610a8f565b9261029d610c7f8460208501610a8f565b93610c8d8160408601610a8f565b93606001610c4d565b916020610287929493610cb1604082019660008301906102f7565b01906102f7565b610cc190610f0a565b610cfe6020610cef7f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b6103b7565b6349d3d5e1906107af60405190565b825260049082905afa9081156107fb57600091610ed8575b50600090610d26610b1f83610a86565b610d2f826102eb565b03610d38575050565b610b76610d44916103b7565b63dde798a4610d52306103b7565b90610d66610d5f60405190565b9160e01b90565b815260808180610d798560048301610300565b0381865afa80156107fb576000918291610ea5575b50610d9b6109bd866108c4565b119081610e90575b50610dad57505050565b610dfa9163954fa5ee936020610de27f0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f879336103b7565b6361d027b390610df160405190565b96879260e01b90565b825260049082905afa9384156107fb57600094610e6a575b50610e349060209495610e3f610e2760405190565b9788968795869460e01b90565b845260048401610c96565b03925af180156107fb57610e505750565b610e679060203d8111610be657610bde818361071e565b50565b6020945090610e88610e3492863d81116107f4576107ec818361071e565b945090610e12565b9050610e9e6109bd856108c4565b1138610da3565b9050610ec8915060803d8111610ed1575b610ec0818361071e565b810190610c5a565b50919091610d8e565b503d610eb6565b610ef0915060203d81116107f4576107ec818361071e565b38610d16565b9061029d61029d610f06926108c4565b9055565b6102879033610f1c610b1f6000610a86565b610f25826102eb565b03610f31575b50610f6c565b80610f51610f41610f66936108d1565b610f4c836010610887565b610ef6565b610f4c610f5e600e61086b565b91600f610887565b38610f2b565b6102879033610f7e610b1f6000610a86565b610f87826102eb565b03610f93575b50610fc9565b80610fae610fa3610fc3936109db565b610f4c83600a610887565b610f4c610fbb600861086b565b916009610887565b38610f8d565b6102879033610fdb610b1f6000610a86565b610fe4826102eb565b03610ff0575b5061106b565b8061100b61100061102093610a1c565b610f4c83600d610887565b610f4c611018600b61086b565b91600c610887565b38610fea565b0190565b1561103157565b60405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b6044820152606490fd5b0390fd5b61107f61107860006108c4565b821161102a565b6110c86110ce61108e83612b6a565b6110ab6110a48261109f600561086b565b610963565b6005610ef6565b610f4c6006916110b83390565b94859161109f6108b68487610887565b92610887565b6110ec826110dc6001610832565b836110e6306103b7565b916111c4565b6111236111197f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d926103b7565b926102c360405190565b0390a2565b61028790610c2a565b61029d60026108c4565b1561114257565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b610287611194600061086b565b6111a861119f611131565b9182141561113b565b6000610ef6565b61029d60016108c4565b6102876111a86111af565b9291906111e473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102eb565b6111ed856102eb565b036111fc57610287935061141b565b61028793611528565b1561120c57565b60405162461bcd60e51b815260206004820152600c60248201526b53616d65206164647265737360a01b6044820152606490fd5b1561124757565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b1561128257565b60405162461bcd60e51b815260206004820152602a60248201527f4f6e65206f662074686520616464726573736573206d757374206265207468696044820152691cc818dbdb9d1c9858dd60b21b6064820152608490fd5b156112e157565b60405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b1561132d57565b60405162461bcd60e51b8152602060048201526013602482015272496e636f7272656374206d73672e76616c756560681b6044820152606490fd5b9061028761137560405190565b928361071e565b67ffffffffffffffff811161074057602090601f01601f19160190565b906113ab6113a68361137c565b611368565b918252565b3d156113ca576113bf3d611399565b903d6000602084013e565b606090565b156113d657565b60405162461bcd60e51b815260206004820152601c60248201527f4e617469766520746f6b656e207472616e73666572206661696c6564000000006044820152606490fd5b90611438611428826102eb565b611431846102eb565b1415611205565b6114a660009261146b61144a85610a86565b611453816102eb565b61145c846102eb565b1415908161150d575b50611240565b611474306103b7565b90611481610b24836102eb565b1480156114ef575b6114929061127b565b610b1f61149e856108c4565b865b116112da565b6114af826102eb565b146114d8578190610287936114c360405190565b90818003925af16114d26113b0565b506113cf565b5050610287906114e96109bd349290565b14611326565b506114926114fc826102eb565b611505856102eb565b149050611489565b61151791506102eb565b611520856102eb565b141538611465565b929190611540611537836102eb565b611431836102eb565b61157f611579600061157461155482610a86565b61155d816102eb565b611566876102eb565b141590816115bc5750611240565b6108c4565b846114a0565b61158b610b1f306103b7565b611594826102eb565b036115ab57506115a6610287936103b7565b611614565b6115b7610287946103b7565b611686565b6115c691506102eb565b611520876102eb565b6115e86115e261029d9263ffffffff1690565b60e01b90565b6001600160e01b03191690565b916020610287929493611610604082019660008301906102f7565b0152565b6116576004926116486102879561162e63a9059cbb6115cf565b9261163860405190565b96879460208601908152016115f5565b6020820181038252038361071e565b61177f565b604090611610610287949695939661167c606084019860008501906102f7565b60208301906102f7565b9061165790611648610287956004956116a26323b872dd6115cf565b936116ac60405190565b978895602087019081520161165c565b6116c66020611399565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602082015290565b61029d6116bc565b801515610273565b90505190610287826116f7565b9060208282031261024b5761029d916116ff565b1561172757565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b6102879161178f61179e926103b7565b906117986116ef565b916117dc565b80516117ad6109bd60006108c4565b149081156117bc575b50611720565b6117d6915060206117cb825190565b81830101910161170c565b386117b6565b61029d92916117eb60006108c4565b9161184c565b156117f857565b60405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608490fd5b90600061029d9493819261185e606090565b5061187561186b306103b7565b83903110156117f1565b60208101905191855af16118876113b0565b916118d9565b1561189457565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b9192901561190b575081516118f16109bd60006108c4565b146118fa575090565b61190661029d91611911565b61188d565b8261198b565b3b61191f6109bd60006108c4565b1190565b60005b8381106119365750506000910152565b8181015183820152602001611926565b6119676119706020936110269361195b815190565b80835293849260200190565b95869101611923565b601f01601f191690565b602080825261029d92910190611946565b90611994825190565b6119a16109bd60006108c4565b11156119b05750805190602001fd5b611067906119bd60405190565b62461bcd60e51b81529182916004830161197a565b610c3b906119de611187565b610cc19061028790336119f4610b1f6000610a86565b6119fd826102eb565b03611a09575b50611a1f565b80610f51610f41611a19936108d1565b38611a03565b6102879033611a31610b1f6000610a86565b611a3a826102eb565b03611a46575b50611a5c565b80610fae610fa3611a56936109db565b38611a40565b6102879033611a6e610b1f6000610a86565b611a77826102eb565b03611a83575b50611b1c565b8061100b611000611a9393610a1c565b38611a7d565b15611aa057565b60405162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b6044820152606490fd5b15611ae057565b60405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606490fd5b611b30611b2960006108c4565b8211611a99565b33611b48611b4061029d83612b3e565b831115611ad9565b611b81611b5483612b6a565b611b6a6110a482611b65600561086b565b61097a565b610f4c836110c8600693611b656108b68487610887565b611b9f8282611b906001610832565b611b99306103b7565b906111c4565b6111236111197f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5926103b7565b610287906119d2565b611bdd611187565b610c3b610cc133611bf1610b1f6000610a86565b611bfa826102eb565b03611c09575b50610287611c1f565b80610f51610f41611c19936108d1565b38611c00565b601033611c2f6108b68284610887565b91600090611c3c826108c4565b8411611c49575b50505050565b610f4c836110c8611c59946108c4565b611c688282611b906003610832565b611c956111197f28c7e971bf13651f36ecae43985878241a3c9f1bbf46da9bb4dbf4baf6d146c5926103b7565b0390a238808080611c43565b610287611bd5565b611cb1611187565b610c3b610cc133611cc5610b1f6000610a86565b611cce826102eb565b03611cdd575b50610287611cf3565b80610fae610fa3611ced936109db565b38611cd4565b600a33611d036108b68284610887565b91600090611d10826108c4565b8411611d1c5750505050565b610f4c836110c8611d2c946108c4565b611d3b8282611b906004610832565b611c956111197f16170af92486b13822506c799b60d90566db7dd7a9948d206c487895e7f1c7a7926103b7565b610287611ca9565b611d78611187565b610c3b610cc133611d8c610b1f6000610a86565b611d95826102eb565b03611da4575b50610287611dba565b8061100b611000611db493610a1c565b38611d9b565b600d33611dca6108b68284610887565b91600090611dd7826108c4565b8411611de35750505050565b610f4c836110c8611df3946108c4565b611e028282611b906002610832565b611c956111197f028a7618a2d8f77fcfce10a6c69e1a551ddbdcc42846c1041a449b94d2f01660926103b7565b610287611d70565b611e3f611e2f565b610287611d68565b611e4f611e2f565b611e57611d68565b610287611ca1565b611e6b61036233612b3e565b611e73611ca1565b611e7b611d68565b610287611e2f565b90610c3b91611e90611187565b611ee5565b15611e9c57565b60405162461bcd60e51b815280611067600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b903391611f1660206107a07f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b6103b7565b825260049082905afa9384156107fb57611f42610b2461028796611f4894600091611f4d575b506102eb565b14611e95565b61204b565b611f65915060203d81116107f4576107ec818361071e565b38611f3c565b15611f7257565b60405162461bcd60e51b815260206004820152601560248201527416995c9bc81859191c995cdcc819195d1958dd1959605a1b6044820152606490fd5b15611fb657565b60405162461bcd60e51b815260206004820152602560248201527f43616e6e6f7420726573637565207374616b696e67206f72207969656c6420746044820152646f6b656e7360d81b6064820152608490fd5b1561201057565b60405162461bcd60e51b81526020600482015260136024820152724e6f20746f6b656e7320746f2072657363756560681b6044820152606490fd5b9060009161207c61205b84610a86565b612064816102eb565b61206d846102eb565b14159081612212575b50611f6b565b612089610b1f6001610832565b612092826102eb565b1415806121f4575b806121d6575b806121b3575b6120af90611faf565b6120cc73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102eb565b6120d5826102eb565b03612150576120f76120f06120e9306103b7565b31946108c4565b8411612009565b61210b8383612105306103b7565b846111c4565b61214b61214161213b7f4143f7b5cb6ea007914c32b8a3e64cebc051d7f493fa0755454da1e47701e125936103b7565b936103b7565b936102c360405190565b0390a3565b6121736020612161610b76846103b7565b6370a0823190610ba4610b8d306103b7565b03915afa9081156107fb576120f7916120f091600091612195575b50946108c4565b6121ad915060203d8111610be657610bde818361071e565b3861218e565b506120af6121c4610b1f6004610832565b6121cd836102eb565b141590506120a6565b506121e4610b1f6003610832565b6121ed826102eb565b14156120a0565b50612202610b1f6002610832565b61220b826102eb565b141561209a565b61221c91506102eb565b612225846102eb565b141538612076565b9061028791611e83565b610c3b90612243611187565b339061227360206107a07f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b6103b7565b825260049082905afa9283156107fb57611f42610b246102879561229e94600091611f4d57506102eb565b6122c77f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b6103b7565b6349d3d5e16122d560405190565b916122e08260e01b90565b8352602083600481845afa9283156107fb57600093612423575b5060009261230d610b24610b1f86610a86565b036123185750505050565b612328916020916107af60405190565b825260049082905afa9081156107fb5761234d91610b769160009161240b57506103b7565b63ec3278e89061235c306103b7565b91612369610d5f60405190565b81526020818061237c8660048301610300565b0381855afa9081156107fb576000916123ed575b5061239d6109bd856108c4565b1115611c4357610e3460209363860043b66123ba610e2760405190565b03925af180156107fb576123d1575b808080611c43565b6123e89060203d8111610be657610bde818361071e565b6123c9565b612405915060203d8111610be657610bde818361071e565b38612390565b610c04915060203d81116107f4576107ec818361071e565b61243c91935060203d81116107f4576107ec818361071e565b91386122fa565b61028790612237565b612454611187565b610c3b61249e565b1561246357565b60405162461bcd60e51b815260206004820152601360248201527210d85b1b195c881a5cc81b9bdd0815985d5b1d606a1b6044820152606490fd5b6124d8335b6124d2610b24610b1f7f000000000000000000000000691867213c0d43c167e7c035e489ae36f32861416103b7565b1461245c565b6102876125047f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b6103b7565b6349d3d5e161251260405190565b9161251d8260e01b90565b8352602083600481845afa9283156107fb57600093612632575b5060009261254a610b24610b1f86610a86565b0361255457505050565b612564916020916107af60405190565b825260049082905afa9081156107fb5761258991610b769160009161240b57506103b7565b63f098767a813b1561024b576125a1610d5f60405190565b8152828160048183865af180156107fb57612616575b50634e606c4790803b1561024b576125d49183916107af60405190565b8252818381600481015b03925af180156107fb576125f0575050565b8161028792903d1061260f575b612607818361071e565b810190610240565b503d6125fd565b61262c90833d851161260f57612607818361071e565b386125b7565b61264b91935060203d81116107f4576107ec818361071e565b9138612537565b61028761244c565b612662611187565b610c3b61266e336124a3565b61028761269a7f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b6103b7565b63095f363c906126b36126ac60405190565b9260e01b90565b8252602082600481845afa9182156107fb576000926127a0575b5060206126e3916340ae3e14906107af60405190565b825260049082905afa9081156107fb57600091612782575b5060009161270883610a86565b612711816102eb565b61271a836102eb565b14159081612767575b5061272d57505050565b610b76612739916103b7565b906336b91f2b90823b1561024b576125de92610ba485809461275a60405190565b9687958694859360e01b90565b61277191506102eb565b61277a836102eb565b141538612723565b61279a915060203d81116107f4576107ec818361071e565b386126fb565b6126e39192506127be602091823d81116107f4576107ec818361071e565b9291506126cd565b61028761265a565b610c3b906127da611187565b610287906127e86000610a86565b6127f1816102eb565b6127fa826102eb565b03612806575b5061281c565b80610f51610f41612816936108d1565b38612800565b61028790612829336124a3565b6128b1565b1561283557565b60405162461bcd60e51b8152602060048201526017602482015276151bdbc81cdb585b1b081e5a595b191cc8185b5bdd5b9d604a1b6044820152606490fd5b1561287b57565b60405162461bcd60e51b815260206004820152600e60248201526d4e6f2075736572207374616b657360901b6044820152606490fd5b6128e560006128c96128c2826108c4565b841161282e565b6128df6109bd6128d9600561086b565b926108c4565b11612874565b61292361291c6128f5600e61086b565b61093561291261290c670de0b6b3a76400006108c4565b86610997565b610927600561086b565b600e610ef6565b6129517fef9997e3cc5a6aa364e4fcd642a78d1829153c8cc7d9c1d1f8a4d8a8f550340b916102c360405190565b0390a1565b610287906127ce565b610c3b9061296b611187565b610287906129796000610a86565b612982816102eb565b61298b826102eb565b03612997575b506129ad565b80610fae610fa36129a7936109db565b38612991565b610287906129ba336124a3565b6129cb60006128c96128c2826108c4565b6129e36129dc8261109f600761086b565b6007610ef6565b6129517f2c73fdf4d1f9c370b0d2bf8570e6b5e4d9fbb6369480509c6c4f6f2e01e090c6916102c360405190565b6102879061295f565b610c3b90612a26611187565b61028790612a346000610a86565b612a3d816102eb565b612a46826102eb565b03612a52575b50612a68565b8061100b611000612a6293610a1c565b38612a4c565b61028790612a75336124a3565b612a7f600b61086b565b90612aac612aa5612a97670de0b6b3a76400006108c4565b936109356129128686610997565b600b610ef6565b612ada7f548c13486a320e74478d352afe4d4686c434957a45d93c376a871a8a4b9fa6f9916102c360405190565b0390a1612ae7600761086b565b90600091612af76109bd846108c4565b11612b00575050565b61028791611574612b2e6129dc93610935612912612b1e600861086b565b92612b29600761086b565b610997565b6008610ef6565b61028790612a1a565b612b506108b661029d926108ae600090565b612bc1565b610baf6020612161610b76610b766001610832565b612b72612b55565b600090612b816109bd836108c4565b14908115612ba8575b5061029d57612ba061029d91610910600561086b565b610927612b55565b9050612bba6109bd6128d9600561086b565b1438612b8a565b612bcb600561086b565b600090612bda6109bd836108c4565b14612bef575061291261029d91610910612b55565b61029d91506108c456fea264697066735822122054736a480149a79d8cfaae7bf5cffbeb6cc5df5e6e52b5ea0f779436b2d6d30764736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f87933000000000000000000000000691867213c0d43c167e7c035e489ae36f3286141000000000000000000000000d79d6fe06f4c2b17291015169d1443f50d0c2838000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
-----Decoded View---------------
Arg [0] : _wandProtocol (address): 0x31e9026bf3A20FA3250a94caD5E6BFbE203B001B
Arg [1] : _settings (address): 0x7449dc43a03e70050c4AcD3F8A6acab9A7F87933
Arg [2] : _vault_ (address): 0x691867213C0d43C167E7C035e489Ae36F3286141
Arg [3] : _stakingYieldsToken_ (address): 0xd79d6Fe06F4C2b17291015169d1443f50D0C2838
Arg [4] : _matchingYieldsToken_ (address): 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b
Arg [1] : 0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f87933
Arg [2] : 000000000000000000000000691867213c0d43c167e7c035e489ae36f3286141
Arg [3] : 000000000000000000000000d79d6fe06f4c2b17291015169d1443f50d0c2838
Arg [4] : 000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$10,337.21
Net Worth in ETH
3.636902
Token Allocations
ETH
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| BLAST | 100.00% | $2,842.38 | 3.6368 | $10,337.21 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.