Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,490 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact Token... | 12963596 | 1278 days ago | IN | 0.00739569 ETH | 0 | ||||
Swap Exact Token... | 12962785 | 1278 days ago | IN | 0.00775875 ETH | 0 | ||||
Swap Exact Token... | 12962383 | 1278 days ago | IN | 0.1 ETH | 0 | ||||
Swap Exact Token... | 12959576 | 1278 days ago | IN | 0.1 ETH | 0 | ||||
Swap Exact Token... | 12957714 | 1279 days ago | IN | 0.0069916 ETH | 0 | ||||
Swap Exact Token... | 12957526 | 1279 days ago | IN | 0.1208912 ETH | 0 | ||||
Swap Exact Token... | 12953783 | 1279 days ago | IN | 0.008 ETH | 0 | ||||
Swap Exact Token... | 12952239 | 1279 days ago | IN | 0.02536586 ETH | 0 | ||||
Swap Exact ETH F... | 12951831 | 1279 days ago | IN | 0.15619037 ETH | 0 | ||||
Swap Exact Token... | 12950208 | 1280 days ago | IN | 0.00669707 ETH | 0 | ||||
Swap Exact ETH F... | 12949378 | 1280 days ago | IN | 0.10555026 ETH | 0 | ||||
Swap Exact Token... | 12948035 | 1280 days ago | IN | 0.00551939 ETH | 0 | ||||
Swap Exact Token... | 12947302 | 1280 days ago | IN | 0.019087 ETH | 0 | ||||
Swap Exact Token... | 12946533 | 1280 days ago | IN | 0.12142351 ETH | 0 | ||||
Swap Exact Token... | 12945755 | 1280 days ago | IN | 0.05 ETH | 0 | ||||
Swap Exact ETH F... | 12945598 | 1280 days ago | IN | 0.40595704 ETH | 0 | ||||
Swap Exact ETH F... | 12944575 | 1281 days ago | IN | 0.1355231 ETH | 0 | ||||
Swap Exact Token... | 12944431 | 1281 days ago | IN | 0.00742387 ETH | 0 | ||||
Swap Exact ETH F... | 12944221 | 1281 days ago | IN | 1.21841275 ETH | 0 | ||||
Swap Exact ETH F... | 12942544 | 1281 days ago | IN | 2.61703886 ETH | 0 | ||||
Swap Exact Token... | 12940842 | 1281 days ago | IN | 0.13217144 ETH | 0 | ||||
Swap Exact ETH F... | 12925596 | 1284 days ago | IN | 0.18925959 ETH | 0 | ||||
Swap Exact ETH F... | 12925446 | 1284 days ago | IN | 0.15134053 ETH | 0 | ||||
Swap Exact ETH F... | 12924963 | 1284 days ago | IN | 0.10936999 ETH | 0 | ||||
Swap Exact ETH F... | 12924950 | 1284 days ago | IN | 0.10900116 ETH | 0 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
13516418 | 1192 days ago | 0.00000018 ETH | ||||
13516418 | 1192 days ago | 0.00000018 ETH | ||||
13516418 | 1192 days ago | 0.00000009 ETH | ||||
13516418 | 1192 days ago | 0.00000009 ETH | ||||
12963596 | 1278 days ago | 0.00739569 ETH | ||||
12962785 | 1278 days ago | 0.00775875 ETH | ||||
12962383 | 1278 days ago | 0.1 ETH | ||||
12959576 | 1278 days ago | 0.1 ETH | ||||
12957714 | 1279 days ago | 0.0069916 ETH | ||||
12957526 | 1279 days ago | 0.1208912 ETH | ||||
12953783 | 1279 days ago | 0.008 ETH | ||||
12952239 | 1279 days ago | 0.02536586 ETH | ||||
12951831 | 1279 days ago | 0.15004628 ETH | ||||
12951831 | 1279 days ago | 0.00614409 ETH | ||||
12950208 | 1280 days ago | 0.00669707 ETH | ||||
12949378 | 1280 days ago | 0.1 ETH | ||||
12949378 | 1280 days ago | 0.00555026 ETH | ||||
12948035 | 1280 days ago | 0.00551939 ETH | ||||
12947302 | 1280 days ago | 0.019087 ETH | ||||
12946533 | 1280 days ago | 0.12142351 ETH | ||||
12945755 | 1280 days ago | 0.05 ETH | ||||
12945598 | 1280 days ago | 0.4 ETH | ||||
12945598 | 1280 days ago | 0.00595704 ETH | ||||
12944575 | 1281 days ago | 0.13 ETH | ||||
12944575 | 1281 days ago | 0.0055231 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ArcherSwapRouter
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* Copyright 2021 Archer DAO: Chris Piatt ([email protected]). */ import "./interfaces/IUniRouter.sol"; import "./interfaces/ITipJar.sol"; import "./interfaces/IERC20Extended.sol"; import "./lib/SafeERC20.sol"; /** * @title ArcherSwapRouter * @dev Allows Uniswap V2 Router-compliant trades to be paid via % tips instead of gas */ contract ArcherSwapRouter { using SafeERC20 for IERC20Extended; /// @notice Receive function to allow contract to accept ETH receive() external payable {} /// @notice Fallback function in case receive function is not matched fallback() external payable {} /// @notice TipJar proxy ITipJar public immutable tipJar; /// @notice Trade details struct Trade { uint amountIn; uint amountOut; address[] path; address payable to; uint256 deadline; } /// @notice Add Liquidity details struct AddLiquidity { address tokenA; address tokenB; uint amountADesired; uint amountBDesired; uint amountAMin; uint amountBMin; address to; uint deadline; } /// @notice Remove Liquidity details struct RemoveLiquidity { IERC20Extended lpToken; address tokenA; address tokenB; uint liquidity; uint amountAMin; uint amountBMin; address to; uint deadline; } /// @notice Permit details struct Permit { IERC20Extended token; uint256 amount; uint deadline; uint8 v; bytes32 r; bytes32 s; } /** * @notice Contructs a new ArcherSwap Router * @param _tipJar Address of TipJar contract */ constructor(address _tipJar) { tipJar = ITipJar(_tipJar); } /** * @notice Add liquidity to token pair * @param router Uniswap V2-compliant Router contract * @param liquidity Liquidity details */ function addLiquidityAndTipAmount( IUniRouter router, AddLiquidity calldata liquidity ) external payable { require(msg.value > 0, "tip amount must be > 0"); _tipAmountETH(msg.value); _addLiquidity( router, liquidity.tokenA, liquidity.tokenB, liquidity.amountADesired, liquidity.amountBDesired, liquidity.amountAMin, liquidity.amountBMin, liquidity.to, liquidity.deadline ); } /** * @notice Add liquidity to pair, using permit for approvals * @param router Uniswap V2-compliant Router contract * @param liquidity Liquidity details * @param permitA Permit details for token A * @param permitB Permit details for token B */ function addLiquidityWithPermitAndTipAmount( IUniRouter router, AddLiquidity calldata liquidity, Permit calldata permitA, Permit calldata permitB ) external payable { require(msg.value > 0, "tip amount must be > 0"); if(permitA.amount > 0) { _permit(permitA.token, permitA.amount, permitA.deadline, permitA.v, permitA.r, permitA.s); } if(permitB.amount > 0) { _permit(permitB.token, permitB.amount, permitB.deadline, permitB.v, permitB.r, permitB.s); } _tipAmountETH(msg.value); _addLiquidity( router, liquidity.tokenA, liquidity.tokenB, liquidity.amountADesired, liquidity.amountBDesired, liquidity.amountAMin, liquidity.amountBMin, liquidity.to, liquidity.deadline ); } /** * @notice Add liquidity to ETH>Token pair * @param router Uniswap V2-compliant Router contract * @param liquidity Liquidity details * @param tipAmount tip amount */ function addLiquidityETHAndTipAmount( IUniRouter router, AddLiquidity calldata liquidity, uint256 tipAmount ) external payable { require(tipAmount > 0, "tip amount must be > 0"); require(msg.value >= liquidity.amountBDesired + tipAmount, "must send ETH to cover tip + liquidity"); _tipAmountETH(tipAmount); _addLiquidityETH( router, liquidity.tokenA, liquidity.amountADesired, liquidity.amountBDesired, liquidity.amountAMin, liquidity.amountBMin, liquidity.to, liquidity.deadline ); } /** * @notice Add liquidity to ETH>Token pair * @param router Uniswap V2-compliant Router contract * @param liquidity Liquidity details * @param tipAmount tip amount */ function addLiquidityETHWithPermitAndTipAmount( IUniRouter router, AddLiquidity calldata liquidity, Permit calldata permit, uint256 tipAmount ) external payable { require(tipAmount > 0, "tip amount must be > 0"); require(msg.value >= liquidity.amountBDesired + tipAmount, "must send ETH to cover tip + liquidity"); _permit(permit.token, permit.amount, permit.deadline, permit.v, permit.r, permit.s); _tipAmountETH(tipAmount); _addLiquidityETH( router, liquidity.tokenA, liquidity.amountADesired, liquidity.amountBDesired, liquidity.amountAMin, liquidity.amountBMin, liquidity.to, liquidity.deadline ); } /** * @notice Remove liquidity from token>token pair * @param router Uniswap V2-compliant Router contract * @param liquidity Liquidity details */ function removeLiquidityAndTipAmount( IUniRouter router, RemoveLiquidity calldata liquidity ) external payable { require(msg.value > 0, "tip amount must be > 0"); _tipAmountETH(msg.value); _removeLiquidity( router, liquidity.lpToken, liquidity.tokenA, liquidity.tokenB, liquidity.liquidity, liquidity.amountAMin, liquidity.amountBMin, liquidity.to, liquidity.deadline ); } /** * @notice Remove liquidity from ETH>token pair * @param router Uniswap V2-compliant Router contract * @param liquidity Liquidity details */ function removeLiquidityETHAndTipAmount( IUniRouter router, RemoveLiquidity calldata liquidity ) external payable { require(msg.value > 0, "tip amount must be > 0"); _tipAmountETH(msg.value); _removeLiquidityETH( router, liquidity.lpToken, liquidity.tokenA, liquidity.liquidity, liquidity.amountAMin, liquidity.amountBMin, liquidity.to, liquidity.deadline ); } /** * @notice Remove liquidity from token>token pair, using permit for approval * @param router Uniswap V2-compliant Router contract * @param liquidity Liquidity details * @param permit Permit details */ function removeLiquidityWithPermitAndTipAmount( IUniRouter router, RemoveLiquidity calldata liquidity, Permit calldata permit ) external payable { require(msg.value > 0, "tip amount must be > 0"); _tipAmountETH(msg.value); _permit(permit.token, permit.amount, permit.deadline, permit.v, permit.r, permit.s); _removeLiquidity( router, liquidity.lpToken, liquidity.tokenA, liquidity.tokenB, liquidity.liquidity, liquidity.amountAMin, liquidity.amountBMin, liquidity.to, liquidity.deadline ); } /** * @notice Remove liquidity from ETH>token pair, using permit for approval * @param router Uniswap V2-compliant Router contract * @param liquidity Liquidity details * @param permit Permit details */ function removeLiquidityETHWithPermitAndTipAmount( IUniRouter router, RemoveLiquidity calldata liquidity, Permit calldata permit ) external payable { require(msg.value > 0, "tip amount must be > 0"); _tipAmountETH(msg.value); _permit(permit.token, permit.amount, permit.deadline, permit.v, permit.r, permit.s); _removeLiquidityETH( router, liquidity.lpToken, liquidity.tokenA, liquidity.liquidity, liquidity.amountAMin, liquidity.amountBMin, liquidity.to, liquidity.deadline ); } /** * @notice Swap tokens for ETH and pay amount of ETH as tip * @param router Uniswap V2-compliant Router contract * @param trade Trade details */ function swapExactTokensForETHAndTipAmount( IUniRouter router, Trade calldata trade ) external payable { require(msg.value > 0, "tip amount must be > 0"); _tipAmountETH(msg.value); _swapExactTokensForETH(router, trade.amountIn, trade.amountOut, trade.path, trade.to, trade.deadline); } /** * @notice Swap tokens for ETH and pay amount of ETH as tip, using permit for approval * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param permit Permit details */ function swapExactTokensForETHWithPermitAndTipAmount( IUniRouter router, Trade calldata trade, Permit calldata permit ) external payable { require(msg.value > 0, "tip amount must be > 0"); _permit(permit.token, permit.amount, permit.deadline, permit.v, permit.r, permit.s); _tipAmountETH(msg.value); _swapExactTokensForETH(router, trade.amountIn, trade.amountOut, trade.path, trade.to, trade.deadline); } /** * @notice Swap tokens for ETH and pay % of ETH as tip * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param tipPct % of resulting ETH to pay as tip */ function swapExactTokensForETHAndTipPct( IUniRouter router, Trade calldata trade, uint32 tipPct ) external payable { require(tipPct > 0, "tipPct must be > 0"); _swapExactTokensForETH(router, trade.amountIn, trade.amountOut, trade.path, address(this), trade.deadline); _tipPctETH(tipPct); _transferContractETHBalance(trade.to); } /** * @notice Swap tokens for ETH and pay % of ETH as tip, using permit for approval * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param permit Permit details * @param tipPct % of resulting ETH to pay as tip */ function swapExactTokensForETHWithPermitAndTipPct( IUniRouter router, Trade calldata trade, Permit calldata permit, uint32 tipPct ) external payable { require(tipPct > 0, "tipPct must be > 0"); _permit(permit.token, permit.amount, permit.deadline, permit.v, permit.r, permit.s); _swapExactTokensForETH(router, trade.amountIn, trade.amountOut, trade.path, address(this), trade.deadline); _tipPctETH(tipPct); _transferContractETHBalance(trade.to); } /** * @notice Swap tokens for ETH and pay amount of ETH as tip * @param router Uniswap V2-compliant Router contract * @param trade Trade details */ function swapTokensForExactETHAndTipAmount( IUniRouter router, Trade calldata trade ) external payable { require(msg.value > 0, "tip amount must be > 0"); _tipAmountETH(msg.value); _swapTokensForExactETH(router, trade.amountOut, trade.amountIn, trade.path, trade.to, trade.deadline); } /** * @notice Swap tokens for ETH and pay amount of ETH as tip, using permit for approval * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param permit Permit details */ function swapTokensForExactETHWithPermitAndTipAmount( IUniRouter router, Trade calldata trade, Permit calldata permit ) external payable { require(msg.value > 0, "tip amount must be > 0"); _tipAmountETH(msg.value); _permit(permit.token, permit.amount, permit.deadline, permit.v, permit.r, permit.s); _swapTokensForExactETH(router, trade.amountOut, trade.amountIn, trade.path, trade.to, trade.deadline); } /** * @notice Swap tokens for ETH and pay % of ETH as tip * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param tipPct % of resulting ETH to pay as tip */ function swapTokensForExactETHAndTipPct( IUniRouter router, Trade calldata trade, uint32 tipPct ) external payable { require(tipPct > 0, "tipPct must be > 0"); _swapTokensForExactETH(router, trade.amountOut, trade.amountIn, trade.path, address(this), trade.deadline); _tipPctETH(tipPct); _transferContractETHBalance(trade.to); } /** * @notice Swap tokens for ETH and pay % of ETH as tip, using permit for approval * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param permit Permit details * @param tipPct % of resulting ETH to pay as tip */ function swapTokensForExactETHWithPermitAndTipPct( IUniRouter router, Trade calldata trade, Permit calldata permit, uint32 tipPct ) external payable { require(tipPct > 0, "tipPct must be > 0"); _permit(permit.token, permit.amount, permit.deadline, permit.v, permit.r, permit.s); _swapTokensForExactETH(router, trade.amountOut, trade.amountIn, trade.path, address(this), trade.deadline); _tipPctETH(tipPct); _transferContractETHBalance(trade.to); } /** * @notice Swap ETH for tokens and pay % of ETH input as tip * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param tipAmount amount of ETH to pay as tip */ function swapExactETHForTokensWithTipAmount( IUniRouter router, Trade calldata trade, uint256 tipAmount ) external payable { require(tipAmount > 0, "tip amount must be > 0"); require(msg.value >= tipAmount, "must send ETH to cover tip"); _tipAmountETH(tipAmount); _swapExactETHForTokens(router, trade.amountIn, trade.amountOut, trade.path, trade.to, trade.deadline); } /** * @notice Swap ETH for tokens and pay % of ETH input as tip * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param tipPct % of ETH to pay as tip */ function swapExactETHForTokensWithTipPct( IUniRouter router, Trade calldata trade, uint32 tipPct ) external payable { require(tipPct > 0, "tipPct must be > 0"); require(msg.value > 0, "must send ETH to cover tip"); uint256 tipAmount = (msg.value * tipPct) / 1000000; _tipAmountETH(tipAmount); _swapExactETHForTokens(router, trade.amountIn, trade.amountOut, trade.path, trade.to, trade.deadline); } /** * @notice Swap ETH for tokens and pay amount of ETH input as tip * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param tipAmount amount of ETH to pay as tip */ function swapETHForExactTokensWithTipAmount( IUniRouter router, Trade calldata trade, uint256 tipAmount ) external payable { require(tipAmount > 0, "tip amount must be > 0"); require(msg.value >= tipAmount, "must send ETH to cover tip"); _tipAmountETH(tipAmount); _swapETHForExactTokens(router, trade.amountOut, trade.amountIn, trade.path, trade.to, trade.deadline); } /** * @notice Swap ETH for tokens and pay % of ETH input as tip * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param tipPct % of ETH to pay as tip */ function swapETHForExactTokensWithTipPct( IUniRouter router, Trade calldata trade, uint32 tipPct ) external payable { require(tipPct > 0, "tipPct must be > 0"); require(msg.value > 0, "must send ETH to cover tip"); uint256 tipAmount = (msg.value * tipPct) / 1000000; _tipAmountETH(tipAmount); _swapETHForExactTokens(router, trade.amountOut, trade.amountIn, trade.path, trade.to, trade.deadline); } /** * @notice Swap tokens for tokens and pay ETH amount as tip * @param router Uniswap V2-compliant Router contract * @param trade Trade details */ function swapExactTokensForTokensWithTipAmount( IUniRouter router, Trade calldata trade ) external payable { require(msg.value > 0, "tip amount must be > 0"); _tipAmountETH(msg.value); _swapExactTokensForTokens(router, trade.amountIn, trade.amountOut, trade.path, trade.to, trade.deadline); } /** * @notice Swap tokens for tokens and pay ETH amount as tip * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param permit Permit details */ function swapExactTokensForTokensWithPermitAndTipAmount( IUniRouter router, Trade calldata trade, Permit calldata permit ) external payable { require(msg.value > 0, "tip amount must be > 0"); _tipAmountETH(msg.value); _permit(permit.token, permit.amount, permit.deadline, permit.v, permit.r, permit.s); _swapExactTokensForTokens(router, trade.amountIn, trade.amountOut, trade.path, trade.to, trade.deadline); } /** * @notice Swap tokens for tokens and pay % of tokens as tip * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param pathToEth Path to ETH for tip * @param minEth ETH minimum for tip conversion * @param tipPct % of resulting tokens to pay as tip */ function swapExactTokensForTokensWithTipPct( IUniRouter router, Trade calldata trade, address[] calldata pathToEth, uint256 minEth, uint32 tipPct ) external payable { require(tipPct > 0, "tipPct must be > 0"); _swapExactTokensForTokens(router, trade.amountIn, trade.amountOut, trade.path, address(this), trade.deadline); IERC20Extended toToken = IERC20Extended(pathToEth[0]); uint256 contractTokenBalance = toToken.balanceOf(address(this)); uint256 tipAmount = (contractTokenBalance * tipPct) / 1000000; _tipWithTokens(router, tipAmount, pathToEth, trade.deadline, minEth); _transferContractTokenBalance(toToken, trade.to); } /** * @notice Swap tokens for tokens and pay % of tokens as tip, using permit for approval * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param permit Permit details * @param pathToEth Path to ETH for tip * @param minEth ETH minimum for tip conversion * @param tipPct % of resulting tokens to pay as tip */ function swapExactTokensForTokensWithPermitAndTipPct( IUniRouter router, Trade calldata trade, Permit calldata permit, address[] calldata pathToEth, uint256 minEth, uint32 tipPct ) external payable { require(tipPct > 0, "tipPct must be > 0"); _permit(permit.token, permit.amount, permit.deadline, permit.v, permit.r, permit.s); _swapExactTokensForTokens(router, trade.amountIn, trade.amountOut, trade.path, address(this), trade.deadline); IERC20Extended toToken = IERC20Extended(pathToEth[0]); uint256 contractTokenBalance = toToken.balanceOf(address(this)); uint256 tipAmount = (contractTokenBalance * tipPct) / 1000000; _tipWithTokens(router, tipAmount, pathToEth, trade.deadline, minEth); _transferContractTokenBalance(toToken, trade.to); } /** * @notice Swap tokens for tokens and pay ETH amount as tip * @param router Uniswap V2-compliant Router contract * @param trade Trade details */ function swapTokensForExactTokensWithTipAmount( IUniRouter router, Trade calldata trade ) external payable { require(msg.value > 0, "tip amount must be > 0"); _tipAmountETH(msg.value); _swapTokensForExactTokens(router, trade.amountOut, trade.amountIn, trade.path, trade.to, trade.deadline); } /** * @notice Swap tokens for tokens and pay ETH amount as tip * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param permit Permit details */ function swapTokensForExactTokensWithPermitAndTipAmount( IUniRouter router, Trade calldata trade, Permit calldata permit ) external payable { require(msg.value > 0, "tip amount must be > 0"); _tipAmountETH(msg.value); _permit(permit.token, permit.amount, permit.deadline, permit.v, permit.r, permit.s); _swapTokensForExactTokens(router, trade.amountOut, trade.amountIn, trade.path, trade.to, trade.deadline); } /** * @notice Swap tokens for tokens and pay % of tokens as tip * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param pathToEth Path to ETH for tip * @param minEth ETH minimum for tip conversion * @param tipPct % of resulting tokens to pay as tip */ function swapTokensForExactTokensWithTipPct( IUniRouter router, Trade calldata trade, address[] calldata pathToEth, uint256 minEth, uint32 tipPct ) external payable { require(tipPct > 0, "tipPct must be > 0"); _swapTokensForExactTokens(router, trade.amountOut, trade.amountIn, trade.path, address(this), trade.deadline); IERC20Extended toToken = IERC20Extended(pathToEth[0]); uint256 contractTokenBalance = toToken.balanceOf(address(this)); uint256 tipAmount = (contractTokenBalance * tipPct) / 1000000; _tipWithTokens(router, tipAmount, pathToEth, trade.deadline, minEth); _transferContractTokenBalance(toToken, trade.to); } /** * @notice Swap tokens for tokens and pay % of tokens as tip, using permit for approval * @param router Uniswap V2-compliant Router contract * @param trade Trade details * @param permit Permit details * @param pathToEth Path to ETH for tip * @param minEth ETH minimum for tip conversion * @param tipPct % of resulting tokens to pay as tip */ function swapTokensForExactTokensWithPermitAndTipPct( IUniRouter router, Trade calldata trade, Permit calldata permit, address[] calldata pathToEth, uint256 minEth, uint32 tipPct ) external payable { require(tipPct > 0, "tipPct must be > 0"); _permit(permit.token, permit.amount, permit.deadline, permit.v, permit.r, permit.s); _swapTokensForExactTokens(router, trade.amountOut, trade.amountIn, trade.path, address(this), trade.deadline); IERC20Extended toToken = IERC20Extended(pathToEth[0]); uint256 contractTokenBalance = toToken.balanceOf(address(this)); uint256 tipAmount = (contractTokenBalance * tipPct) / 1000000; _tipWithTokens(router, tipAmount, pathToEth, trade.deadline, minEth); _transferContractTokenBalance(toToken, trade.to); } function _addLiquidity( IUniRouter router, address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) internal { IERC20Extended fromToken = IERC20Extended(tokenA); IERC20Extended toToken = IERC20Extended(tokenB); fromToken.safeTransferFrom(msg.sender, address(this), amountADesired); fromToken.safeIncreaseAllowance(address(router), amountADesired); toToken.safeTransferFrom(msg.sender, address(this), amountBDesired); toToken.safeIncreaseAllowance(address(router), amountBDesired); (uint256 amountA, uint256 amountB, ) = router.addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin, to, deadline); if(amountADesired > amountA) { fromToken.safeTransfer(msg.sender, fromToken.balanceOf(address(this))); } if(amountBDesired > amountB) { toToken.safeTransfer(msg.sender, toToken.balanceOf(address(this))); } } function _addLiquidityETH( IUniRouter router, address token, uint amountTokenDesired, uint amountETHDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) internal { IERC20Extended fromToken = IERC20Extended(token); fromToken.safeTransferFrom(msg.sender, address(this), amountTokenDesired); fromToken.safeIncreaseAllowance(address(router), amountTokenDesired); (uint256 amountToken, uint256 amountETH, ) = router.addLiquidityETH{value: amountETHDesired}(token, amountTokenDesired, amountTokenMin, amountETHMin, to, deadline); if(amountTokenDesired > amountToken) { fromToken.safeTransfer(msg.sender, amountTokenDesired - amountToken); } if(amountETHDesired > amountETH) { (bool success, ) = msg.sender.call{value: amountETHDesired - amountETH}(""); require(success); } } function _removeLiquidity( IUniRouter router, IERC20Extended lpToken, address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) internal { lpToken.safeTransferFrom(msg.sender, address(this), liquidity); lpToken.safeIncreaseAllowance(address(router), liquidity); (uint256 amountA, uint256 amountB) = router.removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline); IERC20Extended fromToken = IERC20Extended(tokenA); IERC20Extended toToken = IERC20Extended(tokenB); fromToken.safeTransfer(msg.sender, amountA); toToken.safeTransfer(msg.sender, amountB); } function _removeLiquidityETH( IUniRouter router, IERC20Extended lpToken, address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) internal { lpToken.safeTransferFrom(msg.sender, address(this), liquidity); lpToken.safeIncreaseAllowance(address(router), liquidity); (uint256 amountToken, uint256 amountETH) = router.removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline); IERC20Extended fromToken = IERC20Extended(token); fromToken.safeTransfer(msg.sender, amountToken); (bool success, ) = msg.sender.call{value: amountETH}(""); require(success); } /** * @notice Internal implementation of swap ETH for tokens * @param amountIn Amount to swap * @param amountOutMin Minimum amount out * @param path Path for swap * @param deadline Block timestamp deadline for trade */ function _swapExactETHForTokens( IUniRouter router, uint amountIn, uint amountOutMin, address[] calldata path, address to, uint256 deadline ) internal { router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amountIn}(amountOutMin, path, to, deadline); } /** * @notice Internal implementation of swap ETH for tokens * @param amountOut Amount of ETH out * @param amountInMax Max amount in * @param path Path for swap * @param to Address to receive ETH * @param deadline Block timestamp deadline for trade */ function _swapETHForExactTokens( IUniRouter router, uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) internal { router.swapETHForExactTokens{value: amountInMax}(amountOut, path, to, deadline); } /** * @notice Internal implementation of swap tokens for ETH * @param amountOut Amount of ETH out * @param amountInMax Max amount in * @param path Path for swap * @param to Address to receive ETH * @param deadline Block timestamp deadline for trade */ function _swapTokensForExactETH( IUniRouter router, uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) internal { IERC20Extended fromToken = IERC20Extended(path[0]); fromToken.safeTransferFrom(msg.sender, address(this), amountInMax); fromToken.safeIncreaseAllowance(address(router), amountInMax); router.swapTokensForExactETH(amountOut, amountInMax, path, to, deadline); } /** * @notice Internal implementation of swap tokens for ETH * @param amountIn Amount to swap * @param amountOutMin Minimum amount out * @param path Path for swap * @param deadline Block timestamp deadline for trade */ function _swapExactTokensForETH( IUniRouter router, uint amountIn, uint amountOutMin, address[] calldata path, address to, uint256 deadline ) internal { IERC20Extended fromToken = IERC20Extended(path[0]); fromToken.safeTransferFrom(msg.sender, address(this), amountIn); fromToken.safeIncreaseAllowance(address(router), amountIn); router.swapExactTokensForETHSupportingFeeOnTransferTokens(amountIn, amountOutMin, path, to, deadline); } /** * @notice Internal implementation of swap tokens for tokens * @param amountIn Amount to swap * @param amountOutMin Minimum amount out * @param path Path for swap * @param deadline Block timestamp deadline for trade */ function _swapExactTokensForTokens( IUniRouter router, uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) internal { IERC20Extended fromToken = IERC20Extended(path[0]); fromToken.safeTransferFrom(msg.sender, address(this), amountIn); fromToken.safeIncreaseAllowance(address(router), amountIn); router.swapExactTokensForTokensSupportingFeeOnTransferTokens(amountIn, amountOutMin, path, to, deadline); } /** * @notice Internal implementation of swap tokens for tokens * @param amountOut Amount of tokens out * @param amountInMax Max amount in * @param path Path for swap * @param to Address to receive tokens * @param deadline Block timestamp deadline for trade */ function _swapTokensForExactTokens( IUniRouter router, uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) internal { IERC20Extended fromToken = IERC20Extended(path[0]); fromToken.safeTransferFrom(msg.sender, address(this), amountInMax); fromToken.safeIncreaseAllowance(address(router), amountInMax); router.swapTokensForExactTokens(amountOut, amountInMax, path, to, deadline); } /** * @notice Tip % of ETH contract balance * @param tipPct % to tip */ function _tipPctETH(uint32 tipPct) internal { uint256 contractBalance = address(this).balance; uint256 tipAmount = (contractBalance * tipPct) / 1000000; tipJar.tip{value: tipAmount}(); } /** * @notice Tip specific amount of ETH * @param tipAmount Amount to tip */ function _tipAmountETH(uint256 tipAmount) internal { tipJar.tip{value: tipAmount}(); } /** * @notice Transfer contract ETH balance to specified user * @param to User to receive transfer */ function _transferContractETHBalance(address payable to) internal { (bool success, ) = to.call{value: address(this).balance}(""); require(success); } /** * @notice Transfer contract token balance to specified user * @param token Token to transfer * @param to User to receive transfer */ function _transferContractTokenBalance(IERC20Extended token, address payable to) internal { token.safeTransfer(to, token.balanceOf(address(this))); } /** * @notice Convert a token balance into ETH and then tip * @param amountIn Amount to swap * @param path Path for swap * @param deadline Block timestamp deadline for trade */ function _tipWithTokens( IUniRouter router, uint amountIn, address[] memory path, uint256 deadline, uint256 minEth ) internal { IERC20Extended(path[0]).safeIncreaseAllowance(address(router), amountIn); router.swapExactTokensForETHSupportingFeeOnTransferTokens(amountIn, minEth, path, address(this), deadline); tipJar.tip{value: address(this).balance}(); } /** * @notice Permit contract to spend user's balance * @param token Token to permit * @param amount Amount to permit * @param deadline Block timestamp deadline for permit * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function _permit( IERC20Extended token, uint amount, uint deadline, uint8 v, bytes32 r, bytes32 s ) internal { token.permit(msg.sender, address(this), amount, deadline, v, r, s); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC20Extended { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function version() external view returns (uint8); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function transferWithAuthorization(address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, uint8 v, bytes32 r, bytes32 s) external; function receiveWithAuthorization(address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, uint8 v, bytes32 r, bytes32 s) external; function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; function nonces(address) external view returns (uint); function getDomainSeparator() external view returns (bytes32); function DOMAIN_SEPARATOR() external view returns (bytes32); function DOMAIN_TYPEHASH() external view returns (bytes32); function VERSION_HASH() external view returns (bytes32); function PERMIT_TYPEHASH() external view returns (bytes32); function TRANSFER_WITH_AUTHORIZATION_TYPEHASH() external view returns (bytes32); function RECEIVE_WITH_AUTHORIZATION_TYPEHASH() external view returns (bytes32); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); event AuthorizationUsed(address indexed authorizer, bytes32 indexed nonce); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface ITipJar { function tip() external payable; function updateMinerSplit(address minerAddress, address splitTo, uint32 splitPct) external; function setFeeCollector(address newCollector) external; function setFee(uint32 newFee) external; function changeAdmin(address newAdmin) external; function upgradeTo(address newImplementation) external; function upgradeToAndCall(address newImplementation, bytes calldata data) external payable; }
//SPDX-License-Identifier: MIT pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniRouter is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../interfaces/IERC20Extended.sol"; import "./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 IERC20Extended;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer(IERC20Extended token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20Extended 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 * {IERC20Extended-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20Extended token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20Extended token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20Extended token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20Extended token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
{ "evmVersion": "istanbul", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 99999 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_tipJar","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.AddLiquidity","name":"liquidity","type":"tuple"}],"name":"addLiquidityAndTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.AddLiquidity","name":"liquidity","type":"tuple"},{"internalType":"uint256","name":"tipAmount","type":"uint256"}],"name":"addLiquidityETHAndTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.AddLiquidity","name":"liquidity","type":"tuple"},{"components":[{"internalType":"contract IERC20Extended","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ArcherSwapRouter.Permit","name":"permit","type":"tuple"},{"internalType":"uint256","name":"tipAmount","type":"uint256"}],"name":"addLiquidityETHWithPermitAndTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.AddLiquidity","name":"liquidity","type":"tuple"},{"components":[{"internalType":"contract IERC20Extended","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ArcherSwapRouter.Permit","name":"permitA","type":"tuple"},{"components":[{"internalType":"contract IERC20Extended","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ArcherSwapRouter.Permit","name":"permitB","type":"tuple"}],"name":"addLiquidityWithPermitAndTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"contract IERC20Extended","name":"lpToken","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.RemoveLiquidity","name":"liquidity","type":"tuple"}],"name":"removeLiquidityAndTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"contract IERC20Extended","name":"lpToken","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.RemoveLiquidity","name":"liquidity","type":"tuple"}],"name":"removeLiquidityETHAndTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"contract IERC20Extended","name":"lpToken","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.RemoveLiquidity","name":"liquidity","type":"tuple"},{"components":[{"internalType":"contract IERC20Extended","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ArcherSwapRouter.Permit","name":"permit","type":"tuple"}],"name":"removeLiquidityETHWithPermitAndTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"contract IERC20Extended","name":"lpToken","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.RemoveLiquidity","name":"liquidity","type":"tuple"},{"components":[{"internalType":"contract IERC20Extended","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ArcherSwapRouter.Permit","name":"permit","type":"tuple"}],"name":"removeLiquidityWithPermitAndTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"internalType":"uint256","name":"tipAmount","type":"uint256"}],"name":"swapETHForExactTokensWithTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"internalType":"uint32","name":"tipPct","type":"uint32"}],"name":"swapETHForExactTokensWithTipPct","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"internalType":"uint256","name":"tipAmount","type":"uint256"}],"name":"swapExactETHForTokensWithTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"internalType":"uint32","name":"tipPct","type":"uint32"}],"name":"swapExactETHForTokensWithTipPct","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"}],"name":"swapExactTokensForETHAndTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"internalType":"uint32","name":"tipPct","type":"uint32"}],"name":"swapExactTokensForETHAndTipPct","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"components":[{"internalType":"contract IERC20Extended","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ArcherSwapRouter.Permit","name":"permit","type":"tuple"}],"name":"swapExactTokensForETHWithPermitAndTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"components":[{"internalType":"contract IERC20Extended","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ArcherSwapRouter.Permit","name":"permit","type":"tuple"},{"internalType":"uint32","name":"tipPct","type":"uint32"}],"name":"swapExactTokensForETHWithPermitAndTipPct","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"components":[{"internalType":"contract IERC20Extended","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ArcherSwapRouter.Permit","name":"permit","type":"tuple"}],"name":"swapExactTokensForTokensWithPermitAndTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"components":[{"internalType":"contract IERC20Extended","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ArcherSwapRouter.Permit","name":"permit","type":"tuple"},{"internalType":"address[]","name":"pathToEth","type":"address[]"},{"internalType":"uint256","name":"minEth","type":"uint256"},{"internalType":"uint32","name":"tipPct","type":"uint32"}],"name":"swapExactTokensForTokensWithPermitAndTipPct","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"}],"name":"swapExactTokensForTokensWithTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"internalType":"address[]","name":"pathToEth","type":"address[]"},{"internalType":"uint256","name":"minEth","type":"uint256"},{"internalType":"uint32","name":"tipPct","type":"uint32"}],"name":"swapExactTokensForTokensWithTipPct","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"}],"name":"swapTokensForExactETHAndTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"internalType":"uint32","name":"tipPct","type":"uint32"}],"name":"swapTokensForExactETHAndTipPct","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"components":[{"internalType":"contract IERC20Extended","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ArcherSwapRouter.Permit","name":"permit","type":"tuple"}],"name":"swapTokensForExactETHWithPermitAndTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"components":[{"internalType":"contract IERC20Extended","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ArcherSwapRouter.Permit","name":"permit","type":"tuple"},{"internalType":"uint32","name":"tipPct","type":"uint32"}],"name":"swapTokensForExactETHWithPermitAndTipPct","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"components":[{"internalType":"contract IERC20Extended","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ArcherSwapRouter.Permit","name":"permit","type":"tuple"}],"name":"swapTokensForExactTokensWithPermitAndTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"components":[{"internalType":"contract IERC20Extended","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct ArcherSwapRouter.Permit","name":"permit","type":"tuple"},{"internalType":"address[]","name":"pathToEth","type":"address[]"},{"internalType":"uint256","name":"minEth","type":"uint256"},{"internalType":"uint32","name":"tipPct","type":"uint32"}],"name":"swapTokensForExactTokensWithPermitAndTipPct","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"}],"name":"swapTokensForExactTokensWithTipAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IUniRouter","name":"router","type":"address"},{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ArcherSwapRouter.Trade","name":"trade","type":"tuple"},{"internalType":"address[]","name":"pathToEth","type":"address[]"},{"internalType":"uint256","name":"minEth","type":"uint256"},{"internalType":"uint32","name":"tipPct","type":"uint32"}],"name":"swapTokensForExactTokensWithTipPct","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"tipJar","outputs":[{"internalType":"contract ITipJar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523480156200001157600080fd5b50604051620040513803806200405183398101604081905262000034916200004a565b60601b6001600160601b0319166080526200007a565b6000602082840312156200005c578081fd5b81516001600160a01b038116811462000073578182fd5b9392505050565b60805160601c613fa3620000ae600039600081816102c501528181611e6e015281816127060152612e0c0152613fa36000f3fe6080604052600436106101c65760003560e01c80639a2d8b8a116100f7578063c89b8c0011610095578063eb8175b311610064578063eb8175b3146103f4578063ef973cc014610407578063f29bbc721461041a578063f83dd82a1461042d576101cd565b8063c89b8c00146103a8578063dcf651b3146103bb578063e6f03f72146103ce578063e7bea530146103e1576101cd565b8063a7778b49116100d1578063a7778b491461035c578063a8bd55bf1461036f578063b37aced314610382578063c44aa00d14610395576101cd565b80639a2d8b8a146103235780639f05e4c614610336578063a1fa54f214610349576101cd565b80634ea618ac116101645780637366e8841161013e5780637366e8841461028d5780637583d2bd146102a05780637aaceb95146102b35780638be1984a14610310576101cd565b80634ea618ac146102545780635e52f39e1461026757806361692ecf1461027a576101cd565b806314c32946116101a057806314c329461461020857806328230aa11461021b57806329f3219f1461022e5780634c2ed35f14610241576101cd565b8063018d30d8146101cf5780630a3a3ae9146101e25780630c8a3d7a146101f5576101cd565b366101cd57005b005b6101cd6101dd366004613afa565b610440565b6101cd6101f0366004613aa3565b610582565b6101cd61020336600461393c565b610696565b6101cd61021636600461393c565b610774565b6101cd610229366004613814565b610829565b6101cd61023c3660046138aa565b6108f6565b6101cd61024f3660046138aa565b610b08565b6101cd610262366004613715565b610b9b565b6101cd61027536600461385c565b610cba565b6101cd6102883660046137c1565b610d63565b6101cd61029b3660046136df565b610eb2565b6101cd6102ae366004613814565b610f74565b3480156102bf57600080fd5b506102e77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6101cd61031e366004613a3c565b611051565b6101cd610331366004613afa565b611115565b6101cd610344366004613a3c565b6111c4565b6101cd610357366004613afa565b611267565b6101cd61036a36600461393c565b6112fa565b6101cd61037d366004613801565b6113af565b6101cd610390366004613993565b61146c565b6101cd6103a3366004613aa3565b6116b3565b6101cd6103b636600461385c565b6117c2565b6101cd6103c936600461385c565b611867565b6101cd6103dc366004613801565b61190c565b6101cd6103ef36600461393c565b6119d9565b6101cd610402366004613993565b611a8e565b6101cd610415366004613770565b611b31565b6101cd610428366004613afa565b611c90565b6101cd61043b36600461385c565b611dc7565b60008163ffffffff16116104b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064015b60405180910390fd5b6000341161051f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d7573742073656e642045544820746f20636f7665722074697000000000000060448201526064016104ac565b6000620f424061053563ffffffff841634613e6a565b61053f9190613e31565b905061054a81611e6c565b61057c84843560208601356105626040880188613db3565b61057260808a0160608b016135c5565b8960800135611ef0565b50505050565b600081116105ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b80341015610656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d7573742073656e642045544820746f20636f7665722074697000000000000060448201526064016104ac565b61065f81611e6c565b61069183602084013584356106776040870187613db3565b6106876080890160608a016135c5565b8860800135611f87565b505050565b60003411610700576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b61070934611e6c565b61074261071960208301836135c5565b602083013560408401356107336080860160608701613bb7565b85608001358660a00135612061565b610691836020840135843561075a6040870187613db3565b61076a6080890160608a016135c5565b8860800135612107565b600034116107de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b6107ee61071960208301836135c5565b6107f734611e6c565b610691838335602085013561080f6040870187613db3565b61081f6080890160608a016135c5565b886080013561226d565b60003411610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b61089c34611e6c565b6108ac61071960208301836135c5565b610691836108bd60208501856135c5565b6108cd60408601602087016135c5565b6060860135608087013560a08801356108ec60e08a0160c08b016135c5565b8960e00135612379565b60008163ffffffff1611610966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b610989868635602088013561097e60408a018a613db3565b308b6080013561251a565b6000848460008181106109c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906109da91906135c5565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b158015610a4557600080fd5b505afa158015610a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7d9190613b4f565b90506000620f4240610a9563ffffffff861684613e6a565b610a9f9190613e31565b9050610ae4898289898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060808c01358961260c565b610afd83610af860808b0160608c016135c5565b61276c565b505050505050505050565b60008163ffffffff1611610b78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b6109898660208701358735610b9060408a018a613db3565b308b60800135612107565b60003411610c05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b602082013515610c4857610c48610c1f60208401846135c5565b60208401356040850135610c396080870160608801613bb7565b86608001358760a00135612061565b602081013515610c6257610c6261071960208301836135c5565b610c6b34611e6c565b61057c84610c7c60208601866135c5565b610c8c60408701602088016135c5565b60408701356060880135608089013560a08a0135610cb060e08c0160c08d016135c5565b8b60e0013561282d565b60003411610d24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b610d2d34611e6c565b610d5f8260208301358335610d456040860186613db3565b610d5560808801606089016135c5565b8760800135612107565b5050565b60008111610dcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b610ddb816060840135613e19565b341015610e6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f6d7573742073656e642045544820746f20636f76657220746970202b206c697160448201527f756964697479000000000000000000000000000000000000000000000000000060648201526084016104ac565b610e7381611e6c565b61069183610e8460208501856135c5565b60408501356060860135608087013560a0880135610ea860e08a0160c08b016135c5565b8960e00135612b35565b60003411610f1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b610f2534611e6c565b610d5f82610f3660208401846135c5565b610f4660408501602086016135c5565b60408501356060860135608087013560a0880135610f6a60e08a0160c08b016135c5565b8960e0013561282d565b60003411610fde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b610fe734611e6c565b610ff761071960208301836135c5565b6106918361100860208501856135c5565b61101860408601602087016135c5565b61102860608701604088016135c5565b6060870135608088013560a089013561104760e08b0160c08c016135c5565b8a60e00135612c8a565b60008163ffffffff16116110c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b6110d1610c1f60208401846135c5565b6110f484843560208601356110e96040880188613db3565b30896080013561226d565b6110fd81612de7565b61057c61111060808501606086016135c5565b612e86565b60008163ffffffff1611611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b6111a8838335602085013561119d6040870187613db3565b30886080013561226d565b6111b181612de7565b61069161111060808401606085016135c5565b60008163ffffffff1611611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b611244610c1f60208401846135c5565b6110f4846020850135853561125c6040880188613db3565b308960800135612ef3565b60008163ffffffff16116112d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b6111a883602084013584356112ef6040870187613db3565b308860800135612ef3565b60003411611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b61136d34611e6c565b61137d61071960208301836135c5565b61069183602084013584356113956040870187613db3565b6113a56080890160608a016135c5565b8860800135612ef3565b60003411611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b61142234611e6c565b610d5f8261143360208401846135c5565b61144360408501602086016135c5565b6060850135608086013560a087013561146260e0890160c08a016135c5565b8860e00135612379565b60008163ffffffff16116114dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b6115156114ec60208701876135c5565b6020870135604088013561150660808a0160608b01613bb7565b89608001358a60a00135612061565b611538876020880135883561152d60408b018b613db3565b308c60800135612107565b600084846000818110611574577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061158991906135c5565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b1580156115f457600080fd5b505afa158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c9190613b4f565b90506000620f424061164463ffffffff861684613e6a565b61164e9190613e31565b90506116938a8289898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060808d01358961260c565b6116a783610af860808c0160608d016135c5565b50505050505050505050565b6000811161171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b80341015611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d7573742073656e642045544820746f20636f7665722074697000000000000060448201526064016104ac565b61179081611e6c565b61069183833560208501356117a86040870187613db3565b6117b86080890160608a016135c5565b8860800135611ef0565b6000341161182c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b61183534611e6c565b610d5f828235602084013561184d6040860186613db3565b61185d60808801606089016135c5565b876080013561251a565b600034116118d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b6118da34611e6c565b610d5f82602083013583356118f26040860186613db3565b61190260808801606089016135c5565b8760800135612ef3565b60003411611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b61197f34611e6c565b610d5f8261199060208401846135c5565b6119a060408501602086016135c5565b6119b060608601604087016135c5565b6060860135608087013560a08801356119cf60e08a0160c08b016135c5565b8960e00135612c8a565b60003411611a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b611a4c34611e6c565b611a5c61071960208301836135c5565b6106918383356020850135611a746040870187613db3565b611a846080890160608a016135c5565b886080013561251a565b60008163ffffffff1611611afe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b611b0e6114ec60208701876135c5565b6115388787356020890135611b2660408b018b613db3565b308c6080013561251a565b60008111611b9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b611ba9816060850135613e19565b341015611c38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f6d7573742073656e642045544820746f20636f76657220746970202b206c697160448201527f756964697479000000000000000000000000000000000000000000000000000060648201526084016104ac565b611c48610c1f60208401846135c5565b611c5181611e6c565b61057c84611c6260208601866135c5565b60408601356060870135608088013560a0890135611c8660e08b0160c08c016135c5565b8a60e00135612b35565b60008163ffffffff1611611d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b60003411611d6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d7573742073656e642045544820746f20636f7665722074697000000000000060448201526064016104ac565b6000620f4240611d8063ffffffff841634613e6a565b611d8a9190613e31565b9050611d9581611e6c565b61057c8460208501358535611dad6040880188613db3565b611dbd60808a0160608b016135c5565b8960800135611f87565b60003411611e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b611e3a34611e6c565b610d5f8282356020840135611e526040860186613db3565b611e6260808801606089016135c5565b876080013561226d565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632755cd2d826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ed457600080fd5b505af1158015611ee8573d6000803e3d6000fd5b505050505050565b6040517fb6f9de9500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88169063b6f9de95908890611f4c9089908990899089908990600401613c9a565b6000604051808303818588803b158015611f6557600080fd5b505af1158015611f79573d6000803e3d6000fd5b505050505050505050505050565b6040517ffb3bdb4100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88169063fb3bdb41908790611fe3908a908990899089908990600401613c9a565b6000604051808303818588803b158015611ffc57600080fd5b505af1158015612010573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261205791908101906135e1565b5050505050505050565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff87169063d505accf9060e401600060405180830381600087803b1580156120f357600080fd5b505af11580156116a7573d6000803e3d6000fd5b600084846000818110612143577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061215891906135c5565b905061217c73ffffffffffffffffffffffffffffffffffffffff8216333089612fe5565b61219d73ffffffffffffffffffffffffffffffffffffffff821689886130c1565b6040517f8803dbee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891690638803dbee906121f9908a908a908a908a908a908a90600401613cde565b600060405180830381600087803b15801561221357600080fd5b505af1158015612227573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610afd91908101906135e1565b6000848460008181106122a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906122be91906135c5565b90506122e273ffffffffffffffffffffffffffffffffffffffff821633308a612fe5565b61230373ffffffffffffffffffffffffffffffffffffffff821689896130c1565b6040517f791ac94700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89169063791ac9479061235f908a908a908a908a908a908a90600401613cde565b600060405180830381600087803b158015611f6557600080fd5b61239b73ffffffffffffffffffffffffffffffffffffffff8816333088612fe5565b6123bc73ffffffffffffffffffffffffffffffffffffffff881689876130c1565b6040517f02751cec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790526044820186905260648201859052838116608483015260a4820183905260009182918b16906302751cec9060c4016040805180830381600087803b15801561244d57600080fd5b505af1158015612461573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124859190613b67565b9092509050876124ac73ffffffffffffffffffffffffffffffffffffffff821633856131ce565b60003373ffffffffffffffffffffffffffffffffffffffff16836040515b60006040518083038185875af1925050503d8060008114612507576040519150601f19603f3d011682016040523d82523d6000602084013e61250c565b606091505b5050905080611f7957600080fd5b600084846000818110612556577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061256b91906135c5565b905061258f73ffffffffffffffffffffffffffffffffffffffff821633308a612fe5565b6125b073ffffffffffffffffffffffffffffffffffffffff821689896130c1565b6040517f5c11d79500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891690635c11d7959061235f908a908a908a908a908a908a90600401613cde565b61267885858560008151811061264b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166130c19092919063ffffffff16565b6040517f791ac94700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063791ac947906126d29087908590889030908990600401613d29565b600060405180830381600087803b1580156126ec57600080fd5b505af1158015612700573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632755cd2d476040518263ffffffff1660e01b81526004016000604051808303818588803b1580156120f357600080fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610d5f90829073ffffffffffffffffffffffffffffffffffffffff8516906370a082319060240160206040518083038186803b1580156127d757600080fd5b505afa1580156127eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280f9190613b4f565b73ffffffffffffffffffffffffffffffffffffffff851691906131ce565b878761285173ffffffffffffffffffffffffffffffffffffffff831633308b612fe5565b61287273ffffffffffffffffffffffffffffffffffffffff83168c8a6130c1565b61289473ffffffffffffffffffffffffffffffffffffffff821633308a612fe5565b6128b573ffffffffffffffffffffffffffffffffffffffff82168c896130c1565b6040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528a81166024830152604482018a9052606482018990526084820188905260a4820187905285811660c483015260e4820185905260009182918e169063e8e337009061010401606060405180830381600087803b15801561295757600080fd5b505af115801561296b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298f9190613b8a565b5091509150818a1115612a5d576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152612a5d90339073ffffffffffffffffffffffffffffffffffffffff8716906370a082319060240160206040518083038186803b158015612a0757600080fd5b505afa158015612a1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3f9190613b4f565b73ffffffffffffffffffffffffffffffffffffffff871691906131ce565b80891115612b26576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152612b2690339073ffffffffffffffffffffffffffffffffffffffff8616906370a082319060240160206040518083038186803b158015612ad057600080fd5b505afa158015612ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b089190613b4f565b73ffffffffffffffffffffffffffffffffffffffff861691906131ce565b50505050505050505050505050565b86612b5873ffffffffffffffffffffffffffffffffffffffff821633308a612fe5565b612b7973ffffffffffffffffffffffffffffffffffffffff82168a896130c1565b6040517ff305d71900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018990526044820187905260648201869052848116608483015260a4820184905260009182918c169063f305d719908a9060c4016060604051808303818588803b158015612c0c57600080fd5b505af1158015612c20573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c459190613b8a565b509150915081891115612c6057612c6033612b08848c613ea7565b80881115612c7d57600033612c75838b613ea7565b6040516124ca565b5050505050505050505050565b612cac73ffffffffffffffffffffffffffffffffffffffff8916333088612fe5565b612ccd73ffffffffffffffffffffffffffffffffffffffff89168a876130c1565b6040517fbaa2abde00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152878116602483015260448201879052606482018690526084820185905283811660a483015260c4820183905260009182918c169063baa2abde9060e4016040805180830381600087803b158015612d6657600080fd5b505af1158015612d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d9e9190613b67565b90925090508888612dc673ffffffffffffffffffffffffffffffffffffffff831633866131ce565b612b2673ffffffffffffffffffffffffffffffffffffffff821633856131ce565b476000620f4240612dfe63ffffffff851684613e6a565b612e089190613e31565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632755cd2d826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e7257600080fd5b505af1158015612057573d6000803e3d6000fd5b60008173ffffffffffffffffffffffffffffffffffffffff164760405160006040518083038185875af1925050503d8060008114612ee0576040519150601f19603f3d011682016040523d82523d6000602084013e612ee5565b606091505b5050905080610d5f57600080fd5b600084846000818110612f2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190612f4491906135c5565b9050612f6873ffffffffffffffffffffffffffffffffffffffff8216333089612fe5565b612f8973ffffffffffffffffffffffffffffffffffffffff821689886130c1565b6040517f4a25d94a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891690634a25d94a906121f9908a908a908a908a908a908a90600401613cde565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261057c9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613224565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b15801561313357600080fd5b505afa158015613147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316b9190613b4f565b6131759190613e19565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061057c9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161303f565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526106919084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161303f565b6000613286826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166133309092919063ffffffff16565b80519091501561069157808060200190518101906132a491906136bf565b610691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016104ac565b606061333f8484600085613349565b90505b9392505050565b6060824710156133db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016104ac565b6133e4856134d0565b61344a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104ac565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516134739190613c2d565b60006040518083038185875af1925050503d80600081146134b0576040519150601f19603f3d011682016040523d82523d6000602084013e6134b5565b606091505b50915091506134c58282866134da565b979650505050505050565b803b15155b919050565b606083156134e9575081613342565b8251156134f95782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ac9190613c49565b60008083601f84011261353e578081fd5b50813567ffffffffffffffff811115613555578182fd5b6020830191508360208260051b850101111561357057600080fd5b9250929050565b60006101008284031215613589578081fd5b50919050565b600060c08284031215613589578081fd5b600060a08284031215613589578081fd5b803563ffffffff811681146134d557600080fd5b6000602082840312156135d6578081fd5b813561334281613f48565b600060208083850312156135f3578182fd5b825167ffffffffffffffff8082111561360a578384fd5b818501915085601f83011261361d578384fd5b81518181111561362f5761362f613f19565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110858211171561367257613672613f19565b604052828152858101935084860182860187018a1015613690578788fd5b8795505b838610156136b2578051855260019590950194938601938601613694565b5098975050505050505050565b6000602082840312156136d0578081fd5b81518015158114613342578182fd5b60008061012083850312156136f2578081fd5b82356136fd81613f48565b915061370c8460208501613577565b90509250929050565b6000806000806102a0858703121561372b578182fd5b843561373681613f48565b93506137458660208701613577565b925061375586610120870161358f565b9150613765866101e0870161358f565b905092959194509250565b6000806000806102008587031215613786578384fd5b843561379181613f48565b93506137a08660208701613577565b92506137b086610120870161358f565b939692955092936101e00135925050565b600080600061014084860312156137d6578283fd5b83356137e181613f48565b92506137f08560208601613577565b915061012084013590509250925092565b60008061012083850312156136f2578182fd5b60008060006101e08486031215613829578081fd5b833561383481613f48565b92506138438560208601613577565b915061385385610120860161358f565b90509250925092565b6000806040838503121561386e578182fd5b823561387981613f48565b9150602083013567ffffffffffffffff811115613894578182fd5b6138a0858286016135a0565b9150509250929050565b60008060008060008060a087890312156138c2578384fd5b86356138cd81613f48565b9550602087013567ffffffffffffffff808211156138e9578586fd5b6138f58a838b016135a0565b9650604089013591508082111561390a578586fd5b5061391789828a0161352d565b90955093505060608701359150613930608088016135b1565b90509295509295509295565b60008060006101008486031215613951578081fd5b833561395c81613f48565b9250602084013567ffffffffffffffff811115613977578182fd5b613983868287016135a0565b925050613853856040860161358f565b6000806000806000806000610160888a0312156139ae578485fd5b87356139b981613f48565b9650602088013567ffffffffffffffff808211156139d5578687fd5b6139e18b838c016135a0565b97506139f08b60408c0161358f565b96506101008a0135915080821115613a06578283fd5b50613a138a828b0161352d565b9095509350506101208801359150613a2e61014089016135b1565b905092959891949750929550565b6000806000806101208587031215613a52578182fd5b8435613a5d81613f48565b9350602085013567ffffffffffffffff811115613a78578283fd5b613a84878288016135a0565b935050613a94866040870161358f565b915061376561010086016135b1565b600080600060608486031215613ab7578081fd5b8335613ac281613f48565b9250602084013567ffffffffffffffff811115613add578182fd5b613ae9868287016135a0565b925050604084013590509250925092565b600080600060608486031215613b0e578081fd5b8335613b1981613f48565b9250602084013567ffffffffffffffff811115613b34578182fd5b613b40868287016135a0565b925050613853604085016135b1565b600060208284031215613b60578081fd5b5051919050565b60008060408385031215613b79578182fd5b505080516020909101519092909150565b600080600060608486031215613b9e578081fd5b8351925060208401519150604084015190509250925092565b600060208284031215613bc8578081fd5b813560ff81168114613342578182fd5b60008284526020808501945082825b85811015613c22578135613bfa81613f48565b73ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101613be7565b509495945050505050565b60008251613c3f818460208701613ebe565b9190910192915050565b6000602082528251806020840152613c68816040850160208701613ebe565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600086825260806020830152613cb4608083018688613bd8565b73ffffffffffffffffffffffffffffffffffffffff94909416604083015250606001529392505050565b600087825286602083015260a06040830152613cfe60a083018688613bd8565b73ffffffffffffffffffffffffffffffffffffffff9490941660608301525060800152949350505050565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015613d8557845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101613d53565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613de7578283fd5b83018035915067ffffffffffffffff821115613e01578283fd5b6020019150600581901b360382131561357057600080fd5b60008219821115613e2c57613e2c613eea565b500190565b600082613e65577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ea257613ea2613eea565b500290565b600082821015613eb957613eb9613eea565b500390565b60005b83811015613ed9578181015183820152602001613ec1565b8381111561057c5750506000910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114613f6a57600080fd5b5056fea26469706673582212208cc776a3ef117e9402a9ad8a1f13f6ec933aa59c94df5b2248689f718fe0dc6764736f6c634300080300330000000000000000000000005312b0d160e16feeeec13437a0053009e7564287
Deployed Bytecode
0x6080604052600436106101c65760003560e01c80639a2d8b8a116100f7578063c89b8c0011610095578063eb8175b311610064578063eb8175b3146103f4578063ef973cc014610407578063f29bbc721461041a578063f83dd82a1461042d576101cd565b8063c89b8c00146103a8578063dcf651b3146103bb578063e6f03f72146103ce578063e7bea530146103e1576101cd565b8063a7778b49116100d1578063a7778b491461035c578063a8bd55bf1461036f578063b37aced314610382578063c44aa00d14610395576101cd565b80639a2d8b8a146103235780639f05e4c614610336578063a1fa54f214610349576101cd565b80634ea618ac116101645780637366e8841161013e5780637366e8841461028d5780637583d2bd146102a05780637aaceb95146102b35780638be1984a14610310576101cd565b80634ea618ac146102545780635e52f39e1461026757806361692ecf1461027a576101cd565b806314c32946116101a057806314c329461461020857806328230aa11461021b57806329f3219f1461022e5780634c2ed35f14610241576101cd565b8063018d30d8146101cf5780630a3a3ae9146101e25780630c8a3d7a146101f5576101cd565b366101cd57005b005b6101cd6101dd366004613afa565b610440565b6101cd6101f0366004613aa3565b610582565b6101cd61020336600461393c565b610696565b6101cd61021636600461393c565b610774565b6101cd610229366004613814565b610829565b6101cd61023c3660046138aa565b6108f6565b6101cd61024f3660046138aa565b610b08565b6101cd610262366004613715565b610b9b565b6101cd61027536600461385c565b610cba565b6101cd6102883660046137c1565b610d63565b6101cd61029b3660046136df565b610eb2565b6101cd6102ae366004613814565b610f74565b3480156102bf57600080fd5b506102e77f0000000000000000000000005312b0d160e16feeeec13437a0053009e756428781565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6101cd61031e366004613a3c565b611051565b6101cd610331366004613afa565b611115565b6101cd610344366004613a3c565b6111c4565b6101cd610357366004613afa565b611267565b6101cd61036a36600461393c565b6112fa565b6101cd61037d366004613801565b6113af565b6101cd610390366004613993565b61146c565b6101cd6103a3366004613aa3565b6116b3565b6101cd6103b636600461385c565b6117c2565b6101cd6103c936600461385c565b611867565b6101cd6103dc366004613801565b61190c565b6101cd6103ef36600461393c565b6119d9565b6101cd610402366004613993565b611a8e565b6101cd610415366004613770565b611b31565b6101cd610428366004613afa565b611c90565b6101cd61043b36600461385c565b611dc7565b60008163ffffffff16116104b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064015b60405180910390fd5b6000341161051f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d7573742073656e642045544820746f20636f7665722074697000000000000060448201526064016104ac565b6000620f424061053563ffffffff841634613e6a565b61053f9190613e31565b905061054a81611e6c565b61057c84843560208601356105626040880188613db3565b61057260808a0160608b016135c5565b8960800135611ef0565b50505050565b600081116105ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b80341015610656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d7573742073656e642045544820746f20636f7665722074697000000000000060448201526064016104ac565b61065f81611e6c565b61069183602084013584356106776040870187613db3565b6106876080890160608a016135c5565b8860800135611f87565b505050565b60003411610700576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b61070934611e6c565b61074261071960208301836135c5565b602083013560408401356107336080860160608701613bb7565b85608001358660a00135612061565b610691836020840135843561075a6040870187613db3565b61076a6080890160608a016135c5565b8860800135612107565b600034116107de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b6107ee61071960208301836135c5565b6107f734611e6c565b610691838335602085013561080f6040870187613db3565b61081f6080890160608a016135c5565b886080013561226d565b60003411610893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b61089c34611e6c565b6108ac61071960208301836135c5565b610691836108bd60208501856135c5565b6108cd60408601602087016135c5565b6060860135608087013560a08801356108ec60e08a0160c08b016135c5565b8960e00135612379565b60008163ffffffff1611610966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b610989868635602088013561097e60408a018a613db3565b308b6080013561251a565b6000848460008181106109c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906109da91906135c5565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b158015610a4557600080fd5b505afa158015610a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7d9190613b4f565b90506000620f4240610a9563ffffffff861684613e6a565b610a9f9190613e31565b9050610ae4898289898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060808c01358961260c565b610afd83610af860808b0160608c016135c5565b61276c565b505050505050505050565b60008163ffffffff1611610b78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b6109898660208701358735610b9060408a018a613db3565b308b60800135612107565b60003411610c05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b602082013515610c4857610c48610c1f60208401846135c5565b60208401356040850135610c396080870160608801613bb7565b86608001358760a00135612061565b602081013515610c6257610c6261071960208301836135c5565b610c6b34611e6c565b61057c84610c7c60208601866135c5565b610c8c60408701602088016135c5565b60408701356060880135608089013560a08a0135610cb060e08c0160c08d016135c5565b8b60e0013561282d565b60003411610d24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b610d2d34611e6c565b610d5f8260208301358335610d456040860186613db3565b610d5560808801606089016135c5565b8760800135612107565b5050565b60008111610dcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b610ddb816060840135613e19565b341015610e6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f6d7573742073656e642045544820746f20636f76657220746970202b206c697160448201527f756964697479000000000000000000000000000000000000000000000000000060648201526084016104ac565b610e7381611e6c565b61069183610e8460208501856135c5565b60408501356060860135608087013560a0880135610ea860e08a0160c08b016135c5565b8960e00135612b35565b60003411610f1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b610f2534611e6c565b610d5f82610f3660208401846135c5565b610f4660408501602086016135c5565b60408501356060860135608087013560a0880135610f6a60e08a0160c08b016135c5565b8960e0013561282d565b60003411610fde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b610fe734611e6c565b610ff761071960208301836135c5565b6106918361100860208501856135c5565b61101860408601602087016135c5565b61102860608701604088016135c5565b6060870135608088013560a089013561104760e08b0160c08c016135c5565b8a60e00135612c8a565b60008163ffffffff16116110c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b6110d1610c1f60208401846135c5565b6110f484843560208601356110e96040880188613db3565b30896080013561226d565b6110fd81612de7565b61057c61111060808501606086016135c5565b612e86565b60008163ffffffff1611611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b6111a8838335602085013561119d6040870187613db3565b30886080013561226d565b6111b181612de7565b61069161111060808401606085016135c5565b60008163ffffffff1611611234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b611244610c1f60208401846135c5565b6110f4846020850135853561125c6040880188613db3565b308960800135612ef3565b60008163ffffffff16116112d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b6111a883602084013584356112ef6040870187613db3565b308860800135612ef3565b60003411611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b61136d34611e6c565b61137d61071960208301836135c5565b61069183602084013584356113956040870187613db3565b6113a56080890160608a016135c5565b8860800135612ef3565b60003411611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b61142234611e6c565b610d5f8261143360208401846135c5565b61144360408501602086016135c5565b6060850135608086013560a087013561146260e0890160c08a016135c5565b8860e00135612379565b60008163ffffffff16116114dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b6115156114ec60208701876135c5565b6020870135604088013561150660808a0160608b01613bb7565b89608001358a60a00135612061565b611538876020880135883561152d60408b018b613db3565b308c60800135612107565b600084846000818110611574577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061158991906135c5565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b1580156115f457600080fd5b505afa158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c9190613b4f565b90506000620f424061164463ffffffff861684613e6a565b61164e9190613e31565b90506116938a8289898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050505060808d01358961260c565b6116a783610af860808c0160608d016135c5565b50505050505050505050565b6000811161171d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b80341015611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d7573742073656e642045544820746f20636f7665722074697000000000000060448201526064016104ac565b61179081611e6c565b61069183833560208501356117a86040870187613db3565b6117b86080890160608a016135c5565b8860800135611ef0565b6000341161182c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b61183534611e6c565b610d5f828235602084013561184d6040860186613db3565b61185d60808801606089016135c5565b876080013561251a565b600034116118d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b6118da34611e6c565b610d5f82602083013583356118f26040860186613db3565b61190260808801606089016135c5565b8760800135612ef3565b60003411611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b61197f34611e6c565b610d5f8261199060208401846135c5565b6119a060408501602086016135c5565b6119b060608601604087016135c5565b6060860135608087013560a08801356119cf60e08a0160c08b016135c5565b8960e00135612c8a565b60003411611a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b611a4c34611e6c565b611a5c61071960208301836135c5565b6106918383356020850135611a746040870187613db3565b611a846080890160608a016135c5565b886080013561251a565b60008163ffffffff1611611afe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b611b0e6114ec60208701876135c5565b6115388787356020890135611b2660408b018b613db3565b308c6080013561251a565b60008111611b9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b611ba9816060850135613e19565b341015611c38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f6d7573742073656e642045544820746f20636f76657220746970202b206c697160448201527f756964697479000000000000000000000000000000000000000000000000000060648201526084016104ac565b611c48610c1f60208401846135c5565b611c5181611e6c565b61057c84611c6260208601866135c5565b60408601356060870135608088013560a0890135611c8660e08b0160c08c016135c5565b8a60e00135612b35565b60008163ffffffff1611611d00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746970506374206d757374206265203e2030000000000000000000000000000060448201526064016104ac565b60003411611d6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d7573742073656e642045544820746f20636f7665722074697000000000000060448201526064016104ac565b6000620f4240611d8063ffffffff841634613e6a565b611d8a9190613e31565b9050611d9581611e6c565b61057c8460208501358535611dad6040880188613db3565b611dbd60808a0160608b016135c5565b8960800135611f87565b60003411611e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f74697020616d6f756e74206d757374206265203e20300000000000000000000060448201526064016104ac565b611e3a34611e6c565b610d5f8282356020840135611e526040860186613db3565b611e6260808801606089016135c5565b876080013561226d565b7f0000000000000000000000005312b0d160e16feeeec13437a0053009e756428773ffffffffffffffffffffffffffffffffffffffff16632755cd2d826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ed457600080fd5b505af1158015611ee8573d6000803e3d6000fd5b505050505050565b6040517fb6f9de9500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88169063b6f9de95908890611f4c9089908990899089908990600401613c9a565b6000604051808303818588803b158015611f6557600080fd5b505af1158015611f79573d6000803e3d6000fd5b505050505050505050505050565b6040517ffb3bdb4100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88169063fb3bdb41908790611fe3908a908990899089908990600401613c9a565b6000604051808303818588803b158015611ffc57600080fd5b505af1158015612010573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261205791908101906135e1565b5050505050505050565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff87169063d505accf9060e401600060405180830381600087803b1580156120f357600080fd5b505af11580156116a7573d6000803e3d6000fd5b600084846000818110612143577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061215891906135c5565b905061217c73ffffffffffffffffffffffffffffffffffffffff8216333089612fe5565b61219d73ffffffffffffffffffffffffffffffffffffffff821689886130c1565b6040517f8803dbee00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891690638803dbee906121f9908a908a908a908a908a908a90600401613cde565b600060405180830381600087803b15801561221357600080fd5b505af1158015612227573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610afd91908101906135e1565b6000848460008181106122a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906122be91906135c5565b90506122e273ffffffffffffffffffffffffffffffffffffffff821633308a612fe5565b61230373ffffffffffffffffffffffffffffffffffffffff821689896130c1565b6040517f791ac94700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89169063791ac9479061235f908a908a908a908a908a908a90600401613cde565b600060405180830381600087803b158015611f6557600080fd5b61239b73ffffffffffffffffffffffffffffffffffffffff8816333088612fe5565b6123bc73ffffffffffffffffffffffffffffffffffffffff881689876130c1565b6040517f02751cec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790526044820186905260648201859052838116608483015260a4820183905260009182918b16906302751cec9060c4016040805180830381600087803b15801561244d57600080fd5b505af1158015612461573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124859190613b67565b9092509050876124ac73ffffffffffffffffffffffffffffffffffffffff821633856131ce565b60003373ffffffffffffffffffffffffffffffffffffffff16836040515b60006040518083038185875af1925050503d8060008114612507576040519150601f19603f3d011682016040523d82523d6000602084013e61250c565b606091505b5050905080611f7957600080fd5b600084846000818110612556577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061256b91906135c5565b905061258f73ffffffffffffffffffffffffffffffffffffffff821633308a612fe5565b6125b073ffffffffffffffffffffffffffffffffffffffff821689896130c1565b6040517f5c11d79500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891690635c11d7959061235f908a908a908a908a908a908a90600401613cde565b61267885858560008151811061264b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166130c19092919063ffffffff16565b6040517f791ac94700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063791ac947906126d29087908590889030908990600401613d29565b600060405180830381600087803b1580156126ec57600080fd5b505af1158015612700573d6000803e3d6000fd5b505050507f0000000000000000000000005312b0d160e16feeeec13437a0053009e756428773ffffffffffffffffffffffffffffffffffffffff16632755cd2d476040518263ffffffff1660e01b81526004016000604051808303818588803b1580156120f357600080fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610d5f90829073ffffffffffffffffffffffffffffffffffffffff8516906370a082319060240160206040518083038186803b1580156127d757600080fd5b505afa1580156127eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280f9190613b4f565b73ffffffffffffffffffffffffffffffffffffffff851691906131ce565b878761285173ffffffffffffffffffffffffffffffffffffffff831633308b612fe5565b61287273ffffffffffffffffffffffffffffffffffffffff83168c8a6130c1565b61289473ffffffffffffffffffffffffffffffffffffffff821633308a612fe5565b6128b573ffffffffffffffffffffffffffffffffffffffff82168c896130c1565b6040517fe8e3370000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528a81166024830152604482018a9052606482018990526084820188905260a4820187905285811660c483015260e4820185905260009182918e169063e8e337009061010401606060405180830381600087803b15801561295757600080fd5b505af115801561296b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298f9190613b8a565b5091509150818a1115612a5d576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152612a5d90339073ffffffffffffffffffffffffffffffffffffffff8716906370a082319060240160206040518083038186803b158015612a0757600080fd5b505afa158015612a1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3f9190613b4f565b73ffffffffffffffffffffffffffffffffffffffff871691906131ce565b80891115612b26576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152612b2690339073ffffffffffffffffffffffffffffffffffffffff8616906370a082319060240160206040518083038186803b158015612ad057600080fd5b505afa158015612ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b089190613b4f565b73ffffffffffffffffffffffffffffffffffffffff861691906131ce565b50505050505050505050505050565b86612b5873ffffffffffffffffffffffffffffffffffffffff821633308a612fe5565b612b7973ffffffffffffffffffffffffffffffffffffffff82168a896130c1565b6040517ff305d71900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8981166004830152602482018990526044820187905260648201869052848116608483015260a4820184905260009182918c169063f305d719908a9060c4016060604051808303818588803b158015612c0c57600080fd5b505af1158015612c20573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c459190613b8a565b509150915081891115612c6057612c6033612b08848c613ea7565b80881115612c7d57600033612c75838b613ea7565b6040516124ca565b5050505050505050505050565b612cac73ffffffffffffffffffffffffffffffffffffffff8916333088612fe5565b612ccd73ffffffffffffffffffffffffffffffffffffffff89168a876130c1565b6040517fbaa2abde00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152878116602483015260448201879052606482018690526084820185905283811660a483015260c4820183905260009182918c169063baa2abde9060e4016040805180830381600087803b158015612d6657600080fd5b505af1158015612d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d9e9190613b67565b90925090508888612dc673ffffffffffffffffffffffffffffffffffffffff831633866131ce565b612b2673ffffffffffffffffffffffffffffffffffffffff821633856131ce565b476000620f4240612dfe63ffffffff851684613e6a565b612e089190613e31565b90507f0000000000000000000000005312b0d160e16feeeec13437a0053009e756428773ffffffffffffffffffffffffffffffffffffffff16632755cd2d826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e7257600080fd5b505af1158015612057573d6000803e3d6000fd5b60008173ffffffffffffffffffffffffffffffffffffffff164760405160006040518083038185875af1925050503d8060008114612ee0576040519150601f19603f3d011682016040523d82523d6000602084013e612ee5565b606091505b5050905080610d5f57600080fd5b600084846000818110612f2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190612f4491906135c5565b9050612f6873ffffffffffffffffffffffffffffffffffffffff8216333089612fe5565b612f8973ffffffffffffffffffffffffffffffffffffffff821689886130c1565b6040517f4a25d94a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891690634a25d94a906121f9908a908a908a908a908a908a90600401613cde565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261057c9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613224565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b15801561313357600080fd5b505afa158015613147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316b9190613b4f565b6131759190613e19565b60405173ffffffffffffffffffffffffffffffffffffffff851660248201526044810182905290915061057c9085907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161303f565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526106919084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161303f565b6000613286826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166133309092919063ffffffff16565b80519091501561069157808060200190518101906132a491906136bf565b610691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016104ac565b606061333f8484600085613349565b90505b9392505050565b6060824710156133db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016104ac565b6133e4856134d0565b61344a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104ac565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516134739190613c2d565b60006040518083038185875af1925050503d80600081146134b0576040519150601f19603f3d011682016040523d82523d6000602084013e6134b5565b606091505b50915091506134c58282866134da565b979650505050505050565b803b15155b919050565b606083156134e9575081613342565b8251156134f95782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ac9190613c49565b60008083601f84011261353e578081fd5b50813567ffffffffffffffff811115613555578182fd5b6020830191508360208260051b850101111561357057600080fd5b9250929050565b60006101008284031215613589578081fd5b50919050565b600060c08284031215613589578081fd5b600060a08284031215613589578081fd5b803563ffffffff811681146134d557600080fd5b6000602082840312156135d6578081fd5b813561334281613f48565b600060208083850312156135f3578182fd5b825167ffffffffffffffff8082111561360a578384fd5b818501915085601f83011261361d578384fd5b81518181111561362f5761362f613f19565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110858211171561367257613672613f19565b604052828152858101935084860182860187018a1015613690578788fd5b8795505b838610156136b2578051855260019590950194938601938601613694565b5098975050505050505050565b6000602082840312156136d0578081fd5b81518015158114613342578182fd5b60008061012083850312156136f2578081fd5b82356136fd81613f48565b915061370c8460208501613577565b90509250929050565b6000806000806102a0858703121561372b578182fd5b843561373681613f48565b93506137458660208701613577565b925061375586610120870161358f565b9150613765866101e0870161358f565b905092959194509250565b6000806000806102008587031215613786578384fd5b843561379181613f48565b93506137a08660208701613577565b92506137b086610120870161358f565b939692955092936101e00135925050565b600080600061014084860312156137d6578283fd5b83356137e181613f48565b92506137f08560208601613577565b915061012084013590509250925092565b60008061012083850312156136f2578182fd5b60008060006101e08486031215613829578081fd5b833561383481613f48565b92506138438560208601613577565b915061385385610120860161358f565b90509250925092565b6000806040838503121561386e578182fd5b823561387981613f48565b9150602083013567ffffffffffffffff811115613894578182fd5b6138a0858286016135a0565b9150509250929050565b60008060008060008060a087890312156138c2578384fd5b86356138cd81613f48565b9550602087013567ffffffffffffffff808211156138e9578586fd5b6138f58a838b016135a0565b9650604089013591508082111561390a578586fd5b5061391789828a0161352d565b90955093505060608701359150613930608088016135b1565b90509295509295509295565b60008060006101008486031215613951578081fd5b833561395c81613f48565b9250602084013567ffffffffffffffff811115613977578182fd5b613983868287016135a0565b925050613853856040860161358f565b6000806000806000806000610160888a0312156139ae578485fd5b87356139b981613f48565b9650602088013567ffffffffffffffff808211156139d5578687fd5b6139e18b838c016135a0565b97506139f08b60408c0161358f565b96506101008a0135915080821115613a06578283fd5b50613a138a828b0161352d565b9095509350506101208801359150613a2e61014089016135b1565b905092959891949750929550565b6000806000806101208587031215613a52578182fd5b8435613a5d81613f48565b9350602085013567ffffffffffffffff811115613a78578283fd5b613a84878288016135a0565b935050613a94866040870161358f565b915061376561010086016135b1565b600080600060608486031215613ab7578081fd5b8335613ac281613f48565b9250602084013567ffffffffffffffff811115613add578182fd5b613ae9868287016135a0565b925050604084013590509250925092565b600080600060608486031215613b0e578081fd5b8335613b1981613f48565b9250602084013567ffffffffffffffff811115613b34578182fd5b613b40868287016135a0565b925050613853604085016135b1565b600060208284031215613b60578081fd5b5051919050565b60008060408385031215613b79578182fd5b505080516020909101519092909150565b600080600060608486031215613b9e578081fd5b8351925060208401519150604084015190509250925092565b600060208284031215613bc8578081fd5b813560ff81168114613342578182fd5b60008284526020808501945082825b85811015613c22578135613bfa81613f48565b73ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101613be7565b509495945050505050565b60008251613c3f818460208701613ebe565b9190910192915050565b6000602082528251806020840152613c68816040850160208701613ebe565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600086825260806020830152613cb4608083018688613bd8565b73ffffffffffffffffffffffffffffffffffffffff94909416604083015250606001529392505050565b600087825286602083015260a06040830152613cfe60a083018688613bd8565b73ffffffffffffffffffffffffffffffffffffffff9490941660608301525060800152949350505050565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015613d8557845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101613d53565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613de7578283fd5b83018035915067ffffffffffffffff821115613e01578283fd5b6020019150600581901b360382131561357057600080fd5b60008219821115613e2c57613e2c613eea565b500190565b600082613e65577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ea257613ea2613eea565b500290565b600082821015613eb957613eb9613eea565b500390565b60005b83811015613ed9578181015183820152602001613ec1565b8381111561057c5750506000910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114613f6a57600080fd5b5056fea26469706673582212208cc776a3ef117e9402a9ad8a1f13f6ec933aa59c94df5b2248689f718fe0dc6764736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005312b0d160e16feeeec13437a0053009e7564287
-----Decoded View---------------
Arg [0] : _tipJar (address): 0x5312B0d160E16feeeec13437a0053009e7564287
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005312b0d160e16feeeec13437a0053009e7564287
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.