Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
VLRFlashArbitrageV3
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
// =============================================================================
// INTERFACES
// =============================================================================
interface IBalancerV2Vault {
function flashLoan(
address recipient,
IERC20[] memory tokens,
uint256[] memory amounts,
bytes memory userData
) external;
}
interface IPermit2 {
function approve(address token, address spender, uint160 amount, uint48 expiration) external;
function allowance(address owner, address token, address spender) external view returns (uint160, uint48, uint48);
}
interface IUniversalRouter {
function execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline) external payable;
}
interface IQuoterV2 {
struct QuoteExactInputSingleParams {
address tokenIn;
address tokenOut;
uint256 amountIn;
uint24 fee;
uint160 sqrtPriceLimitX96;
}
function quoteExactInputSingle(QuoteExactInputSingleParams memory params)
external returns (uint256 amountOut, uint160 sqrtPriceX96After, uint32 initializedTicksCrossed, uint256 gasEstimate);
function quoteExactInput(bytes memory path, uint256 amountIn)
external returns (uint256 amountOut, uint160[] memory sqrtPriceX96AfterList, uint32[] memory initializedTicksCrossedList, uint256 gasEstimate);
}
interface IFutarchyRouter {
function splitPosition(address proposal, address collateralToken, uint256 amount) external;
function mergePositions(address proposal, address collateralToken, uint256 amount) external;
}
// =============================================================================
// VLR FLASH ARBITRAGE V3 - WITH SLIPPAGE PROTECTION
// =============================================================================
/**
* @title VLRFlashArbitrageV3
* @notice Flash arbitrage with on-chain slippage protection
* @dev Slippage uses Uniswap fee format: 500 = 0.05%, 3000 = 0.3%, 10000 = 1%
*
* Example:
* slippageBps = 500 → 0.05% slippage (tight, may fail)
* slippageBps = 3000 → 0.3% slippage (normal)
* slippageBps = 10000 → 1% slippage (safe)
* slippageBps = 100000 → 10% slippage (very loose)
*/
contract VLRFlashArbitrageV3 is ReentrancyGuard {
using SafeERC20 for IERC20;
// ==========================================================================
// CONSTANTS (Verified Mainnet Addresses)
// ==========================================================================
address public constant VLR = 0x4e107a0000DB66f0E9Fd2039288Bf811dD1f9c74;
address public constant USDS = 0xdC035D45d973E3EC169d2276DDab16f1e407384F;
address public constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
address public constant PROPOSAL = 0x4e018f1D8b93B91a0Ce186874eDb53CB6fFfCa62;
address public constant YES_VLR = 0x354582ff9f500f05b506666b75B33dbc90A8708d;
address public constant NO_VLR = 0x4B53aE333bB337c0C8123aD84CE2F541ed53746E;
address public constant YES_USDS = 0xa51aFa14963FaE9696b6844D652196959Eb5b9F6;
address public constant NO_USDS = 0x1a9c528Bc34a7267b1c51a8CD3fad9fC99136171;
IBalancerV2Vault public constant balancerVault = IBalancerV2Vault(0xBA12222222228d8Ba445958a75a0704d566BF2C8);
IPermit2 public constant permit2 = IPermit2(0x000000000022D473030F116dDEE9F6B43aC78BA3);
IUniversalRouter public constant universalRouter = IUniversalRouter(0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af);
IFutarchyRouter public constant futarchyRouter = IFutarchyRouter(0xAc9Bf8EbA6Bd31f8E8c76f8E8B2AAd0BD93f98Dc);
uint24 public constant OUTCOME_FEE = 500;
uint24 public constant USDS_USDC_FEE = 500;
uint24 public constant VLR_USDC_FEE = 3000;
bytes1 public constant V3_SWAP_EXACT_IN = 0x00;
uint160 private constant MAX_UINT160 = type(uint160).max;
uint48 private constant MAX_UINT48 = type(uint48).max;
uint256 private constant BPS_DENOMINATOR = 1_000_000; // 1M for precision (1% = 10000)
address public admin;
// ==========================================================================
// STRUCTS
// ==========================================================================
enum ArbitrageDirection { SPOT_SPLIT, MERGE_SPOT }
struct ArbitrageResult {
bool success;
uint256 profit;
uint256 borrowAmount;
uint256 gasUsed;
}
struct ArbitrageParams {
uint256 borrowAmount;
ArbitrageDirection direction;
uint256 minProfit;
uint256 slippageBps; // Slippage in bps: 500 = 0.05%, 3000 = 0.3%, 10000 = 1%
}
// Transient state
ArbitrageParams private _params;
address private _profitRecipient;
ArbitrageResult private _lastResult;
// ==========================================================================
// EVENTS & ERRORS
// ==========================================================================
event ArbitrageExecuted(
address indexed caller,
ArbitrageDirection direction,
uint256 borrowAmount,
uint256 profit,
uint256 slippageBps,
uint256 gasUsed
);
error ArbitrageFailed(uint256 balanceAfter, uint256 required, string reason);
error SlippageExceeded(uint256 expected, uint256 actual);
// ==========================================================================
// CONSTRUCTOR
// ==========================================================================
constructor() {
admin = msg.sender;
// Pre-approve all tokens to Permit2
IERC20(VLR).approve(address(permit2), type(uint256).max);
IERC20(USDS).approve(address(permit2), type(uint256).max);
IERC20(USDC).approve(address(permit2), type(uint256).max);
IERC20(YES_VLR).approve(address(permit2), type(uint256).max);
IERC20(NO_VLR).approve(address(permit2), type(uint256).max);
IERC20(YES_USDS).approve(address(permit2), type(uint256).max);
IERC20(NO_USDS).approve(address(permit2), type(uint256).max);
// Pre-approve Permit2 -> Universal Router
permit2.approve(VLR, address(universalRouter), MAX_UINT160, MAX_UINT48);
permit2.approve(USDS, address(universalRouter), MAX_UINT160, MAX_UINT48);
permit2.approve(USDC, address(universalRouter), MAX_UINT160, MAX_UINT48);
permit2.approve(YES_VLR, address(universalRouter), MAX_UINT160, MAX_UINT48);
permit2.approve(NO_VLR, address(universalRouter), MAX_UINT160, MAX_UINT48);
permit2.approve(YES_USDS, address(universalRouter), MAX_UINT160, MAX_UINT48);
permit2.approve(NO_USDS, address(universalRouter), MAX_UINT160, MAX_UINT48);
// Pre-approve to FutarchyRouter
IERC20(YES_VLR).approve(address(futarchyRouter), type(uint256).max);
IERC20(NO_VLR).approve(address(futarchyRouter), type(uint256).max);
IERC20(YES_USDS).approve(address(futarchyRouter), type(uint256).max);
IERC20(NO_USDS).approve(address(futarchyRouter), type(uint256).max);
IERC20(VLR).approve(address(futarchyRouter), type(uint256).max);
IERC20(USDS).approve(address(futarchyRouter), type(uint256).max);
}
// ==========================================================================
// EXTERNAL FUNCTIONS
// ==========================================================================
/**
* @notice Execute flash arbitrage with slippage protection
* @param borrowAmount Amount of VLR to flash borrow
* @param direction SPOT_SPLIT (0) or MERGE_SPOT (1)
* @param minProfit Minimum profit in VLR (MEV protection)
* @param slippageBps Slippage tolerance in bps (500 = 0.05%, 3000 = 0.3%, 10000 = 1%)
* @return result Arbitrage result with profit and gas used
*/
function executeArbitrage(
uint256 borrowAmount,
ArbitrageDirection direction,
uint256 minProfit,
uint256 slippageBps
) external nonReentrant returns (ArbitrageResult memory result) {
uint256 gasStart = gasleft();
// Store params
_params = ArbitrageParams({
borrowAmount: borrowAmount,
direction: direction,
minProfit: minProfit,
slippageBps: slippageBps
});
_profitRecipient = msg.sender;
// Flash loan
IERC20[] memory tokens = new IERC20[](1);
tokens[0] = IERC20(VLR);
uint256[] memory amounts = new uint256[](1);
amounts[0] = borrowAmount;
balancerVault.flashLoan(address(this), tokens, amounts, abi.encode(_params));
result = _lastResult;
result.gasUsed = gasStart - gasleft();
return result;
}
// ==========================================================================
// BALANCER CALLBACK
// ==========================================================================
function receiveFlashLoan(
IERC20[] memory,
uint256[] memory amounts,
uint256[] memory feeAmounts,
bytes memory userData
) external {
require(msg.sender == address(balancerVault), "Only Balancer Vault");
ArbitrageParams memory params = abi.decode(userData, (ArbitrageParams));
uint256 repayAmount = amounts[0] + feeAmounts[0];
// Execute strategy
if (params.direction == ArbitrageDirection.SPOT_SPLIT) {
_executeSpotSplit(params.borrowAmount, params.slippageBps);
} else {
_executeMergeSpot(params.borrowAmount, params.slippageBps);
}
// Check and repay
uint256 vlrBalance = IERC20(VLR).balanceOf(address(this));
if (vlrBalance < repayAmount) {
revert ArbitrageFailed(vlrBalance, repayAmount, "Insufficient to repay");
}
uint256 profit = vlrBalance - repayAmount;
if (profit < params.minProfit) {
revert ArbitrageFailed(vlrBalance, repayAmount, "Profit below minimum");
}
IERC20(VLR).transfer(address(balancerVault), repayAmount);
if (profit > 0) {
IERC20(VLR).safeTransfer(_profitRecipient, profit);
}
_lastResult = ArbitrageResult({
success: true,
profit: profit,
borrowAmount: params.borrowAmount,
gasUsed: 0
});
emit ArbitrageExecuted(_profitRecipient, params.direction, params.borrowAmount, profit, params.slippageBps, 0);
}
// ==========================================================================
// STRATEGY: SPOT_SPLIT WITH SLIPPAGE
// ==========================================================================
function _executeSpotSplit(uint256 amount, uint256 slippageBps) internal {
// 1. Split VLR -> YES_VLR + NO_VLR
futarchyRouter.splitPosition(PROPOSAL, VLR, amount);
// 2. Swap YES_VLR -> YES_USDS (with slippage protection)
uint256 yesVlrBal = IERC20(YES_VLR).balanceOf(address(this));
if (yesVlrBal > 0) {
_swapWithSlippage(YES_VLR, YES_USDS, OUTCOME_FEE, yesVlrBal, slippageBps);
}
// 3. Swap NO_VLR -> NO_USDS (with slippage protection)
uint256 noVlrBal = IERC20(NO_VLR).balanceOf(address(this));
if (noVlrBal > 0) {
_swapWithSlippage(NO_VLR, NO_USDS, OUTCOME_FEE, noVlrBal, slippageBps);
}
// 4. Merge
uint256 yesUsdsBal = IERC20(YES_USDS).balanceOf(address(this));
uint256 noUsdsBal = IERC20(NO_USDS).balanceOf(address(this));
uint256 mergeAmount = yesUsdsBal < noUsdsBal ? yesUsdsBal : noUsdsBal;
if (mergeAmount > 0) {
futarchyRouter.mergePositions(PROPOSAL, USDS, mergeAmount);
}
// 5. Swap USDS -> VLR (with slippage protection)
uint256 usdsBal = IERC20(USDS).balanceOf(address(this));
if (usdsBal > 0) {
_swapUsdsToVlrWithSlippage(usdsBal, slippageBps);
}
}
// ==========================================================================
// STRATEGY: MERGE_SPOT WITH SLIPPAGE
// ==========================================================================
function _executeMergeSpot(uint256 amount, uint256 slippageBps) internal {
// 1. Swap VLR -> USDS
_swapVlrToUsdsWithSlippage(amount, slippageBps);
// 2. Split USDS
uint256 usdsBal = IERC20(USDS).balanceOf(address(this));
futarchyRouter.splitPosition(PROPOSAL, USDS, usdsBal);
// 3. Swap YES_USDS -> YES_VLR
uint256 yesUsdsBal = IERC20(YES_USDS).balanceOf(address(this));
if (yesUsdsBal > 0) {
_swapWithSlippage(YES_USDS, YES_VLR, OUTCOME_FEE, yesUsdsBal, slippageBps);
}
// 4. Swap NO_USDS -> NO_VLR
uint256 noUsdsBal = IERC20(NO_USDS).balanceOf(address(this));
if (noUsdsBal > 0) {
_swapWithSlippage(NO_USDS, NO_VLR, OUTCOME_FEE, noUsdsBal, slippageBps);
}
// 5. Merge
uint256 yesVlrBal = IERC20(YES_VLR).balanceOf(address(this));
uint256 noVlrBal = IERC20(NO_VLR).balanceOf(address(this));
uint256 mergeAmount = yesVlrBal < noVlrBal ? yesVlrBal : noVlrBal;
if (mergeAmount > 0) {
futarchyRouter.mergePositions(PROPOSAL, VLR, mergeAmount);
}
}
// ==========================================================================
// SWAP WITH SLIPPAGE PROTECTION
// ==========================================================================
/**
* @dev Calculate amountOutMinimum based on amountIn and slippage
* @param amountIn Input amount
* @param slippageBps Slippage in bps (500 = 0.05%)
* @return Minimum output accepting slippage loss
*/
function _calcMinOut(uint256 amountIn, uint256 slippageBps) internal pure returns (uint256) {
// minOut = amountIn * (1 - slippage)
// For simplicity, we use amountIn as baseline (assumes 1:1 rough peg)
// In production, you'd want to use actual quote
return amountIn * (BPS_DENOMINATOR - slippageBps) / BPS_DENOMINATOR;
}
function _swapWithSlippage(
address tokenIn,
address tokenOut,
uint24 fee,
uint256 amountIn,
uint256 slippageBps
) internal {
bytes memory path = abi.encodePacked(tokenIn, fee, tokenOut);
// Calculate minOut based on slippage
// Using amountIn as rough estimate (for outcome tokens ~1:1 peg)
uint256 minOut = _calcMinOut(amountIn, slippageBps);
bytes memory swapParams = abi.encode(
address(this),
amountIn,
minOut, // SLIPPAGE PROTECTION!
path,
true
);
bytes memory commands = abi.encodePacked(V3_SWAP_EXACT_IN);
bytes[] memory inputs = new bytes[](1);
inputs[0] = swapParams;
universalRouter.execute(commands, inputs, block.timestamp);
}
function _swapUsdsToVlrWithSlippage(uint256 amountIn, uint256 slippageBps) internal {
bytes memory path = abi.encodePacked(USDS, USDS_USDC_FEE, USDC, VLR_USDC_FEE, VLR);
// For USDS->VLR, we need to account for VLR being ~500x more valuable
// USDS ~$1, VLR ~$0.002, so 1 USDS ≈ 500 VLR
// For now, use 0 minOut and rely on final profit check
uint256 minOut = 0; // Rely on minProfit check at the end
bytes memory swapParams = abi.encode(address(this), amountIn, minOut, path, true);
bytes memory commands = abi.encodePacked(V3_SWAP_EXACT_IN);
bytes[] memory inputs = new bytes[](1);
inputs[0] = swapParams;
universalRouter.execute(commands, inputs, block.timestamp);
}
function _swapVlrToUsdsWithSlippage(uint256 amountIn, uint256 slippageBps) internal {
bytes memory path = abi.encodePacked(VLR, VLR_USDC_FEE, USDC, USDS_USDC_FEE, USDS);
uint256 minOut = 0; // Rely on minProfit check
bytes memory swapParams = abi.encode(address(this), amountIn, minOut, path, true);
bytes memory commands = abi.encodePacked(V3_SWAP_EXACT_IN);
bytes[] memory inputs = new bytes[](1);
inputs[0] = swapParams;
universalRouter.execute(commands, inputs, block.timestamp);
}
// ==========================================================================
// ADMIN
// ==========================================================================
function recoverTokens(address token, uint256 amount) external {
require(msg.sender == admin, "Admin only");
IERC20(token).safeTransfer(admin, amount);
}
function transferAdmin(address newAdmin) external {
require(msg.sender == admin, "Admin only");
require(newAdmin != address(0), "Invalid admin");
admin = newAdmin;
}
receive() external payable {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)
pragma solidity >=0.6.2;
import {IERC20} from "./IERC20.sol";
import {IERC165} from "./IERC165.sol";
/**
* @title IERC1363
* @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
*
* Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
* after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
*/
interface IERC1363 is IERC20, IERC165 {
/*
* Note: the ERC-165 identifier for this interface is 0xb0202a11.
* 0xb0202a11 ===
* bytes4(keccak256('transferAndCall(address,uint256)')) ^
* bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
* bytes4(keccak256('approveAndCall(address,uint256)')) ^
* bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
*/
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @param data Additional data with no specified format, sent in call to `spender`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)
pragma solidity >=0.4.16;
import {IERC165} from "../utils/introspection/IERC165.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)
pragma solidity >=0.4.16;
import {IERC20} from "../token/ERC20/IERC20.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
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 value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` 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 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
import {IERC1363} from "../../../interfaces/IERC1363.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC-20 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 {
/**
* @dev An operation with an ERC-20 token failed.
*/
error SafeERC20FailedOperation(address token);
/**
* @dev Indicates a failed `decreaseAllowance` request.
*/
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);
/**
* @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.encodeCall(token.transfer, (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.encodeCall(token.transferFrom, (from, to, value)));
}
/**
* @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.
*/
function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.
*/
function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, 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.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
* value, non-reverting calls are assumed to be successful.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
unchecked {
uint256 currentAllowance = token.allowance(address(this), spender);
if (currentAllowance < requestedDecrease) {
revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
}
forceApprove(token, spender, currentAllowance - requestedDecrease);
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*
* NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
* only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
* set here.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
safeTransfer(token, to, value);
} else if (!token.transferAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
* has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
function transferFromAndCallRelaxed(
IERC1363 token,
address from,
address to,
uint256 value,
bytes memory data
) internal {
if (to.code.length == 0) {
safeTransferFrom(token, from, to, value);
} else if (!token.transferFromAndCall(from, to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
* Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
* once without retrying, and relies on the returned value to be true.
*
* Reverts if the returned value is other than `true`.
*/
function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
forceApprove(token, to, value);
} else if (!token.approveAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @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 {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
// bubble errors
if iszero(success) {
let ptr := mload(0x40)
returndatacopy(ptr, 0, returndatasize())
revert(ptr, returndatasize())
}
returnSize := returndatasize()
returnValue := mload(0)
}
if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @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 silently catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
bool success;
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
returnSize := returndatasize()
returnValue := mload(0)
}
return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @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 EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* 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;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
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
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// 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;
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": true,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"balanceAfter","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"name":"ArbitrageFailed","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"SlippageExceeded","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"enum VLRFlashArbitrageV3.ArbitrageDirection","name":"direction","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"slippageBps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasUsed","type":"uint256"}],"name":"ArbitrageExecuted","type":"event"},{"inputs":[],"name":"NO_USDS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NO_VLR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OUTCOME_FEE","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROPOSAL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDS_USDC_FEE","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V3_SWAP_EXACT_IN","outputs":[{"internalType":"bytes1","name":"","type":"bytes1"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VLR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VLR_USDC_FEE","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YES_USDS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YES_VLR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balancerVault","outputs":[{"internalType":"contract IBalancerV2Vault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"internalType":"enum VLRFlashArbitrageV3.ArbitrageDirection","name":"direction","type":"uint8"},{"internalType":"uint256","name":"minProfit","type":"uint256"},{"internalType":"uint256","name":"slippageBps","type":"uint256"}],"name":"executeArbitrage","outputs":[{"components":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"uint256","name":"profit","type":"uint256"},{"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"internalType":"uint256","name":"gasUsed","type":"uint256"}],"internalType":"struct VLRFlashArbitrageV3.ArbitrageResult","name":"result","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"futarchyRouter","outputs":[{"internalType":"contract IFutarchyRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"permit2","outputs":[{"internalType":"contract IPermit2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"feeAmounts","type":"uint256[]"},{"internalType":"bytes","name":"userData","type":"bytes"}],"name":"receiveFlashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"universalRouter","outputs":[{"internalType":"contract IUniversalRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080806040523462000b43576001600081815581546001600160a01b031916331790915563095ea7b360e01b82526e22d473030f116ddee9f6b43ac78ba3600483015260001960248301529060208160448185734e107a0000db66f0e9fd2039288bf811dd1f9c745af18015620009075762000b1f575b5060405163095ea7b360e01b81526e22d473030f116ddee9f6b43ac78ba3600482015260001960248201526020816044818573dc035d45d973e3ec169d2276ddab16f1e407384f5af18015620009075762000afb575b5060405163095ea7b360e01b81526e22d473030f116ddee9f6b43ac78ba3600482015260001960248201526020816044818573a0b86991c6218b36c1d19d4a2e9eb0ce3606eb485af18015620009075762000ad7575b5060405163095ea7b360e01b81526e22d473030f116ddee9f6b43ac78ba3600482015260001960248201526020816044818573354582ff9f500f05b506666b75b33dbc90a8708d5af18015620009075762000ab3575b5060405163095ea7b360e01b81526e22d473030f116ddee9f6b43ac78ba36004820152600019602482015260208160448185734b53ae333bb337c0c8123ad84ce2f541ed53746e5af18015620009075762000a8f575b5060405163095ea7b360e01b81526e22d473030f116ddee9f6b43ac78ba3600482015260001960248201526020816044818573a51afa14963fae9696b6844d652196959eb5b9f65af18015620009075762000a6b575b5060405163095ea7b360e01b81526e22d473030f116ddee9f6b43ac78ba36004820152600019602482015260208160448185731a9c528bc34a7267b1c51a8cd3fad9fc991361715af18015620009075762000a47575b506e22d473030f116ddee9f6b43ac78ba33b15620009ba576040516387517c4560e01b8152734e107a0000db66f0e9fd2039288bf811dd1f9c74600482015260008051602062002b0483398151915260248201526001600160a01b03604482015265ffffffffffff60648201528181608481836e22d473030f116ddee9f6b43ac78ba35af18015620009075762000a35575b506e22d473030f116ddee9f6b43ac78ba33b15620009ba576040516387517c4560e01b815273dc035d45d973e3ec169d2276ddab16f1e407384f600482015260008051602062002b0483398151915260248201526001600160a01b03604482015265ffffffffffff606482015281908181608481836e22d473030f116ddee9f6b43ac78ba35af18015620009075762000a1d575b50506e22d473030f116ddee9f6b43ac78ba33b15620009ba576040516387517c4560e01b815273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48600482015260008051602062002b0483398151915260248201526001600160a01b03604482015265ffffffffffff606482015281908181608481836e22d473030f116ddee9f6b43ac78ba35af18015620009075762000a05575b50506e22d473030f116ddee9f6b43ac78ba33b15620009ba576040516387517c4560e01b815273354582ff9f500f05b506666b75b33dbc90a8708d600482015260008051602062002b0483398151915260248201526001600160a01b03604482015265ffffffffffff606482015281908181608481836e22d473030f116ddee9f6b43ac78ba35af180156200090757620009ed575b50506e22d473030f116ddee9f6b43ac78ba33b15620009ba576040516387517c4560e01b8152734b53ae333bb337c0c8123ad84ce2f541ed53746e600482015260008051602062002b0483398151915260248201526001600160a01b03604482015265ffffffffffff606482015281908181608481836e22d473030f116ddee9f6b43ac78ba35af180156200090757620009d5575b50506e22d473030f116ddee9f6b43ac78ba33b15620009ba576040516387517c4560e01b815273a51afa14963fae9696b6844d652196959eb5b9f6600482015260008051602062002b0483398151915260248201526001600160a01b03604482015265ffffffffffff606482015281908181608481836e22d473030f116ddee9f6b43ac78ba35af180156200090757620009bd575b50506e22d473030f116ddee9f6b43ac78ba33b15620009ba576040516387517c4560e01b8152731a9c528bc34a7267b1c51a8cd3fad9fc99136171600482015260008051602062002b0483398151915260248201526001600160a01b03604482015265ffffffffffff606482015281908181608481836e22d473030f116ddee9f6b43ac78ba35af180156200090757620009a2575b505060405163095ea7b360e01b815260008051602062002b24833981519152600482015260001960248201526020816044818573354582ff9f500f05b506666b75b33dbc90a8708d5af1801562000907576200097e575b5060405163095ea7b360e01b815260008051602062002b248339815191526004820152600019602482015260208160448185734b53ae333bb337c0c8123ad84ce2f541ed53746e5af1801562000907576200095a575b5060405163095ea7b360e01b815260008051602062002b24833981519152600482015260001960248201526020816044818573a51afa14963fae9696b6844d652196959eb5b9f65af18015620009075762000936575b5060405163095ea7b360e01b815260008051602062002b248339815191526004820152600019602482015260208160448185731a9c528bc34a7267b1c51a8cd3fad9fc991361715af18015620009075762000912575b5060405163095ea7b360e01b815260008051602062002b248339815191526004820152600019602482015260208160448185734e107a0000db66f0e9fd2039288bf811dd1f9c745af180156200090757620008e3575b5060405163095ea7b360e01b815260008051602062002b2483398151915260048201526000196024820152906020826044818473dc035d45d973e3ec169d2276ddab16f1e407384f5af1908115620008d75750620008a1575b604051611f53908162000bb18239f35b620008c79060203d602011620008cf575b620008be818362000b72565b81019062000b96565b503862000891565b503d620008b2565b604051903d90823e3d90fd5b620008ff9060203d602011620008cf57620008be818362000b72565b503862000838565b6040513d84823e3d90fd5b6200092e9060203d602011620008cf57620008be818362000b72565b5038620007e2565b620009529060203d602011620008cf57620008be818362000b72565b50386200078c565b620009769060203d602011620008cf57620008be818362000b72565b503862000736565b6200099a9060203d602011620008cf57620008be818362000b72565b5038620006e0565b620009ad9062000b48565b620009ba57803862000689565b80fd5b620009c89062000b48565b620009ba578038620005f4565b620009e09062000b48565b620009ba5780386200055f565b620009f89062000b48565b620009ba578038620004ca565b62000a109062000b48565b620009ba57803862000435565b62000a289062000b48565b620009ba578038620003a0565b62000a409062000b48565b386200030c565b62000a639060203d602011620008cf57620008be818362000b72565b50386200027a565b62000a879060203d602011620008cf57620008be818362000b72565b503862000224565b62000aab9060203d602011620008cf57620008be818362000b72565b5038620001ce565b62000acf9060203d602011620008cf57620008be818362000b72565b503862000178565b62000af39060203d602011620008cf57620008be818362000b72565b503862000122565b62000b179060203d602011620008cf57620008be818362000b72565b5038620000cc565b62000b3b9060203d602011620008cf57620008be818362000b72565b503862000076565b600080fd5b6001600160401b03811162000b5c57604052565b634e487b7160e01b600052604160045260246000fd5b601f909101601f19168101906001600160401b0382119082101762000b5c57604052565b9081602091031262000b435751801515810362000b43579056fe6080604052600436101561001b575b361561001957600080fd5b005b6000803560e01c908163069c9fae14611b515781630db188b114611b2357816312261ee714611afa578163158274a514611acc57816321eaeb2614611a9e57816321f378841461010b5781633087c3eb14611a7057816335a9e4df14611a4257816337375cac14611a275781633dbdc00a1461174857816375829def146116c757816388519e7f1461169957816389a302711461166b578163b045d89e1461163d578163c8ef95ae1461160f578163cf69cb76146115e1578163d080f319146115c5578163de3cf10a14611597578163f04f27071461013b578163f851a44014610110575063f9dec1ce0361000e575b611c03565b346101385780600319360112610138576001546040516001600160a01b039091168152602090f35b80fd5b346101385760803660031901126101385767ffffffffffffffff6004358181116109265736602382011215610926578060040135906024602061017d84611cc0565b61018a6040519182611c9e565b848152019260051b820101903682116106f557602401915b81831061157757505050602435818111610926576101c4903690600401611cd8565b604435828111610d89576101dc903690600401611cd8565b906064358381116106f557366023820112156106f55780600401359384116115635784604051916102176020601f19601f8901160184611c9e565b85835260208301953660248284010111610926578060246020930188378301015273ba12222222228d8ba445958a75a0704d566bf2c83303611528576080818051810103126106f5576040519361026d85611c20565b51845260408101519160028310156106f95760806102a4926102ab9460208801526060810151604088015201516060860152611d71565b5191611d71565b518101809111611514576020820151600281101561150057610d8d5781518360608401519173ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc3b15610a0857604051906301abf04560e71b8252734e018f1d8b93b91a0ce186874edb53cb6fffca626004830152734e107a0000db66f0e9fd2039288bf811dd1f9c746024830152604482015281816064818373ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc5af1801561092a57610d75575b50506040516370a0823160e01b815230600482015260208160248173354582ff9f500f05b506666b75b33dbc90a8708d5afa9081156107db578591610d43575b5080158015610c01575b50506040516370a0823160e01b815230600482015290602082602481734b53ae333bb337c0c8123ad84ce2f541ed53746e5afa9182156107db578592610bcd575b5081158015610a88575b50506040516370a0823160e01b815230600482015284915060208160248173a51afa14963fae9696b6844d652196959eb5b9f65afa90811561092a578291610a53575b506040516370a0823160e01b8152306004820152602081602481731a9c528bc34a7267b1c51a8cd3fad9fc991361715afa908115610a48578391610a13575b5080821015610a0c57505b8061096a575b506040516370a0823160e01b815230600482015260208160248173dc035d45d973e3ec169d2276ddab16f1e407384f5afa90811561092a578291610935575b50806107e6575b50505b6040516370a0823160e01b815230600482015290734e107a0000db66f0e9fd2039288bf811dd1f9c7490602083602481855afa9283156107db5785936107a2575b508083106107585761051e8184611df7565b9260408501518410610710575060405163a9059cbb60e01b9182825273ba12222222228d8ba445958a75a0704d566bf2c86004830152602482015260208160448189875af18015610705576106c5575b5082610635575b5050815183606060405161058881611c20565b600181528460208201528360408201520152600160ff1960075416176007558160085560095582600a5560018060a01b03600654169160208101519160028310156106215791817f7dc20fd6062b52663e005c1468bf770e9043556e02bbf7869e8e543f5633a7ae93606060a09451920151916106086040518095611d94565b602084015260408301526060820152846080820152a280f35b634e487b7160e01b85526021600452602485fd5b60065460405160208082019384526001600160a01b03909216602482015260448101859052909160009161067681606481015b03601f198101835282611c9e565b519082855af1156106b9576000513d6106b05750803b155b6106985780610575565b60249060405190635274afe760e01b82526004820152fd5b6001141561068e565b6040513d6000823e3d90fd5b6020813d6020116106fd575b816106de60209383611c9e565b810103126106f95751801515036106f5578561056e565b8480fd5b8580fd5b3d91506106d1565b6040513d88823e3d90fd5b60a49160405191633566cf0d60e01b83526004830152602482015260606044820152601460648201527350726f6669742062656c6f77206d696e696d756d60601b6084820152fd5b8260a49160405191633566cf0d60e01b835260048301526024820152606060448201526015606482015274496e73756666696369656e7420746f20726570617960581b6084820152fd5b9092506020813d6020116107d3575b816107be60209383611c9e565b810103126107ce5751918561050c565b600080fd5b3d91506107b1565b6040513d87823e3d90fd5b60405173dc035d45d973e3ec169d2276ddab16f1e407384f60601b6020820152607d60ea1b60348201527314170d3238c43166d83a33a945d3d619c6c0dd6960631b603782015261017760eb1b604b8201527313841e800036d9bc3a7f480e4a22fe047747e71d60621b604e820152604281529061087a9061086783611c20565b6106686040519384923060208501611e04565b604051908260208301526001825261089182611c66565b610899611e6b565b906108a382611d71565b526108ad81611d71565b507366a9893cc07d91d95644aedd05d03f95e1dba8af3b1561092657604051630d64d59360e21b8152918391839182916108ed9142919060048501611ea0565b0381837366a9893cc07d91d95644aedd05d03f95e1dba8af5af1801561092a57156104c85761091b90611c52565b6109265782846104c8565b8280fd5b6040513d84823e3d90fd5b9150506020813d602011610962575b8161095160209383611c9e565b810103126107ce57839051856104c1565b3d9150610944565b73ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc3b15610a085760405190637abef8d160e01b8252734e018f1d8b93b91a0ce186874edb53cb6fffca62600483015273dc035d45d973e3ec169d2276ddab16f1e407384f6024830152604482015281816064818373ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc5af1801561092a5715610482576109fd90611c52565b610926578284610482565b5080fd5b905061047c565b9250506020823d602011610a40575b81610a2f60209383611c9e565b810103126107ce5784915186610471565b3d9150610a22565b6040513d85823e3d90fd5b9150506020813d602011610a80575b81610a6f60209383611c9e565b810103126107ce5783905185610432565b3d9150610a62565b6040517325a9d7199dd99be064091d6c26717aa0f6a9ba3760611b6020820152607d60ea1b6034820152731a9c528bc34a7267b1c51a8cd3fad9fc9913617160601b6037820152602b815291610add83611c82565b620f42400390620f42408211610bb757838281020482141715610bb757610668610b1a92620f424094604051958694820204903060208601611e3b565b604051906000602083015260018252610b3282611c66565b610b3a611e6b565b90610b4482611d71565b52610b4e81611d71565b507366a9893cc07d91d95644aedd05d03f95e1dba8af91823b156107ce57610b929260009283604051809681958294630d64d59360e21b8452429160048501611ea0565b03925af180156106b957610ba8575b80806103ef565b610bb190611c52565b83610ba1565b634e487b7160e01b600052601160045260246000fd5b9091506020813d602011610bf9575b81610be960209383611c9e565b810103126107ce575190856103e5565b3d9150610bdc565b60405173354582ff9f500f05b506666b75b33dbc90a8708d60601b6020820152607d60ea1b603482015273528d7d0a4b1fd74b4b5b4226b290cb4acf5adcfb60611b6037820152602b815290610c5682611c82565b83620f42400390620f42408211610bb757838281020482141715610bb757610668610c9492620f424094604051958694820204903060208601611e3b565b604051906000602083015260018252610cac82611c66565b610cb4611e6b565b90610cbe82611d71565b52610cc881611d71565b507366a9893cc07d91d95644aedd05d03f95e1dba8af3b156107ce57604051630d64d59360e21b81529160009183918291610d099142919060048501611ea0565b0381837366a9893cc07d91d95644aedd05d03f95e1dba8af5af180156106b957610d34575b806103a4565b610d3d90611c52565b84610d2e565b90506020813d602011610d6d575b81610d5e60209383611c9e565b810103126107ce57518561039a565b3d9150610d51565b610d7e90611c52565b610d8957838561035a565b8380fd5b815160608301516040517313841e800036d9bc3a7f480e4a22fe047747e71d60621b602082015261017760eb1b60348201527314170d3238c43166d83a33a945d3d619c6c0dd6960631b6037820152607d60ea1b604b82015273dc035d45d973e3ec169d2276ddab16f1e407384f60601b604e820152604281529091859190610e199061086783611c20565b6040519082602083015260018252610e3082611c66565b610e38611e6b565b90610e4282611d71565b52610e4c81611d71565b507366a9893cc07d91d95644aedd05d03f95e1dba8af3b1561092657604051630d64d59360e21b815291839183918291610e8c9142919060048501611ea0565b0381837366a9893cc07d91d95644aedd05d03f95e1dba8af5af1801561092a576114ec575b506040516370a0823160e01b815230600482015260208160248173dc035d45d973e3ec169d2276ddab16f1e407384f5afa90811561092a5782916114b7575b5073ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc3b15610a0857604051906301abf04560e71b8252734e018f1d8b93b91a0ce186874edb53cb6fffca62600483015273dc035d45d973e3ec169d2276ddab16f1e407384f6024830152604482015281816064818373ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc5af1801561092a576114a3575b50506040516370a0823160e01b815230600482015260208160248173a51afa14963fae9696b6844d652196959eb5b9f65afa9081156107db578591611471575b508015801561132f575b50506040516370a0823160e01b815230600482015290602082602481731a9c528bc34a7267b1c51a8cd3fad9fc991361715afa9182156107db5785926112fb575b50811580156111b9575b50506040516370a0823160e01b815230600482015284915060208160248173354582ff9f500f05b506666b75b33dbc90a8708d5afa90811561092a578291611184575b506040516370a0823160e01b8152306004820152602081602481734b53ae333bb337c0c8123ad84ce2f541ed53746e5afa908115610a4857839161114f575b508082101561114857505b806110aa575b50506104cb565b73ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc3b15610a085760405190637abef8d160e01b8252734e018f1d8b93b91a0ce186874edb53cb6fffca626004830152734e107a0000db66f0e9fd2039288bf811dd1f9c746024830152604482015281816064818373ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc5af1801561092a57156110a35761113d90611c52565b6109265782846110a3565b905061109d565b9250506020823d60201161117c575b8161116b60209383611c9e565b810103126107ce5784915186611092565b3d915061115e565b9150506020813d6020116111b1575b816111a060209383611c9e565b810103126107ce5783905185611053565b3d9150611193565b604051731a9c528bc34a7267b1c51a8cd3fad9fc9913617160601b6020820152607d60ea1b60348201527325a9d7199dd99be064091d6c26717aa0f6a9ba3760611b6037820152602b81529161120e83611c82565b620f42400390620f42408211610bb757838281020482141715610bb75761066861124b92620f424094604051958694820204903060208601611e3b565b60405190600060208301526001825261126382611c66565b61126b611e6b565b9061127582611d71565b5261127f81611d71565b507366a9893cc07d91d95644aedd05d03f95e1dba8af3b156107ce57604051630d64d59360e21b815291600091839182916112c09142919060048501611ea0565b0381837366a9893cc07d91d95644aedd05d03f95e1dba8af5af180156106b9576112ec575b8080611010565b6112f590611c52565b836112e5565b9091506020813d602011611327575b8161131760209383611c9e565b810103126107ce57519085611006565b3d915061130a565b60405173528d7d0a4b1fd74b4b5b4226b290cb4acf5adcfb60611b6020820152607d60ea1b603482015273354582ff9f500f05b506666b75b33dbc90a8708d60601b6037820152602b81529061138482611c82565b83620f42400390620f42408211610bb757838281020482141715610bb7576106686113c292620f424094604051958694820204903060208601611e3b565b6040519060006020830152600182526113da82611c66565b6113e2611e6b565b906113ec82611d71565b526113f681611d71565b507366a9893cc07d91d95644aedd05d03f95e1dba8af3b156107ce57604051630d64d59360e21b815291600091839182916114379142919060048501611ea0565b0381837366a9893cc07d91d95644aedd05d03f95e1dba8af5af180156106b957611462575b80610fc5565b61146b90611c52565b8461145c565b90506020813d60201161149b575b8161148c60209383611c9e565b810103126107ce575185610fbb565b3d915061147f565b6114ac90611c52565b610d89578385610f7b565b9150506020813d6020116114e4575b816114d360209383611c9e565b810103126107ce5784905186610ef0565b3d91506114c6565b6114f590611c52565b610d89578385610eb1565b634e487b7160e01b84526021600452602484fd5b634e487b7160e01b83526011600452602483fd5b60405162461bcd60e51b815260206004820152601360248201527213db9b1e4810985b185b98d95c8815985d5b1d606a1b6044820152606490fd5b634e487b7160e01b85526041600452602485fd5b82356001600160a01b03811681036106f9578152602092830192016101a2565b346101385780600319360112610138576020604051734b53ae333bb337c0c8123ad84ce2f541ed53746e8152f35b346101385780600319360112610138576020604051610bb88152f35b34610138578060031936011261013857602060405173a51afa14963fae9696b6844d652196959eb5b9f68152f35b34610138578060031936011261013857602060405173dc035d45d973e3ec169d2276ddab16f1e407384f8152f35b346101385780600319360112610138576020604051734e107a0000db66f0e9fd2039288bf811dd1f9c748152f35b34610138578060031936011261013857602060405173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488152f35b346101385780600319360112610138576020604051734e018f1d8b93b91a0ce186874edb53cb6fffca628152f35b34610138576020366003190112610138576116e0611bed565b600154906001600160a01b03906116fa3383851614611d38565b16908115611713576001600160a01b0319161760015580f35b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21030b236b4b760991b6044820152606490fd5b346101385760803660031901126101385760243560043560028210156109265760443592606435936040519361177d85611c20565b828552826060602096828882015282604082015201526002835414611a1557600283555a938660606040516117b181611c20565b838152848982015285604082015201528060025560ff80196003541692168092176003558260045586600555336bffffffffffffffffffffffff60a01b60065416176006556040519261180384611c66565b60018085528785019888368b37734e107a0000db66f0e9fd2039288bf811dd1f9c7461182e87611d71565b526040519261183c84611c66565b600184526118688a8501968b3689378661185587611d71565b52604051968c8801526040870190611d94565b606085015260808401526080835260a0830198838a1067ffffffffffffffff8b1117611a01578960405273ba12222222228d8ba445958a75a0704d566bf2c895863b156119fd57632e1c224f60e11b8b523060a4860152608060c486015251610124850181905287968b969095909490939092610144850192895b8d8282106119db579250505060a31993848685030160e48701525192838152019491885b8c8282106119c25750505050508183030161010482015283918591609f19916119309082611db7565b0301925af19384156119b5576080946119a6575b506040519261195284611c20565b60ff600754161515845260085481850190815260016009549360408701948552611987600a5496606089019788525a90611df7565b8652556040519451151585525190840152516040830152516060820152f35b6119af90611c52565b84611944565b50604051903d90823e3d90fd5b845188528b9a508e995096870196909301928201611907565b83516001600160a01b031686528c9b508f9a50948501949092019183016118e3565b8780fd5b634e487b7160e01b87526041600452602487fd5b604051633ee5aeb560e01b8152600490fd5b34610138578060031936011261013857602090604051908152f35b3461013857806003193601126101385760206040517366a9893cc07d91d95644aedd05d03f95e1dba8af8152f35b34610138578060031936011261013857602060405173354582ff9f500f05b506666b75b33dbc90a8708d8152f35b346101385780600319360112610138576020604051731a9c528bc34a7267b1c51a8cd3fad9fc991361718152f35b34610138578060031936011261013857602060405173ba12222222228d8ba445958a75a0704d566bf2c88152f35b3461013857806003193601126101385760206040516e22d473030f116ddee9f6b43ac78ba38152f35b34610138578060031936011261013857602060405173ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc8152f35b3461013857604036600319011261013857611b6a611bed565b6001546001600160a01b03908116916020918491611b89338614611d38565b60405163a9059cbb60e01b8582019081526001600160a01b0390961660248083019190915235604482015291169390611bc58160648101610668565b519082855af1156119b55781513d611be45750803b155b610698575080f35b60011415611bdc565b600435906001600160a01b03821682036107ce57565b346107ce5760003660031901126107ce5760206040516101f48152f35b6080810190811067ffffffffffffffff821117611c3c57604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111611c3c57604052565b6040810190811067ffffffffffffffff821117611c3c57604052565b6060810190811067ffffffffffffffff821117611c3c57604052565b90601f8019910116810190811067ffffffffffffffff821117611c3c57604052565b67ffffffffffffffff8111611c3c5760051b60200190565b9080601f830112156107ce576020908235611cf281611cc0565b93611d006040519586611c9e565b81855260208086019260051b8201019283116107ce57602001905b828210611d29575050505090565b81358152908301908301611d1b565b15611d3f57565b60405162461bcd60e51b815260206004820152600a60248201526941646d696e206f6e6c7960b01b6044820152606490fd5b805115611d7e5760200190565b634e487b7160e01b600052603260045260246000fd5b906002821015611da15752565b634e487b7160e01b600052602160045260246000fd5b919082519283825260005b848110611de3575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201611dc2565b91908203918211610bb757565b9392611e3690600193608093858060a01b0316875260208701526000604087015260a0606087015260a0860190611db7565b930152565b9493600193608093611e3693868060a01b031688526020880152604087015260a0606087015260a0860190611db7565b604051611e7781611c66565b600181528060005b602080821015611e9a57906060602092828501015201611e7f565b50505090565b93929190611eb690606086526060860190611db7565b906020858303818701528151908184528084019381808460051b8301019401946000915b848310611eef57505050505060409150930152565b90919293948480611f0c600193601f198682030187528a51611db7565b980193019301919594939290611eda56fea2646970667358221220dbcdaec0ad714d26fa3e3dee41f28aa46fca099b9bbd152d736af4a889afac7564736f6c6343000818003300000000000000000000000066a9893cc07d91d95644aedd05d03f95e1dba8af000000000000000000000000ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc
Deployed Bytecode
0x6080604052600436101561001b575b361561001957600080fd5b005b6000803560e01c908163069c9fae14611b515781630db188b114611b2357816312261ee714611afa578163158274a514611acc57816321eaeb2614611a9e57816321f378841461010b5781633087c3eb14611a7057816335a9e4df14611a4257816337375cac14611a275781633dbdc00a1461174857816375829def146116c757816388519e7f1461169957816389a302711461166b578163b045d89e1461163d578163c8ef95ae1461160f578163cf69cb76146115e1578163d080f319146115c5578163de3cf10a14611597578163f04f27071461013b578163f851a44014610110575063f9dec1ce0361000e575b611c03565b346101385780600319360112610138576001546040516001600160a01b039091168152602090f35b80fd5b346101385760803660031901126101385767ffffffffffffffff6004358181116109265736602382011215610926578060040135906024602061017d84611cc0565b61018a6040519182611c9e565b848152019260051b820101903682116106f557602401915b81831061157757505050602435818111610926576101c4903690600401611cd8565b604435828111610d89576101dc903690600401611cd8565b906064358381116106f557366023820112156106f55780600401359384116115635784604051916102176020601f19601f8901160184611c9e565b85835260208301953660248284010111610926578060246020930188378301015273ba12222222228d8ba445958a75a0704d566bf2c83303611528576080818051810103126106f5576040519361026d85611c20565b51845260408101519160028310156106f95760806102a4926102ab9460208801526060810151604088015201516060860152611d71565b5191611d71565b518101809111611514576020820151600281101561150057610d8d5781518360608401519173ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc3b15610a0857604051906301abf04560e71b8252734e018f1d8b93b91a0ce186874edb53cb6fffca626004830152734e107a0000db66f0e9fd2039288bf811dd1f9c746024830152604482015281816064818373ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc5af1801561092a57610d75575b50506040516370a0823160e01b815230600482015260208160248173354582ff9f500f05b506666b75b33dbc90a8708d5afa9081156107db578591610d43575b5080158015610c01575b50506040516370a0823160e01b815230600482015290602082602481734b53ae333bb337c0c8123ad84ce2f541ed53746e5afa9182156107db578592610bcd575b5081158015610a88575b50506040516370a0823160e01b815230600482015284915060208160248173a51afa14963fae9696b6844d652196959eb5b9f65afa90811561092a578291610a53575b506040516370a0823160e01b8152306004820152602081602481731a9c528bc34a7267b1c51a8cd3fad9fc991361715afa908115610a48578391610a13575b5080821015610a0c57505b8061096a575b506040516370a0823160e01b815230600482015260208160248173dc035d45d973e3ec169d2276ddab16f1e407384f5afa90811561092a578291610935575b50806107e6575b50505b6040516370a0823160e01b815230600482015290734e107a0000db66f0e9fd2039288bf811dd1f9c7490602083602481855afa9283156107db5785936107a2575b508083106107585761051e8184611df7565b9260408501518410610710575060405163a9059cbb60e01b9182825273ba12222222228d8ba445958a75a0704d566bf2c86004830152602482015260208160448189875af18015610705576106c5575b5082610635575b5050815183606060405161058881611c20565b600181528460208201528360408201520152600160ff1960075416176007558160085560095582600a5560018060a01b03600654169160208101519160028310156106215791817f7dc20fd6062b52663e005c1468bf770e9043556e02bbf7869e8e543f5633a7ae93606060a09451920151916106086040518095611d94565b602084015260408301526060820152846080820152a280f35b634e487b7160e01b85526021600452602485fd5b60065460405160208082019384526001600160a01b03909216602482015260448101859052909160009161067681606481015b03601f198101835282611c9e565b519082855af1156106b9576000513d6106b05750803b155b6106985780610575565b60249060405190635274afe760e01b82526004820152fd5b6001141561068e565b6040513d6000823e3d90fd5b6020813d6020116106fd575b816106de60209383611c9e565b810103126106f95751801515036106f5578561056e565b8480fd5b8580fd5b3d91506106d1565b6040513d88823e3d90fd5b60a49160405191633566cf0d60e01b83526004830152602482015260606044820152601460648201527350726f6669742062656c6f77206d696e696d756d60601b6084820152fd5b8260a49160405191633566cf0d60e01b835260048301526024820152606060448201526015606482015274496e73756666696369656e7420746f20726570617960581b6084820152fd5b9092506020813d6020116107d3575b816107be60209383611c9e565b810103126107ce5751918561050c565b600080fd5b3d91506107b1565b6040513d87823e3d90fd5b60405173dc035d45d973e3ec169d2276ddab16f1e407384f60601b6020820152607d60ea1b60348201527314170d3238c43166d83a33a945d3d619c6c0dd6960631b603782015261017760eb1b604b8201527313841e800036d9bc3a7f480e4a22fe047747e71d60621b604e820152604281529061087a9061086783611c20565b6106686040519384923060208501611e04565b604051908260208301526001825261089182611c66565b610899611e6b565b906108a382611d71565b526108ad81611d71565b507366a9893cc07d91d95644aedd05d03f95e1dba8af3b1561092657604051630d64d59360e21b8152918391839182916108ed9142919060048501611ea0565b0381837366a9893cc07d91d95644aedd05d03f95e1dba8af5af1801561092a57156104c85761091b90611c52565b6109265782846104c8565b8280fd5b6040513d84823e3d90fd5b9150506020813d602011610962575b8161095160209383611c9e565b810103126107ce57839051856104c1565b3d9150610944565b73ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc3b15610a085760405190637abef8d160e01b8252734e018f1d8b93b91a0ce186874edb53cb6fffca62600483015273dc035d45d973e3ec169d2276ddab16f1e407384f6024830152604482015281816064818373ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc5af1801561092a5715610482576109fd90611c52565b610926578284610482565b5080fd5b905061047c565b9250506020823d602011610a40575b81610a2f60209383611c9e565b810103126107ce5784915186610471565b3d9150610a22565b6040513d85823e3d90fd5b9150506020813d602011610a80575b81610a6f60209383611c9e565b810103126107ce5783905185610432565b3d9150610a62565b6040517325a9d7199dd99be064091d6c26717aa0f6a9ba3760611b6020820152607d60ea1b6034820152731a9c528bc34a7267b1c51a8cd3fad9fc9913617160601b6037820152602b815291610add83611c82565b620f42400390620f42408211610bb757838281020482141715610bb757610668610b1a92620f424094604051958694820204903060208601611e3b565b604051906000602083015260018252610b3282611c66565b610b3a611e6b565b90610b4482611d71565b52610b4e81611d71565b507366a9893cc07d91d95644aedd05d03f95e1dba8af91823b156107ce57610b929260009283604051809681958294630d64d59360e21b8452429160048501611ea0565b03925af180156106b957610ba8575b80806103ef565b610bb190611c52565b83610ba1565b634e487b7160e01b600052601160045260246000fd5b9091506020813d602011610bf9575b81610be960209383611c9e565b810103126107ce575190856103e5565b3d9150610bdc565b60405173354582ff9f500f05b506666b75b33dbc90a8708d60601b6020820152607d60ea1b603482015273528d7d0a4b1fd74b4b5b4226b290cb4acf5adcfb60611b6037820152602b815290610c5682611c82565b83620f42400390620f42408211610bb757838281020482141715610bb757610668610c9492620f424094604051958694820204903060208601611e3b565b604051906000602083015260018252610cac82611c66565b610cb4611e6b565b90610cbe82611d71565b52610cc881611d71565b507366a9893cc07d91d95644aedd05d03f95e1dba8af3b156107ce57604051630d64d59360e21b81529160009183918291610d099142919060048501611ea0565b0381837366a9893cc07d91d95644aedd05d03f95e1dba8af5af180156106b957610d34575b806103a4565b610d3d90611c52565b84610d2e565b90506020813d602011610d6d575b81610d5e60209383611c9e565b810103126107ce57518561039a565b3d9150610d51565b610d7e90611c52565b610d8957838561035a565b8380fd5b815160608301516040517313841e800036d9bc3a7f480e4a22fe047747e71d60621b602082015261017760eb1b60348201527314170d3238c43166d83a33a945d3d619c6c0dd6960631b6037820152607d60ea1b604b82015273dc035d45d973e3ec169d2276ddab16f1e407384f60601b604e820152604281529091859190610e199061086783611c20565b6040519082602083015260018252610e3082611c66565b610e38611e6b565b90610e4282611d71565b52610e4c81611d71565b507366a9893cc07d91d95644aedd05d03f95e1dba8af3b1561092657604051630d64d59360e21b815291839183918291610e8c9142919060048501611ea0565b0381837366a9893cc07d91d95644aedd05d03f95e1dba8af5af1801561092a576114ec575b506040516370a0823160e01b815230600482015260208160248173dc035d45d973e3ec169d2276ddab16f1e407384f5afa90811561092a5782916114b7575b5073ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc3b15610a0857604051906301abf04560e71b8252734e018f1d8b93b91a0ce186874edb53cb6fffca62600483015273dc035d45d973e3ec169d2276ddab16f1e407384f6024830152604482015281816064818373ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc5af1801561092a576114a3575b50506040516370a0823160e01b815230600482015260208160248173a51afa14963fae9696b6844d652196959eb5b9f65afa9081156107db578591611471575b508015801561132f575b50506040516370a0823160e01b815230600482015290602082602481731a9c528bc34a7267b1c51a8cd3fad9fc991361715afa9182156107db5785926112fb575b50811580156111b9575b50506040516370a0823160e01b815230600482015284915060208160248173354582ff9f500f05b506666b75b33dbc90a8708d5afa90811561092a578291611184575b506040516370a0823160e01b8152306004820152602081602481734b53ae333bb337c0c8123ad84ce2f541ed53746e5afa908115610a4857839161114f575b508082101561114857505b806110aa575b50506104cb565b73ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc3b15610a085760405190637abef8d160e01b8252734e018f1d8b93b91a0ce186874edb53cb6fffca626004830152734e107a0000db66f0e9fd2039288bf811dd1f9c746024830152604482015281816064818373ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc5af1801561092a57156110a35761113d90611c52565b6109265782846110a3565b905061109d565b9250506020823d60201161117c575b8161116b60209383611c9e565b810103126107ce5784915186611092565b3d915061115e565b9150506020813d6020116111b1575b816111a060209383611c9e565b810103126107ce5783905185611053565b3d9150611193565b604051731a9c528bc34a7267b1c51a8cd3fad9fc9913617160601b6020820152607d60ea1b60348201527325a9d7199dd99be064091d6c26717aa0f6a9ba3760611b6037820152602b81529161120e83611c82565b620f42400390620f42408211610bb757838281020482141715610bb75761066861124b92620f424094604051958694820204903060208601611e3b565b60405190600060208301526001825261126382611c66565b61126b611e6b565b9061127582611d71565b5261127f81611d71565b507366a9893cc07d91d95644aedd05d03f95e1dba8af3b156107ce57604051630d64d59360e21b815291600091839182916112c09142919060048501611ea0565b0381837366a9893cc07d91d95644aedd05d03f95e1dba8af5af180156106b9576112ec575b8080611010565b6112f590611c52565b836112e5565b9091506020813d602011611327575b8161131760209383611c9e565b810103126107ce57519085611006565b3d915061130a565b60405173528d7d0a4b1fd74b4b5b4226b290cb4acf5adcfb60611b6020820152607d60ea1b603482015273354582ff9f500f05b506666b75b33dbc90a8708d60601b6037820152602b81529061138482611c82565b83620f42400390620f42408211610bb757838281020482141715610bb7576106686113c292620f424094604051958694820204903060208601611e3b565b6040519060006020830152600182526113da82611c66565b6113e2611e6b565b906113ec82611d71565b526113f681611d71565b507366a9893cc07d91d95644aedd05d03f95e1dba8af3b156107ce57604051630d64d59360e21b815291600091839182916114379142919060048501611ea0565b0381837366a9893cc07d91d95644aedd05d03f95e1dba8af5af180156106b957611462575b80610fc5565b61146b90611c52565b8461145c565b90506020813d60201161149b575b8161148c60209383611c9e565b810103126107ce575185610fbb565b3d915061147f565b6114ac90611c52565b610d89578385610f7b565b9150506020813d6020116114e4575b816114d360209383611c9e565b810103126107ce5784905186610ef0565b3d91506114c6565b6114f590611c52565b610d89578385610eb1565b634e487b7160e01b84526021600452602484fd5b634e487b7160e01b83526011600452602483fd5b60405162461bcd60e51b815260206004820152601360248201527213db9b1e4810985b185b98d95c8815985d5b1d606a1b6044820152606490fd5b634e487b7160e01b85526041600452602485fd5b82356001600160a01b03811681036106f9578152602092830192016101a2565b346101385780600319360112610138576020604051734b53ae333bb337c0c8123ad84ce2f541ed53746e8152f35b346101385780600319360112610138576020604051610bb88152f35b34610138578060031936011261013857602060405173a51afa14963fae9696b6844d652196959eb5b9f68152f35b34610138578060031936011261013857602060405173dc035d45d973e3ec169d2276ddab16f1e407384f8152f35b346101385780600319360112610138576020604051734e107a0000db66f0e9fd2039288bf811dd1f9c748152f35b34610138578060031936011261013857602060405173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488152f35b346101385780600319360112610138576020604051734e018f1d8b93b91a0ce186874edb53cb6fffca628152f35b34610138576020366003190112610138576116e0611bed565b600154906001600160a01b03906116fa3383851614611d38565b16908115611713576001600160a01b0319161760015580f35b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21030b236b4b760991b6044820152606490fd5b346101385760803660031901126101385760243560043560028210156109265760443592606435936040519361177d85611c20565b828552826060602096828882015282604082015201526002835414611a1557600283555a938660606040516117b181611c20565b838152848982015285604082015201528060025560ff80196003541692168092176003558260045586600555336bffffffffffffffffffffffff60a01b60065416176006556040519261180384611c66565b60018085528785019888368b37734e107a0000db66f0e9fd2039288bf811dd1f9c7461182e87611d71565b526040519261183c84611c66565b600184526118688a8501968b3689378661185587611d71565b52604051968c8801526040870190611d94565b606085015260808401526080835260a0830198838a1067ffffffffffffffff8b1117611a01578960405273ba12222222228d8ba445958a75a0704d566bf2c895863b156119fd57632e1c224f60e11b8b523060a4860152608060c486015251610124850181905287968b969095909490939092610144850192895b8d8282106119db579250505060a31993848685030160e48701525192838152019491885b8c8282106119c25750505050508183030161010482015283918591609f19916119309082611db7565b0301925af19384156119b5576080946119a6575b506040519261195284611c20565b60ff600754161515845260085481850190815260016009549360408701948552611987600a5496606089019788525a90611df7565b8652556040519451151585525190840152516040830152516060820152f35b6119af90611c52565b84611944565b50604051903d90823e3d90fd5b845188528b9a508e995096870196909301928201611907565b83516001600160a01b031686528c9b508f9a50948501949092019183016118e3565b8780fd5b634e487b7160e01b87526041600452602487fd5b604051633ee5aeb560e01b8152600490fd5b34610138578060031936011261013857602090604051908152f35b3461013857806003193601126101385760206040517366a9893cc07d91d95644aedd05d03f95e1dba8af8152f35b34610138578060031936011261013857602060405173354582ff9f500f05b506666b75b33dbc90a8708d8152f35b346101385780600319360112610138576020604051731a9c528bc34a7267b1c51a8cd3fad9fc991361718152f35b34610138578060031936011261013857602060405173ba12222222228d8ba445958a75a0704d566bf2c88152f35b3461013857806003193601126101385760206040516e22d473030f116ddee9f6b43ac78ba38152f35b34610138578060031936011261013857602060405173ac9bf8eba6bd31f8e8c76f8e8b2aad0bd93f98dc8152f35b3461013857604036600319011261013857611b6a611bed565b6001546001600160a01b03908116916020918491611b89338614611d38565b60405163a9059cbb60e01b8582019081526001600160a01b0390961660248083019190915235604482015291169390611bc58160648101610668565b519082855af1156119b55781513d611be45750803b155b610698575080f35b60011415611bdc565b600435906001600160a01b03821682036107ce57565b346107ce5760003660031901126107ce5760206040516101f48152f35b6080810190811067ffffffffffffffff821117611c3c57604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111611c3c57604052565b6040810190811067ffffffffffffffff821117611c3c57604052565b6060810190811067ffffffffffffffff821117611c3c57604052565b90601f8019910116810190811067ffffffffffffffff821117611c3c57604052565b67ffffffffffffffff8111611c3c5760051b60200190565b9080601f830112156107ce576020908235611cf281611cc0565b93611d006040519586611c9e565b81855260208086019260051b8201019283116107ce57602001905b828210611d29575050505090565b81358152908301908301611d1b565b15611d3f57565b60405162461bcd60e51b815260206004820152600a60248201526941646d696e206f6e6c7960b01b6044820152606490fd5b805115611d7e5760200190565b634e487b7160e01b600052603260045260246000fd5b906002821015611da15752565b634e487b7160e01b600052602160045260246000fd5b919082519283825260005b848110611de3575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201611dc2565b91908203918211610bb757565b9392611e3690600193608093858060a01b0316875260208701526000604087015260a0606087015260a0860190611db7565b930152565b9493600193608093611e3693868060a01b031688526020880152604087015260a0606087015260a0860190611db7565b604051611e7781611c66565b600181528060005b602080821015611e9a57906060602092828501015201611e7f565b50505090565b93929190611eb690606086526060860190611db7565b906020858303818701528151908184528084019381808460051b8301019401946000915b848310611eef57505050505060409150930152565b90919293948480611f0c600193601f198682030187528a51611db7565b980193019301919594939290611eda56fea2646970667358221220dbcdaec0ad714d26fa3e3dee41f28aa46fca099b9bbd152d736af4a889afac7564736f6c63430008180033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.