Spend less on fees, more on crypto. Buy crypto easily with MoonPay Balance. 20M+ users trust MoonPay worldwide.
Ready to onboard to Ethereum? With MetaMask Portfolio, you're in control.
Don’t invest unless you’re prepared to lose all the money you invest.
Ready to simplify your web3 experience? Try the all-in-one web3 app trusted by millions worldwide.
Thousands of tokens and competitive prices from multiple aggregators, in one place.
Everyday giveaways up to 100 ETH, Lucky Spins. Deposit BONUS 300% and Cashbacks!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Slots, Roulette, Poker & more - Proud sponsors of UFC, Everton & StakeF1 team!
Overview
ETH Balance
Eth Value
$0.59 (@ $3,669.70/ETH)Token Holdings
Could not find any matches!
- ERC-20 Tokens (24)0.04858951 APEApeCoin (APE)$0.06@1.330.13637397 LINKChainLink To... (LINK)$3.21@23.560.28418957 MANADecentraland (MANA)$0.16@0.56880.00079988 FRAXFrax (FRAX)$0.00@0.99590.74338 GRTGraph Token (GRT)$0.18@0.24680.05624897 LDOLido DAO Tok... (LDO)$0.11@2.020.00035551 QNTQuant (QNT)$0.04@117.900.0676 RAIRai Reflex I... (RAI)$0.21@3.070.00002 SANDSAND (SAND)$0.00@0.699682,731.73586761 SHIBSHIBA INU (SHIB)$2.00@0.000.00219856 SUSHISushiToken (SUSHI)$0.00@1.820.01131678 SYNSynapse (SYN)$0.01@0.71930.04331656 UNIUniswap (UNI)$0.65@14.960.00000497 YFIyearn.financ... (YFI)$0.04@8,955.160.00089222 AAVEAave Token (AAVE)$0.30@336.890.92879912 MATICMatic Token (MATIC)$0.49@0.52260.002239 USDTTether USD (USDT)$0.00@0.99978.894259 USDCUSDC (USDC)$8.89@0.99950.00116667 WBTCWrapped BTC (WBTC)$118.53@101,594.000.00514356 WETHWrapped Ethe... (WETH)$18.88@3,669.6971.59016165 GALAGala1.59016165 GALAGala$0.07@0.043396.93140063 XAISideShift Token$13.42@0.13840.7 TokenERC-20 TOKEN*[Suspicious]NFT Tokens (18)claim rewards on clinknetwork.orgclinknetwork.orgERC-1155claim rewards on fraxprotocol.comfraxprotocol.comERC-1155claim rewards on galaevent.orggalaevent.orgERC-1155claim rewards on getaave.orggetaave.orgERC-1155claim rewards on getquant.orggetquant.orgERC-1155claim rewards on linkprize.iolinkprize.ioERC-1155claim rewards qntnetwork.orgqntnetwork.orgERC-1155claim rewards on shibportal.netshibportal.netERC-1155claim rewards on univ4portal.comuniv4portal.comERC-1155ERC-1155 TOKEN*[Suspicious]
More Info
Private Name Tags
ContractCreator
- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
- Cards New
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 25 from a total of 512 transactions
Transaction Hash MethodBlockFromToUni Swap V2To 17495820 2023-06-17 0:00:11 570 days ago 1686960011 IN 0 ETH$0.00 0.0005295 16.79795787 Uni Swap V2To 17495811 2023-06-16 23:58:23 570 days ago 1686959903 IN 0 ETH$0.00 0.00047966 15.21689201 Balancer Swap To 17445172 2023-06-09 20:55:35 577 days ago 1686344135 IN 0 ETH$0.00 0.00187666 25.76390864 Balancer Swap To 17445163 2023-06-09 20:53:47 577 days ago 1686344027 IN 0 ETH$0.00 0.00191734 26.32234548 Balancer Swap To 17445148 2023-06-09 20:50:47 577 days ago 1686343847 IN 0 ETH$0.00 0.00229406 31.49411075 Uni Swap V2To 17415991 2023-06-05 18:08:47 581 days ago 1685988527 IN 0 ETH$0.00 0.00904015 57.74724467 Uni Swap V3To 17411324 2023-06-05 2:17:59 582 days ago 1685931479 IN 0 ETH$0.00 0.0005679 18.1997792 Uni Swap V2To 17373376 2023-05-30 17:59:23 587 days ago 1685469563 IN 0 ETH$0.00 0.00161537 51.26555973 Uni Swap V2To 17373370 2023-05-30 17:57:59 587 days ago 1685469479 IN 0 ETH$0.00 0.00152892 48.52203992 Balancer Swap To 17372977 2023-05-30 16:38:59 587 days ago 1685464739 IN 0 ETH$0.00 0.00428587 59.03980462 Balancer Swap To 17372940 2023-05-30 16:31:35 587 days ago 1685464295 IN 0 ETH$0.00 0.00469142 64.3957596 Balancer Swap To 17367845 2023-05-29 23:16:11 588 days ago 1685402171 IN 0 ETH$0.00 0.00266997 36.65488861 Balancer Swap To 17367825 2023-05-29 23:12:11 588 days ago 1685401931 IN 0 ETH$0.00 0.00247026 33.9130898 Balancer Swap To 17367822 2023-05-29 23:11:35 588 days ago 1685401895 IN 0 ETH$0.00 0.00257435 35.34206043 Uni Swap V2To 17365420 2023-05-29 15:05:23 588 days ago 1685372723 IN 0 ETH$0.00 0.00211572 67.11901404 Balancer Swap To 17362364 2023-05-29 4:46:47 589 days ago 1685335607 IN 0 ETH$0.00 0.00189229 26.067134 Uni Swap V2To 17362294 2023-05-29 4:32:35 589 days ago 1685334755 IN 0 ETH$0.00 0.00073158 23.21757187 Uni Swap V2To 17362267 2023-05-29 4:26:59 589 days ago 1685334419 IN 0 ETH$0.00 0.00079857 25.34345377 Uni Swap V2To 17340040 2023-05-26 1:34:23 592 days ago 1685064863 IN 0 ETH$0.00 0.000814 25.82324514 Uni Swap V2To 17340036 2023-05-26 1:33:35 592 days ago 1685064815 IN 0 ETH$0.00 0.00091528 29.03632149 Balancer Swap To 17339856 2023-05-26 0:57:11 592 days ago 1685062631 IN 0 ETH$0.00 0.00199623 27.49452076 Balancer Swap To 17317540 2023-05-22 21:35:23 595 days ago 1684791323 IN 0 ETH$0.00 0.00578066 79 Balancer Swap To 17315561 2023-05-22 14:56:11 595 days ago 1684767371 IN 0 ETH$0.00 0.00405697 55.88665009 Uni Swap V3To 17312889 2023-05-22 5:54:35 596 days ago 1684734875 IN 0 ETH$0.00 0.00080289 25.74028476 Uni Swap V3To 17311735 2023-05-22 1:59:47 596 days ago 1684720787 IN 0 ETH$0.00 0.00085117 27.28813116 Latest 16 internal transactions
Advanced mode:Parent Transaction Hash Block FromTo17170868 2023-05-02 4:57:59 616 days ago 1683003479 15.30425095 ETH$56,161.96 17170868 2023-05-02 4:57:59 616 days ago 1683003479 15.30425095 ETH$56,161.96 17090609 2023-04-20 22:24:23 627 days ago 1682029463 0.089982 ETH$330.21 17021503 2023-04-11 1:04:59 637 days ago 1681175099 0.52269544 ETH$1,918.13 16986872 2023-04-06 3:07:47 642 days ago 1680750467 0.009998 ETH$36.69 16803011 2023-03-11 6:18:23 668 days ago 1678515503 0.069986 ETH$256.83 16766026 2023-03-06 1:23:35 673 days ago 1678065815 0.019996 ETH$73.38 16695279 2023-02-24 2:34:59 683 days ago 1677206099 0.04999 ETH$183.45 16657838 2023-02-18 20:18:35 688 days ago 1676751515 0.034993 ETH$128.41 16599512 2023-02-10 16:20:47 696 days ago 1676046047 6.94861 ETH$25,499.29 16582027 2023-02-08 5:38:59 699 days ago 1675834739 0.04999 ETH$183.45 16576881 2023-02-07 12:23:35 699 days ago 1675772615 0.0009998 ETH$3.67 16567112 2023-02-06 3:38:59 701 days ago 1675654739 0.129974 ETH$476.97 16232046 2022-12-21 9:00:59 748 days ago 1671613259 0.0009998 ETH$3.67 16219736 2022-12-19 15:47:47 749 days ago 1671464867 0.004999 ETH$18.34 16219719 2022-12-19 15:44:23 749 days ago 1671464663 0.0044991 ETH$16.51 Loading...LoadingContract Name:MainnetRouter
Compiler Versionv0.8.9+commit.e5eed63a
Optimization Enabled:No with 200 runs
Other Settings:default evmVersionContract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "../interfaces/router/IUniswapV1Router.sol"; import "../interfaces/router/IUniswapV2Router.sol"; import "../interfaces/router/IUniswapV3Router.sol"; import "../interfaces/router/IBalancerRouter.sol"; import "../interfaces/router/ICurveTC1Router.sol"; import "../interfaces/router/IBancorRouter.sol"; import "../interfaces/router/IDodoRouter.sol"; import "../interfaces/router/IKyberRouter.sol"; import "@rari-capital/solmate/src/utils/SafeTransferLib.sol"; import "@rari-capital/solmate/src/tokens/ERC20.sol"; import "@rari-capital/solmate/src/tokens/WETH.sol"; // Import hardhat console import "hardhat/console.sol"; /// @title Router contract that swaps tokens with different DEXs. contract MainnetRouter { IUniswapV3Router private immutable UniV3Router; ICurveTC1Router private immutable curveTC1Router; IBalancerRouter private immutable balancer; IBancorRouter private immutable bancorRouter; IDodoRouter private immutable DodoV2Router; address public immutable DODOApproveProxy; WETH private immutable WETHContract; address private constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; uint32 public immutable _fee; constructor( IUniswapV3Router _uniswapV3Router, IBalancerRouter _balancer, ICurveTC1Router _curveTC1Router, IBancorRouter _bancorRouter, IDodoRouter _DodoRouter, address _dodoApproveProxy, address payable _WETHAddress, uint32 fee ) { UniV3Router = _uniswapV3Router; balancer = _balancer; curveTC1Router = _curveTC1Router; bancorRouter = _bancorRouter; DodoV2Router = _DodoRouter; DODOApproveProxy = _dodoApproveProxy; WETHContract = WETH(_WETHAddress); _fee = fee; } struct Amounts { uint256 amountIn; uint256 amountOutMin; uint256 minETH; } /// @notice Swap tokens using UniV1 router with to address specified // NOTE: No input checks - should be checked in the frontend /// @param amounts Struct with amountIn, Out, and minEth to avoid stack to deep error /// @param path The addresses of tokens to be swapped - source token and destination token /// @param pair The pool address for the tokens to be swapped /// @param deadline The deadline for the swap /// @param to The receiver address /// @return amountOut The amount of destination token received function uniSwapV1To( Amounts memory amounts, address[] calldata path, address pair, uint256 deadline, address to, bool toETH ) public payable returns (uint256 amountOut) { if (msg.value != 0) { unchecked { amountOut = IUniswapV1Router(pair).ethToTokenTransferInput{ value: (msg.value * _fee) / 10000 }(amounts.amountOutMin, deadline, to); } } else { SafeTransferLib.safeTransferFrom( ERC20(path[0]), msg.sender, address(this), amounts.amountIn ); unchecked { amounts.amountIn = (amounts.amountIn * _fee) / 10000; } SafeTransferLib.safeApprove(ERC20(path[0]), pair, amounts.amountIn); if (toETH) { amountOut = IUniswapV1Router(pair).tokenToEthTransferInput( amounts.amountIn, amounts.amountOutMin, deadline, to ); } else { amountOut = IUniswapV1Router(pair).tokenToTokenTransferInput( amounts.amountIn, amounts.amountOutMin, amounts.minETH, deadline, to, path[1] ); } } } /// @notice Swap tokens using Sushiswap pool with to address specified // NOTE: No input checks - should be checked in the frontend /// @param amountIn The amount of source token to be swapped /// @param amountOutMin The minimum amount of destination token to be received /// @param path The addresses of tokens to be swapped - source token and destination token /// @param deadline The deadline for the swap /// @param to The receiver address /// @param router The address for the router being that forked UniV2 e.g. UniV2. Sushiswap, PancakeSwap etc. /// @return amountOut The amount of destination token received function uniSwapV2To( uint256 amountIn, uint256 amountOutMin, address[] memory path, uint256 deadline, address to, IUniswapV2Router router ) public payable returns (uint256 amountOut) { uint256[] memory amounts; if (msg.value != 0) { unchecked { amounts = router.swapExactETHForTokens{ value: (msg.value * _fee) / 10000 }(amountOutMin, path, to, deadline); } } else { bool ToETH = path[1] == address(0); SafeTransferLib.safeTransferFrom( ERC20(path[0]), msg.sender, address(this), amountIn ); unchecked { amountIn = (amountIn * _fee) / 10000; } SafeTransferLib.safeApprove( ERC20(path[0]), address(router), amountIn ); if (!ToETH) { amounts = router.swapExactTokensForTokens( amountIn, amountOutMin, path, to, deadline ); } else { path[1] = address(WETHContract); amounts = router.swapExactTokensForETH( amountIn, amountOutMin, path, to, deadline ); } } return amounts[1]; } /// @notice Swap tokens using UniV3 router with to address specified // NOTE: No input checks - should be checked in the frontend /// @param amountIn The amount of source token to be swapped /// @param amountOutMin The minimum amount of destination token to be received /// @param path The addresses of tokens to be swapped - source token and destination token /// @param deadline The deadline for the swap /// @param fee The fee for the pool being swapped with /// @param to The receiver address /// @return amountOut The amount of destination token received function uniSwapV3To( uint256 amountIn, uint256 amountOutMin, address[] memory path, uint256 deadline, uint24 fee, address payable to ) public payable returns (uint256 amountOut) { if (msg.value != 0) { unchecked { amountIn = (msg.value * _fee) / 10000; } WETHContract.deposit{value: amountIn}(); SafeTransferLib.safeApprove( ERC20(path[0]), address(UniV3Router), amountIn ); amountOut = UniV3Router.exactInputSingle( IUniswapV3Router.ExactInputSingleParams( path[0], path[1], fee, to, deadline, amountIn, amountOutMin, 0 ) ); } else { SafeTransferLib.safeTransferFrom( ERC20(path[0]), msg.sender, address(this), amountIn ); unchecked { amountIn = (amountIn * _fee) / 10000; } SafeTransferLib.safeApprove( ERC20(path[0]), address(UniV3Router), amountIn ); bool toETH = path[1] == address(0); if (!toETH) { amountOut = UniV3Router.exactInputSingle( IUniswapV3Router.ExactInputSingleParams( path[0], path[1], fee, to, deadline, amountIn, amountOutMin, 0 ) ); } else { amountOut = UniV3Router.exactInputSingle( IUniswapV3Router.ExactInputSingleParams( path[0], address(WETHContract), fee, address(this), deadline, amountIn, amountOutMin, 0 ) ); WETHContract.withdraw(amountOut); SafeTransferLib.safeTransferETH(to, amountOut); } } } /// @notice Swap tokens using Balancer router with to specified // NOTE: No input checks - should be checked in the frontend /// @param amountIn The amount of source token to be swapped /// @param amountOutMin The minimum amount of destination token to be received /// @param path The addresses of tokens to be swapped /// @param deadline The deadline for the swap /// @param poolId The id for the balancer pool /// @param to The receiver address /// @return amountOut The amount of destination token received from the swap function balancerSwapTo( uint256 amountIn, uint256 amountOutMin, address[] calldata path, uint256 deadline, bytes32 poolId, address payable to ) public payable returns (uint256 amountOut) { SafeTransferLib.safeTransferFrom( ERC20(path[0]), msg.sender, address(this), amountIn ); unchecked { amountIn = (amountIn * _fee) / 10000; } SafeTransferLib.safeApprove( ERC20(path[0]), address(balancer), amountIn ); amountOut = balancer.swap( IBalancerRouter.SingleSwap({ poolId: poolId, kind: IBalancerRouter.SwapKind.GIVEN_IN, assetIn: path[0], assetOut: path[1], amount: amountIn, userData: "0x" }), IBalancerRouter.FundManagement({ sender: address(this), fromInternalBalance: false, recipient: to, toInternalBalance: false }), amountOutMin, deadline ); } /// @notice Swap tokens using Curve router with to address specified // NOTE: No input checks - should be checked in the frontend /// @param amountIn The amount of source token to be swapped /// @param amountOutMin The minimum amount of destination token to be received /// @param path The addresses of tokens to be swapped - token A and token B /// @param pair The pool address for the tokens to be swapped /// @param to The receiver address /// @return amountOut The amount of destination token received function curveSwapTo( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address pair, address to ) public payable returns (uint256 amountOut) { if (msg.value != 0) { unchecked { amountIn = (msg.value * _fee) / 10000; amountOut = curveTC1Router.exchange{value: amountIn}( pair, path[0], path[1], amountIn, amountOutMin, to ); } } else { SafeTransferLib.safeTransferFrom( ERC20(path[0]), msg.sender, address(this), amountIn ); unchecked { amountIn = (amountIn * _fee) / 10000; } SafeTransferLib.safeApprove( ERC20(path[0]), address(curveTC1Router), amountIn ); amountOut = curveTC1Router.exchange( pair, path[0], path[1], amountIn, amountOutMin, to ); } } /// @notice Swap tokens using UniV2 router with to address specified // NOTE: No input checks - should be checked in the frontend /// @param amountIn The amount of source token to be swapped /// @param amountOutMin The minimum amount of destination token to be received /// @param path The addresses of tokens to be swapped - source token and destination token /// @param deadline The deadline for the swap /// @param to The receiver address /// @return amountOut The amount of destination token received function bancorSwapTo( uint256 amountIn, uint256 amountOutMin, address[] memory path, uint256 deadline, address to ) public payable returns (uint256 amountOut) { if (msg.value != 0) { unchecked { amountIn = (msg.value * _fee) / 10000; amountOut = bancorRouter.tradeBySourceAmount{value: amountIn}( path[0], path[1], amountIn, amountOutMin, deadline, to ); } } else { SafeTransferLib.safeTransferFrom( ERC20(path[0]), msg.sender, address(this), amountIn ); unchecked { amountIn = (amountIn * _fee) / 10000; } SafeTransferLib.safeApprove( ERC20(path[0]), address(bancorRouter), amountIn ); amountOut = bancorRouter.tradeBySourceAmount( path[0], path[1], amountIn, amountOutMin, deadline, to ); } } /// @notice Swap tokens using UniV2 router with to address specified // NOTE: No input checks - should be checked in the frontend /// @param amountIn The amount of source token to be swapped /// @param amountOutMin The minimum amount of destination token to be received /// @param path The addresses of tokens to be swapped - source token and destination token /// @param deadline The deadline for the swap /// @param to The receiver address /// @return amountOut The amount of destination token received function dodoSwapTo( uint256 amountIn, uint256 amountOutMin, address[] memory path, address[] calldata pair, uint256 deadline, uint256 direction, address to ) public payable returns (uint256 amountOut) { if (msg.value != 0) { amountOut = DodoV2Router.dodoSwapV2ETHToToken{ value: (msg.value * _fee) / 10000 }(path[1], amountOutMin, pair, direction, false, deadline); SafeTransferLib.safeTransfer(ERC20(path[1]), to, amountOut); } else { bool toETH = path[1] == address(0); SafeTransferLib.safeTransferFrom( ERC20(path[0]), msg.sender, address(this), amountIn ); unchecked { amountIn = (amountIn * _fee) / 10000; } SafeTransferLib.safeApprove( ERC20(path[0]), DODOApproveProxy, amountIn ); if (toETH) { amountOut = DodoV2Router.dodoSwapV2TokenToETH( path[0], amountIn, amountOutMin, pair, direction, false, deadline ); SafeTransferLib.safeTransferETH(to, amountOut); } else { amountOut = DodoV2Router.dodoSwapV2TokenToToken( path[0], path[1], amountIn, amountOutMin, pair, direction, false, deadline ); SafeTransferLib.safeTransfer(ERC20(path[1]), to, amountOut); } } } /// @notice Swap tokens using UniV3 router with to address specified // NOTE: No input checks - should be checked in the frontend /// @param amountIn The amount of source token to be swapped /// @param amountOutMin The minimum amount of destination token to be received /// @param path The addresses of tokens to be swapped - source token and destination token /// @param deadline The deadline for the swap /// @param fee The fee for the pool being swapped with /// @param to The receiver address /// @return amountOut The amount of destination token received function kyberSwapTo( uint256 amountIn, uint256 amountOutMin, address[] memory path, uint256 deadline, uint24 fee, IKyberRouter router, address payable to ) public payable returns (uint256 amountOut) { if (msg.value != 0) { unchecked { amountIn = (msg.value * _fee) / 10000; } WETHContract.deposit{value: amountIn}(); SafeTransferLib.safeApprove( ERC20(path[0]), address(router), amountIn ); amountOut = router.swapExactInputSingle( IKyberRouter.ExactInputSingleParams( path[0], path[1], fee, to, deadline, amountIn, amountOutMin, 0 ) ); } else { SafeTransferLib.safeTransferFrom( ERC20(path[0]), msg.sender, address(this), amountIn ); unchecked { amountIn = (amountIn * _fee) / 10000; } bool toETH = path[1] == address(0); SafeTransferLib.safeApprove( ERC20(path[0]), address(router), amountIn ); if (!toETH) { amountOut = router.swapExactInputSingle( IKyberRouter.ExactInputSingleParams( path[0], path[path.length - 1], fee, to, deadline, amountIn, amountOutMin, 0 ) ); } else { amountOut = router.swapExactInputSingle( IKyberRouter.ExactInputSingleParams( path[0], address(WETHContract), fee, address(this), deadline, amountIn, amountOutMin, 0 ) ); WETHContract.withdraw(amountOut); SafeTransferLib.safeTransferETH(to, amountOut); } } } ////////////////////////////////////////// ADMIN FUNCTIONS ////////////////////////////////////////// /// @notice Flushes the balance of the contract for a token to an address /// @param _token The address of the token to be flushed /// @param _to The address to which the balance will be flushed function flush(ERC20 _token, address _to) external { uint256 amount = _token.balanceOf(address(this)); assembly { if iszero( eq(caller(), 0x123CB0304c7f65B0D48276b9857F4DF4733d1dd8) // Required address to flush ) { revert(0, 0) } // We'll write our calldata to this slot. let memPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with function selector mstore(0x00, 0xa9059cbb) mstore(0x20, _to) // append the 'to' argument mstore(0x40, amount) // append the 'amount' argument if iszero( and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), // We use 0x64 because that's the total length of our call data (0x04 + 0x20 * 3) // Counterintuitively, this call() must be positioned after the or() in the // surrounding and() because and() evaluates its arguments from right to left. call(gas(), _token, 0, 0x1c, 0x60, 0x00, 0x20) // Adjusted above by changing 0x64 to 0x60 ) ) { // Store the function selector of TransferFromFailed() mstore(0x00, 0x7939f424) // Revert with (offset, size) revert(0x1c, 0x04) } mstore(0x60, 0) // Restore the zero slot to zero mstore(0x40, memPointer) // Restore the mempointer } } /// @notice Flushes the ETH balance of the contract to an address /// @param to The address to which the balance will be flushed function flushETH(address to) external { uint256 amount = address(this).balance; assembly { if iszero( eq(caller(), 0x123CB0304c7f65B0D48276b9857F4DF4733d1dd8) // Required address to flush ) { revert(0, 0) } if iszero( and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), // We use 0x64 because that's the total length of our call data (0x04 + 0x20 * 3) // Counterintuitively, this call() must be positioned after the or() in the // surrounding and() because and() evaluates its arguments from right to left. call(gas(), to, amount, 0, 0, 0, 0) // Adjusted above by changing 0x64 to 0x60 ) ) { // Store the function selector of TransferFromFailed() mstore(0x00, 0x7939f424) // Revert with (offset, size) revert(0x1c, 0x04) } } } /// @notice receive fallback function for empty call data receive() external payable {} /// @notice fallback function when no other function matches fallback() external payable {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; interface IUniswapV1Router { function tokenToEthTransferInput( uint256 amountIn, uint256 amountOutMin, uint256 deadline, address to ) external returns (uint256 amountOut); function ethToTokenTransferInput( uint256 amountOutMin, uint256 deadline, address to ) external payable returns (uint256 amountOut); function tokenToTokenTransferInput( uint256 amountIn, uint256 amountOutMin, uint256 minETHOut, uint256 deadline, address recipient, address tokenAddress ) external payable returns (uint256 amountOut); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; interface IUniswapV2Router { function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; // import "@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol"; /// @title Router token swapping functionality /// @notice Functions for swapping tokens via Uniswap V3 interface IUniswapV3Router { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } /// @notice Swaps `amountIn` of one token for as much as possible of another token /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata /// @return amountOut The amount of the received token function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMin; } function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; interface IBalancerRouter { enum SwapKind { GIVEN_IN, GIVEN_OUT } struct SingleSwap { bytes32 poolId; SwapKind kind; address assetIn; address assetOut; uint256 amount; bytes userData; } struct FundManagement { address sender; bool fromInternalBalance; address payable recipient; bool toInternalBalance; } struct Asset { string symbol; uint8 decimals; uint256 limit; } struct BatchSwapStep { bytes32 poolId; uint256 assetInIndex; uint256 assetOutIndex; uint256 amount; bytes userData; } function swap( SingleSwap memory swap, FundManagement memory fund, uint256 limit, uint256 deadline ) external payable returns (uint256); function batchSwap( SwapKind kind, BatchSwapStep[] calldata swaps, address[] calldata assets, FundManagement memory fund, int256[] calldata limits, uint256 deadline ) external payable returns (int256[] calldata assetDeltas); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; interface ICurveTC1Router { function exchange_with_best_rate( address _from, address _to, uint256 _amount, uint256 _expected, address _receiver ) external returns (uint256); function exchange( address pool, address _from, address _to, uint256 _amount, uint256 _expected, address _receiver ) payable external returns (uint256); function exchange_multiple( address[9] calldata _route, uint256[3][4] calldata _swap_params, uint256 _amount, uint256 _expected, address[4] calldata _pools, address _receiver ) external payable returns (uint256); function is_killed() external view returns (bool); function registry() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; interface IBancorRouter { function tradeBySourceAmount( address sourceToken, address targetToken, uint256 sourceAmount, uint256 minReturnAmount, uint256 deadline, address receipient ) external payable returns (uint256 targetAmount); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; interface IDodoRouter { function dodoSwapV2TokenToETH( address fromToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine ) external returns (uint256 amountOut); function dodoSwapV2ETHToToken( address toToken, uint256 minReturnAmount, address[] memory dodoPairs, uint256 direction, bool isIncentive, uint256 deadLine ) external payable returns (uint256 amountOut); function dodoSwapV2TokenToToken( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, bool isIncentive, uint256 deadLine ) external returns (uint256 amountOut); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; // import "@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol"; /// @title Router token swapping functionality /// @notice Functions for swapping tokens via Uniswap V3 interface IKyberRouter { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } /// @notice Swaps `amountIn` of one token for as much as possible of another token /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata /// @return amountOut The amount of the received token function swapExactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMin; } function swapExactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; import {ERC20} from "../tokens/ERC20.sol"; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol) /// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer. /// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller. library SafeTransferLib { /*////////////////////////////////////////////////////////////// ETH OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferETH(address to, uint256 amount) internal { bool success; assembly { // Transfer the ETH and store if it succeeded or not. success := call(gas(), to, amount, 0, 0, 0, 0) } require(success, "ETH_TRANSFER_FAILED"); } /*////////////////////////////////////////////////////////////// ERC20 OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferFrom( ERC20 token, address from, address to, uint256 amount ) internal { bool success; assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument. mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 100, 0, 32) ) } require(success, "TRANSFER_FROM_FAILED"); } function safeTransfer( ERC20 token, address to, uint256 amount ) internal { bool success; assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) ) } require(success, "TRANSFER_FAILED"); } function safeApprove( ERC20 token, address to, uint256 amount ) internal { bool success; assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) ) } require(success, "APPROVE_FAILED"); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; import {ERC20} from "./ERC20.sol"; import {SafeTransferLib} from "../utils/SafeTransferLib.sol"; /// @notice Minimalist and modern Wrapped Ether implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/WETH.sol) /// @author Inspired by WETH9 (https://github.com/dapphub/ds-weth/blob/master/src/weth9.sol) contract WETH is ERC20("Wrapped Ether", "WETH", 18) { using SafeTransferLib for address; event Deposit(address indexed from, uint256 amount); event Withdrawal(address indexed to, uint256 amount); function deposit() public payable virtual { _mint(msg.sender, msg.value); emit Deposit(msg.sender, msg.value); } function withdraw(uint256 amount) public virtual { _burn(msg.sender, amount); emit Withdrawal(msg.sender, amount); msg.sender.safeTransferETH(amount); } receive() external payable virtual { deposit(); } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
[{"inputs":[{"internalType":"contract IUniswapV3Router","name":"_uniswapV3Router","type":"address"},{"internalType":"contract IBalancerRouter","name":"_balancer","type":"address"},{"internalType":"contract ICurveTC1Router","name":"_curveTC1Router","type":"address"},{"internalType":"contract IBancorRouter","name":"_bancorRouter","type":"address"},{"internalType":"contract IDodoRouter","name":"_DodoRouter","type":"address"},{"internalType":"address","name":"_dodoApproveProxy","type":"address"},{"internalType":"address payable","name":"_WETHAddress","type":"address"},{"internalType":"uint32","name":"fee","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DODOApproveProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_fee","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"address payable","name":"to","type":"address"}],"name":"balancerSwapTo","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"bancorSwapTo","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"curveSwapTo","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address[]","name":"pair","type":"address[]"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"direction","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"dodoSwapTo","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"flush","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"flushETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"contract IKyberRouter","name":"router","type":"address"},{"internalType":"address payable","name":"to","type":"address"}],"name":"kyberSwapTo","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"minETH","type":"uint256"}],"internalType":"struct MainnetRouter.Amounts","name":"amounts","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"toETH","type":"bool"}],"name":"uniSwapV1To","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"contract IUniswapV2Router","name":"router","type":"address"}],"name":"uniSwapV2To","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"address payable","name":"to","type":"address"}],"name":"uniSwapV3To","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101806040523480156200001257600080fd5b50604051620046b0380380620046b0833981810160405281019062000038919062000413565b8773ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508673ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508573ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508473ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff16815250508373ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff16815250508063ffffffff166101608163ffffffff16815250505050505050505050620004dc565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001fc82620001cf565b9050919050565b60006200021082620001ef565b9050919050565b620002228162000203565b81146200022e57600080fd5b50565b600081519050620002428162000217565b92915050565b60006200025582620001ef565b9050919050565b620002678162000248565b81146200027357600080fd5b50565b60008151905062000287816200025c565b92915050565b60006200029a82620001ef565b9050919050565b620002ac816200028d565b8114620002b857600080fd5b50565b600081519050620002cc81620002a1565b92915050565b6000620002df82620001ef565b9050919050565b620002f181620002d2565b8114620002fd57600080fd5b50565b6000815190506200031181620002e6565b92915050565b60006200032482620001ef565b9050919050565b620003368162000317565b81146200034257600080fd5b50565b60008151905062000356816200032b565b92915050565b6200036781620001ef565b81146200037357600080fd5b50565b60008151905062000387816200035c565b92915050565b60006200039a82620001cf565b9050919050565b620003ac816200038d565b8114620003b857600080fd5b50565b600081519050620003cc81620003a1565b92915050565b600063ffffffff82169050919050565b620003ed81620003d2565b8114620003f957600080fd5b50565b6000815190506200040d81620003e2565b92915050565b600080600080600080600080610100898b031215620004375762000436620001ca565b5b6000620004478b828c0162000231565b98505060206200045a8b828c0162000276565b97505060406200046d8b828c01620002bb565b9650506060620004808b828c0162000300565b9550506080620004938b828c0162000345565b94505060a0620004a68b828c0162000376565b93505060c0620004b98b828c01620003bb565b92505060e0620004cc8b828c01620003fc565b9150509295985092959890939650565b60805160a05160c05160e051610100516101205161014051610160516140876200062960003960008181610317015281816105ec0152818161076401528181610a2401528181610b5501528181610d9a01528181610ef101528181611090015281816111810152818161147f015281816115fd015281816117c00152818161183f01528181611aa901528181611ed5015261217f015260008181610c590152818161187901528181611d2601528181611e2601528181611f0f0152818161245001526125500152600081816107bd015261179c0152600081816105ad015281816107ea01526108d0015260008181610dd401528181610f4a0152610f7101526000818161037d01526103a40152600081816114b901528181611663015261168a015260008181611faf01528181611fd6015281816121d80152818161225201526123d101526140876000f3fe6080604052600436106100ab5760003560e01c8063a354a50211610064578063a354a502146101cd578063a9bf959d146101fd578063c5b37c2214610228578063dc42688114610253578063ee6c571a1461027c578063f5bf2a32146102ac576100b2565b806327b4fbac146100b45780632d75fbc4146100e45780634271a6d11461011457806345534b9d146101445780636ccf08f2146101745780639cfddc36146101a4576100b2565b366100b257005b005b6100ce60048036038101906100c99190612955565b6102dc565b6040516100db9190612a13565b60405180910390f35b6100fe60048036038101906100f99190612bbb565b6105a2565b60405161010b9190612a13565b60405180910390f35b61012e60048036038101906101299190612cd7565b6109f7565b60405161013b9190612a13565b60405180910390f35b61015e60048036038101906101599190612d80565b610d8c565b60405161016b9190612a13565b60405180910390f35b61018e60048036038101906101899190612eb8565b611066565b60405161019b9190612a13565b60405180910390f35b3480156101b057600080fd5b506101cb60048036038101906101c69190612fa6565b611379565b005b6101e760048036038101906101e29190612fe6565b611471565b6040516101f49190612a13565b60405180910390f35b34801561020957600080fd5b5061021261179a565b60405161021f919061308f565b60405180910390f35b34801561023457600080fd5b5061023d6117be565b60405161024a91906130c9565b60405180910390f35b34801561025f57600080fd5b5061027a600480360381019061027591906130e4565b6117e2565b005b6102966004803603810190610291919061318a565b611831565b6040516102a39190612a13565b60405180910390f35b6102c660048036038101906102c19190613248565b611ec7565b6040516102d39190612a13565b60405180910390f35b6000610312868660008181106102f5576102f46132f1565b5b905060200201602081019061030a91906130e4565b33308b6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff1689028161034c5761034b613320565b5b0497506103a286866000818110610366576103656132f1565b5b905060200201602081019061037b91906130e4565b7f00000000000000000000000000000000000000000000000000000000000000008a61268f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166352bbbe296040518060c00160405280868152602001600060018111156104035761040261334f565b5b81526020018989600081811061041c5761041b6132f1565b5b905060200201602081019061043191906130e4565b73ffffffffffffffffffffffffffffffffffffffff168152602001898960018181106104605761045f6132f1565b5b905060200201602081019061047591906130e4565b73ffffffffffffffffffffffffffffffffffffffff1681526020018b81526020016040518060400160405280600281526020017f307800000000000000000000000000000000000000000000000000000000000081525081525060405180608001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600015158152508a886040518563ffffffff1660e01b81526004016105439493929190613577565b602060405180830381600087803b15801561055d57600080fd5b505af1158015610571573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059591906135d8565b9050979650505050505050565b60008034146106ea577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635028bb956127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff163461061c9190613634565b610626919061368e565b8960018151811061063a576106396132f1565b5b60200260200101518b8a8a8960008c6040518963ffffffff1660e01b815260040161066b9796959493929190613782565b6020604051808303818588803b15801561068457600080fd5b505af1158015610698573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906106bd91906135d8565b90506106e5876001815181106106d6576106d56132f1565b5b60200260200101518383612727565b6109eb565b60008073ffffffffffffffffffffffffffffffffffffffff1688600181518110610717576107166132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614905061075f8860008151811061074f5761074e6132f1565b5b602002602001015133308d6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff168b028161079957610798613320565b5b0499506107e2886000815181106107b3576107b26132f1565b5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000008c61268f565b80156108ce577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631e6d24c289600081518110610838576108376132f1565b5b60200260200101518c8c8b8b8a60008d6040518963ffffffff1660e01b815260040161086b9897969594939291906137ec565b602060405180830381600087803b15801561088557600080fd5b505af1158015610899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bd91906135d8565b91506108c983836127bf565b6109e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f87dc1b78960008151811061091e5761091d6132f1565b5b60200260200101518a60018151811061093a576109396132f1565b5b60200260200101518d8d8c8c8b60008e6040518a63ffffffff1660e01b815260040161096e99989796959493929190613864565b602060405180830381600087803b15801561098857600080fd5b505af115801561099c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c091906135d8565b91506109e8886001815181106109d9576109d86132f1565b5b60200260200101518484612727565b5b505b98975050505050505050565b6000606060003414610adb578273ffffffffffffffffffffffffffffffffffffffff16637ff36ab56127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff16340281610a5957610a58613320565b5b048989888a6040518663ffffffff1660e01b8152600401610a7d9493929190613971565b6000604051808303818588803b158015610a9657600080fd5b505af1158015610aaa573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f82011682018060405250810190610ad49190613a80565b9050610d63565b60008073ffffffffffffffffffffffffffffffffffffffff1687600181518110610b0857610b076132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16149050610b5087600081518110610b4057610b3f6132f1565b5b602002602001015133308c6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff168a0281610b8a57610b89613320565b5b049850610bb387600081518110610ba457610ba36132f1565b5b6020026020010151858b61268f565b80610c57578373ffffffffffffffffffffffffffffffffffffffff166338ed17398a8a8a898b6040518663ffffffff1660e01b8152600401610bf9959493929190613ac9565b600060405180830381600087803b158015610c1357600080fd5b505af1158015610c27573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c509190613a80565b9150610d61565b7f000000000000000000000000000000000000000000000000000000000000000087600181518110610c8c57610c8b6132f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508373ffffffffffffffffffffffffffffffffffffffff166318cbafe58a8a8a898b6040518663ffffffff1660e01b8152600401610d07959493929190613ac9565b600060405180830381600087803b158015610d2157600080fd5b505af1158015610d35573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d5e9190613a80565b91505b505b80600181518110610d7757610d766132f1565b5b60200260200101519150509695505050505050565b6000803414610ec5576127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff16340281610dcf57610dce613320565b5b0495507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3a4acd38786600081518110610e2357610e226132f1565b5b602002602001015187600181518110610e3f57610e3e6132f1565b5b60200260200101518a8a89896040518863ffffffff1660e01b8152600401610e6c96959493929190613b23565b6020604051808303818588803b158015610e8557600080fd5b505af1158015610e99573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ebe91906135d8565b905061105d565b610eec84600081518110610edc57610edb6132f1565b5b60200260200101513330896125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff16870281610f2657610f25613320565b5b049550610f6f84600081518110610f4057610f3f6132f1565b5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000008861268f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3a4acd385600081518110610fbf57610fbe6132f1565b5b602002602001015186600181518110610fdb57610fda6132f1565b5b6020026020010151898988886040518763ffffffff1660e01b815260040161100896959493929190613b23565b602060405180830381600087803b15801561102257600080fd5b505af1158015611036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105a91906135d8565b90505b95945050505050565b6000803414611144578473ffffffffffffffffffffffffffffffffffffffff1663ad65d76d6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff163402816110c5576110c4613320565b5b048a6020015187876040518563ffffffff1660e01b81526004016110eb93929190613b84565b6020604051808303818588803b15801561110457600080fd5b505af1158015611118573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061113d91906135d8565b905061136e565b61117c8787600081811061115b5761115a6132f1565b5b905060200201602081019061117091906130e4565b33308b600001516125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff16896000015102816111ba576111b9613320565b5b048860000181815250506111fb878760008181106111db576111da6132f1565b5b90506020020160208101906111f091906130e4565b868a6000015161268f565b81156112a1578473ffffffffffffffffffffffffffffffffffffffff16637237e03189600001518a6020015187876040518563ffffffff1660e01b81526004016112489493929190613bbb565b602060405180830381600087803b15801561126257600080fd5b505af1158015611276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129a91906135d8565b905061136d565b8473ffffffffffffffffffffffffffffffffffffffff1663f552d91b89600001518a602001518b6040015188888d8d60018181106112e2576112e16132f1565b5b90506020020160208101906112f791906130e4565b6040518763ffffffff1660e01b815260040161131896959493929190613c00565b602060405180830381600087803b15801561133257600080fd5b505af1158015611346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136a91906135d8565b90505b5b979650505050505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113b4919061308f565b60206040518083038186803b1580156113cc57600080fd5b505afa1580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140491906135d8565b905073123cb0304c7f65b0d48276b9857f4df4733d1dd8331461142657600080fd5b60405163a9059cbb6000528260205281604052602060006060601c6000885af13d15600160005114171661146257637939f4246000526004601cfd5b60006060528060405250505050565b60008034146115c4576127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff163402816114b4576114b3613320565b5b0496507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631a4c1ca3888588886000818110611509576115086132f1565b5b905060200201602081019061151e91906130e4565b89896001818110611532576115316132f1565b5b905060200201602081019061154791906130e4565b8c8c896040518863ffffffff1660e01b815260040161156b96959493929190613c61565b6020604051808303818588803b15801561158457600080fd5b505af1158015611598573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906115bd91906135d8565b9050611790565b6115f8858560008181106115db576115da6132f1565b5b90506020020160208101906115f091906130e4565b33308a6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff1688028161163257611631613320565b5b0496506116888585600081811061164c5761164b6132f1565b5b905060200201602081019061166191906130e4565b7f00000000000000000000000000000000000000000000000000000000000000008961268f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631a4c1ca384878760008181106116d9576116d86132f1565b5b90506020020160208101906116ee91906130e4565b88886001818110611702576117016132f1565b5b905060200201602081019061171791906130e4565b8b8b886040518763ffffffff1660e01b815260040161173b96959493929190613c61565b602060405180830381600087803b15801561175557600080fd5b505af1158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d91906135d8565b90505b9695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600047905073123cb0304c7f65b0d48276b9857f4df4733d1dd8331461180757600080fd5b60008060008084865af13d15600160005114171661182d57637939f4246000526004601cfd5b5050565b6000803414611a7d576127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff1634028161187457611873613320565b5b0497507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0896040518263ffffffff1660e01b81526004016000604051808303818588803b1580156118df57600080fd5b505af11580156118f3573d6000803e3d6000fd5b505050505061191e8660008151811061190f5761190e6132f1565b5b6020026020010151848a61268f565b8273ffffffffffffffffffffffffffffffffffffffff1663a8c9ed676040518061010001604052808960008151811061195a576119596132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200189600181518110611991576119906132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018762ffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018b81526020018a8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611a249190613d82565b602060405180830381600087803b158015611a3e57600080fd5b505af1158015611a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7691906135d8565b9050611ebc565b611aa486600081518110611a9457611a936132f1565b5b602002602001015133308b6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff16890281611ade57611add613320565b5b04975060008073ffffffffffffffffffffffffffffffffffffffff1687600181518110611b0e57611b0d6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16149050611b5587600081518110611b4657611b456132f1565b5b6020026020010151858b61268f565b80611cc5578373ffffffffffffffffffffffffffffffffffffffff1663a8c9ed676040518061010001604052808a600081518110611b9657611b956132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018a60018c51611bc89190613d9e565b81518110611bd957611bd86132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018862ffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018c81526020018b8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611c6c9190613d82565b602060405180830381600087803b158015611c8657600080fd5b505af1158015611c9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbe91906135d8565b9150611eba565b8373ffffffffffffffffffffffffffffffffffffffff1663a8c9ed676040518061010001604052808a600081518110611d0157611d006132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018862ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018c81526020018b8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611dd09190613d82565b602060405180830381600087803b158015611dea57600080fd5b505af1158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2291906135d8565b91507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b8152600401611e7d9190612a13565b600060405180830381600087803b158015611e9757600080fd5b505af1158015611eab573d6000803e3d6000fd5b50505050611eb983836127bf565b5b505b979650505050505050565b6000803414612153576127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff16340281611f0a57611f09613320565b5b0496507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f7557600080fd5b505af1158015611f89573d6000803e3d6000fd5b5050505050611fd485600081518110611fa557611fa46132f1565b5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000008961268f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663414bf389604051806101000160405280886000815181106120305761202f6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200188600181518110612067576120666132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018662ffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018a8152602001898152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b81526004016120fa9190613e74565b602060405180830381600087803b15801561211457600080fd5b505af1158015612128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214c91906135d8565b90506125e6565b61217a8560008151811061216a576121696132f1565b5b602002602001015133308a6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff168802816121b4576121b3613320565b5b0496506121fd856000815181106121ce576121cd6132f1565b5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000008961268f565b60008073ffffffffffffffffffffffffffffffffffffffff168660018151811061222a576122296132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16149050806123cf577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663414bf389604051806101000160405280896000815181106122ac576122ab6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168152602001896001815181106122e3576122e26132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018762ffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018b81526020018a8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b81526004016123769190613e74565b602060405180830381600087803b15801561239057600080fd5b505af11580156123a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c891906135d8565b91506125e4565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663414bf3896040518061010001604052808960008151811061242b5761242a6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018762ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018b81526020018a8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b81526004016124fa9190613e74565b602060405180830381600087803b15801561251457600080fd5b505af1158015612528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254c91906135d8565b91507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b81526004016125a79190612a13565b600060405180830381600087803b1580156125c157600080fd5b505af11580156125d5573d6000803e3d6000fd5b505050506125e383836127bf565b5b505b9695505050505050565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081528460048201528360248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080612688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267f90613eed565b60405180910390fd5b5050505050565b60006040517f095ea7b3000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080612721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271890613f59565b60405180910390fd5b50505050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806127b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b090613fc5565b60405180910390fd5b50505050565b600080600080600085875af190508061280d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280490614031565b60405180910390fd5b505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61283981612826565b811461284457600080fd5b50565b60008135905061285681612830565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126128815761288061285c565b5b8235905067ffffffffffffffff81111561289e5761289d612861565b5b6020830191508360208202830111156128ba576128b9612866565b5b9250929050565b6000819050919050565b6128d4816128c1565b81146128df57600080fd5b50565b6000813590506128f1816128cb565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612922826128f7565b9050919050565b61293281612917565b811461293d57600080fd5b50565b60008135905061294f81612929565b92915050565b600080600080600080600060c0888a0312156129745761297361281c565b5b60006129828a828b01612847565b97505060206129938a828b01612847565b965050604088013567ffffffffffffffff8111156129b4576129b3612821565b5b6129c08a828b0161286b565b955095505060606129d38a828b01612847565b93505060806129e48a828b016128e2565b92505060a06129f58a828b01612940565b91505092959891949750929550565b612a0d81612826565b82525050565b6000602082019050612a286000830184612a04565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a7782612a2e565b810181811067ffffffffffffffff82111715612a9657612a95612a3f565b5b80604052505050565b6000612aa9612812565b9050612ab58282612a6e565b919050565b600067ffffffffffffffff821115612ad557612ad4612a3f565b5b602082029050602081019050919050565b6000612af1826128f7565b9050919050565b612b0181612ae6565b8114612b0c57600080fd5b50565b600081359050612b1e81612af8565b92915050565b6000612b37612b3284612aba565b612a9f565b90508083825260208201905060208402830185811115612b5a57612b59612866565b5b835b81811015612b835780612b6f8882612b0f565b845260208401935050602081019050612b5c565b5050509392505050565b600082601f830112612ba257612ba161285c565b5b8135612bb2848260208601612b24565b91505092915050565b60008060008060008060008060e0898b031215612bdb57612bda61281c565b5b6000612be98b828c01612847565b9850506020612bfa8b828c01612847565b975050604089013567ffffffffffffffff811115612c1b57612c1a612821565b5b612c278b828c01612b8d565b965050606089013567ffffffffffffffff811115612c4857612c47612821565b5b612c548b828c0161286b565b95509550506080612c678b828c01612847565b93505060a0612c788b828c01612847565b92505060c0612c898b828c01612b0f565b9150509295985092959890939650565b6000612ca482612ae6565b9050919050565b612cb481612c99565b8114612cbf57600080fd5b50565b600081359050612cd181612cab565b92915050565b60008060008060008060c08789031215612cf457612cf361281c565b5b6000612d0289828a01612847565b9650506020612d1389828a01612847565b955050604087013567ffffffffffffffff811115612d3457612d33612821565b5b612d4089828a01612b8d565b9450506060612d5189828a01612847565b9350506080612d6289828a01612b0f565b92505060a0612d7389828a01612cc2565b9150509295509295509295565b600080600080600060a08688031215612d9c57612d9b61281c565b5b6000612daa88828901612847565b9550506020612dbb88828901612847565b945050604086013567ffffffffffffffff811115612ddc57612ddb612821565b5b612de888828901612b8d565b9350506060612df988828901612847565b9250506080612e0a88828901612b0f565b9150509295509295909350565b600080fd5b600060608284031215612e3257612e31612e17565b5b612e3c6060612a9f565b90506000612e4c84828501612847565b6000830152506020612e6084828501612847565b6020830152506040612e7484828501612847565b60408301525092915050565b60008115159050919050565b612e9581612e80565b8114612ea057600080fd5b50565b600081359050612eb281612e8c565b92915050565b6000806000806000806000610100888a031215612ed857612ed761281c565b5b6000612ee68a828b01612e1c565b975050606088013567ffffffffffffffff811115612f0757612f06612821565b5b612f138a828b0161286b565b96509650506080612f268a828b01612b0f565b94505060a0612f378a828b01612847565b93505060c0612f488a828b01612b0f565b92505060e0612f598a828b01612ea3565b91505092959891949750929550565b6000612f7382612ae6565b9050919050565b612f8381612f68565b8114612f8e57600080fd5b50565b600081359050612fa081612f7a565b92915050565b60008060408385031215612fbd57612fbc61281c565b5b6000612fcb85828601612f91565b9250506020612fdc85828601612b0f565b9150509250929050565b60008060008060008060a087890312156130035761300261281c565b5b600061301189828a01612847565b965050602061302289828a01612847565b955050604087013567ffffffffffffffff81111561304357613042612821565b5b61304f89828a0161286b565b9450945050606061306289828a01612b0f565b925050608061307389828a01612b0f565b9150509295509295509295565b61308981612ae6565b82525050565b60006020820190506130a46000830184613080565b92915050565b600063ffffffff82169050919050565b6130c3816130aa565b82525050565b60006020820190506130de60008301846130ba565b92915050565b6000602082840312156130fa576130f961281c565b5b600061310884828501612b0f565b91505092915050565b600062ffffff82169050919050565b61312981613111565b811461313457600080fd5b50565b60008135905061314681613120565b92915050565b600061315782612ae6565b9050919050565b6131678161314c565b811461317257600080fd5b50565b6000813590506131848161315e565b92915050565b600080600080600080600060e0888a0312156131a9576131a861281c565b5b60006131b78a828b01612847565b97505060206131c88a828b01612847565b965050604088013567ffffffffffffffff8111156131e9576131e8612821565b5b6131f58a828b01612b8d565b95505060606132068a828b01612847565b94505060806132178a828b01613137565b93505060a06132288a828b01613175565b92505060c06132398a828b01612940565b91505092959891949750929550565b60008060008060008060c087890312156132655761326461281c565b5b600061327389828a01612847565b965050602061328489828a01612847565b955050604087013567ffffffffffffffff8111156132a5576132a4612821565b5b6132b189828a01612b8d565b94505060606132c289828a01612847565b93505060806132d389828a01613137565b92505060a06132e489828a01612940565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b613387816128c1565b82525050565b6002811061339e5761339d61334f565b5b50565b60008190506133af8261338d565b919050565b60006133bf826133a1565b9050919050565b6133cf816133b4565b82525050565b6133de81612ae6565b82525050565b6133ed81612826565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561342d578082015181840152602081019050613412565b8381111561343c576000848401525b50505050565b600061344d826133f3565b61345781856133fe565b935061346781856020860161340f565b61347081612a2e565b840191505092915050565b600060c083016000830151613493600086018261337e565b5060208301516134a660208601826133c6565b5060408301516134b960408601826133d5565b5060608301516134cc60608601826133d5565b5060808301516134df60808601826133e4565b5060a083015184820360a08601526134f78282613442565b9150508091505092915050565b61350d81612e80565b82525050565b61351c81612917565b82525050565b60808201600082015161353860008501826133d5565b50602082015161354b6020850182613504565b50604082015161355e6040850182613513565b5060608201516135716060850182613504565b50505050565b600060e0820190508181036000830152613591818761347b565b90506135a06020830186613522565b6135ad60a0830185612a04565b6135ba60c0830184612a04565b95945050505050565b6000815190506135d281612830565b92915050565b6000602082840312156135ee576135ed61281c565b5b60006135fc848285016135c3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061363f82612826565b915061364a83612826565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561368357613682613605565b5b828202905092915050565b600061369982612826565b91506136a483612826565b9250826136b4576136b3613320565b5b828204905092915050565b600082825260208201905092915050565b6000819050919050565b60006136e683836133d5565b60208301905092915050565b60006137016020840184612b0f565b905092915050565b6000602082019050919050565b600061372283856136bf565b935061372d826136d0565b8060005b858110156137665761374382846136f2565b61374d88826136da565b975061375883613709565b925050600181019050613731565b5085925050509392505050565b61377c81612e80565b82525050565b600060c082019050613797600083018a613080565b6137a46020830189612a04565b81810360408301526137b7818789613716565b90506137c66060830186612a04565b6137d36080830185613773565b6137e060a0830184612a04565b98975050505050505050565b600060e082019050613801600083018b613080565b61380e602083018a612a04565b61381b6040830189612a04565b818103606083015261382e818789613716565b905061383d6080830186612a04565b61384a60a0830185613773565b61385760c0830184612a04565b9998505050505050505050565b60006101008201905061387a600083018c613080565b613887602083018b613080565b613894604083018a612a04565b6138a16060830189612a04565b81810360808301526138b4818789613716565b90506138c360a0830186612a04565b6138d060c0830185613773565b6138dd60e0830184612a04565b9a9950505050505050505050565b600081519050919050565b6000819050602082019050919050565b6000602082019050919050565b600061391e826138eb565b61392881856136bf565b9350613933836138f6565b8060005b8381101561396457815161394b88826136da565b975061395683613906565b925050600181019050613937565b5085935050505092915050565b60006080820190506139866000830187612a04565b81810360208301526139988186613913565b90506139a76040830185613080565b6139b46060830184612a04565b95945050505050565b600067ffffffffffffffff8211156139d8576139d7612a3f565b5b602082029050602081019050919050565b60006139fc6139f7846139bd565b612a9f565b90508083825260208201905060208402830185811115613a1f57613a1e612866565b5b835b81811015613a485780613a3488826135c3565b845260208401935050602081019050613a21565b5050509392505050565b600082601f830112613a6757613a6661285c565b5b8151613a778482602086016139e9565b91505092915050565b600060208284031215613a9657613a9561281c565b5b600082015167ffffffffffffffff811115613ab457613ab3612821565b5b613ac084828501613a52565b91505092915050565b600060a082019050613ade6000830188612a04565b613aeb6020830187612a04565b8181036040830152613afd8186613913565b9050613b0c6060830185613080565b613b196080830184612a04565b9695505050505050565b600060c082019050613b386000830189613080565b613b456020830188613080565b613b526040830187612a04565b613b5f6060830186612a04565b613b6c6080830185612a04565b613b7960a0830184613080565b979650505050505050565b6000606082019050613b996000830186612a04565b613ba66020830185612a04565b613bb36040830184613080565b949350505050565b6000608082019050613bd06000830187612a04565b613bdd6020830186612a04565b613bea6040830185612a04565b613bf76060830184613080565b95945050505050565b600060c082019050613c156000830189612a04565b613c226020830188612a04565b613c2f6040830187612a04565b613c3c6060830186612a04565b613c496080830185613080565b613c5660a0830184613080565b979650505050505050565b600060c082019050613c766000830189613080565b613c836020830188613080565b613c906040830187613080565b613c9d6060830186612a04565b613caa6080830185612a04565b613cb760a0830184613080565b979650505050505050565b613ccb81613111565b82525050565b613cda816128f7565b82525050565b61010082016000820151613cf760008501826133d5565b506020820151613d0a60208501826133d5565b506040820151613d1d6040850182613cc2565b506060820151613d3060608501826133d5565b506080820151613d4360808501826133e4565b5060a0820151613d5660a08501826133e4565b5060c0820151613d6960c08501826133e4565b5060e0820151613d7c60e0850182613cd1565b50505050565b600061010082019050613d986000830184613ce0565b92915050565b6000613da982612826565b9150613db483612826565b925082821015613dc757613dc6613605565b5b828203905092915050565b61010082016000820151613de960008501826133d5565b506020820151613dfc60208501826133d5565b506040820151613e0f6040850182613cc2565b506060820151613e2260608501826133d5565b506080820151613e3560808501826133e4565b5060a0820151613e4860a08501826133e4565b5060c0820151613e5b60c08501826133e4565b5060e0820151613e6e60e0850182613cd1565b50505050565b600061010082019050613e8a6000830184613dd2565b92915050565b600082825260208201905092915050565b7f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000600082015250565b6000613ed7601483613e90565b9150613ee282613ea1565b602082019050919050565b60006020820190508181036000830152613f0681613eca565b9050919050565b7f415050524f56455f4641494c4544000000000000000000000000000000000000600082015250565b6000613f43600e83613e90565b9150613f4e82613f0d565b602082019050919050565b60006020820190508181036000830152613f7281613f36565b9050919050565b7f5452414e534645525f4641494c45440000000000000000000000000000000000600082015250565b6000613faf600f83613e90565b9150613fba82613f79565b602082019050919050565b60006020820190508181036000830152613fde81613fa2565b9050919050565b7f4554485f5452414e534645525f4641494c454400000000000000000000000000600082015250565b600061401b601383613e90565b915061402682613fe5565b602082019050919050565b6000602082019050818103600083015261404a8161400e565b905091905056fea264697066735822122049188845bc30825a516c453a51ee4fdcd0f16dbfb14e1620c9fdb1477d8948f864736f6c63430008090033000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c800000000000000000000000081c46feca27b31f3adc2b91ee4be9717d1cd3dd7000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb000000000000000000000000a356867fdcea8e71aeaf87805808803806231fdc000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe5149000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000270eDeployed Bytecode
0x6080604052600436106100ab5760003560e01c8063a354a50211610064578063a354a502146101cd578063a9bf959d146101fd578063c5b37c2214610228578063dc42688114610253578063ee6c571a1461027c578063f5bf2a32146102ac576100b2565b806327b4fbac146100b45780632d75fbc4146100e45780634271a6d11461011457806345534b9d146101445780636ccf08f2146101745780639cfddc36146101a4576100b2565b366100b257005b005b6100ce60048036038101906100c99190612955565b6102dc565b6040516100db9190612a13565b60405180910390f35b6100fe60048036038101906100f99190612bbb565b6105a2565b60405161010b9190612a13565b60405180910390f35b61012e60048036038101906101299190612cd7565b6109f7565b60405161013b9190612a13565b60405180910390f35b61015e60048036038101906101599190612d80565b610d8c565b60405161016b9190612a13565b60405180910390f35b61018e60048036038101906101899190612eb8565b611066565b60405161019b9190612a13565b60405180910390f35b3480156101b057600080fd5b506101cb60048036038101906101c69190612fa6565b611379565b005b6101e760048036038101906101e29190612fe6565b611471565b6040516101f49190612a13565b60405180910390f35b34801561020957600080fd5b5061021261179a565b60405161021f919061308f565b60405180910390f35b34801561023457600080fd5b5061023d6117be565b60405161024a91906130c9565b60405180910390f35b34801561025f57600080fd5b5061027a600480360381019061027591906130e4565b6117e2565b005b6102966004803603810190610291919061318a565b611831565b6040516102a39190612a13565b60405180910390f35b6102c660048036038101906102c19190613248565b611ec7565b6040516102d39190612a13565b60405180910390f35b6000610312868660008181106102f5576102f46132f1565b5b905060200201602081019061030a91906130e4565b33308b6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff1689028161034c5761034b613320565b5b0497506103a286866000818110610366576103656132f1565b5b905060200201602081019061037b91906130e4565b7f000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c88a61268f565b7f000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c873ffffffffffffffffffffffffffffffffffffffff166352bbbe296040518060c00160405280868152602001600060018111156104035761040261334f565b5b81526020018989600081811061041c5761041b6132f1565b5b905060200201602081019061043191906130e4565b73ffffffffffffffffffffffffffffffffffffffff168152602001898960018181106104605761045f6132f1565b5b905060200201602081019061047591906130e4565b73ffffffffffffffffffffffffffffffffffffffff1681526020018b81526020016040518060400160405280600281526020017f307800000000000000000000000000000000000000000000000000000000000081525081525060405180608001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600015158152508a886040518563ffffffff1660e01b81526004016105439493929190613577565b602060405180830381600087803b15801561055d57600080fd5b505af1158015610571573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059591906135d8565b9050979650505050505050565b60008034146106ea577f000000000000000000000000a356867fdcea8e71aeaf87805808803806231fdc73ffffffffffffffffffffffffffffffffffffffff16635028bb956127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff163461061c9190613634565b610626919061368e565b8960018151811061063a576106396132f1565b5b60200260200101518b8a8a8960008c6040518963ffffffff1660e01b815260040161066b9796959493929190613782565b6020604051808303818588803b15801561068457600080fd5b505af1158015610698573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906106bd91906135d8565b90506106e5876001815181106106d6576106d56132f1565b5b60200260200101518383612727565b6109eb565b60008073ffffffffffffffffffffffffffffffffffffffff1688600181518110610717576107166132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614905061075f8860008151811061074f5761074e6132f1565b5b602002602001015133308d6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff168b028161079957610798613320565b5b0499506107e2886000815181106107b3576107b26132f1565b5b60200260200101517f000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe51498c61268f565b80156108ce577f000000000000000000000000a356867fdcea8e71aeaf87805808803806231fdc73ffffffffffffffffffffffffffffffffffffffff16631e6d24c289600081518110610838576108376132f1565b5b60200260200101518c8c8b8b8a60008d6040518963ffffffff1660e01b815260040161086b9897969594939291906137ec565b602060405180830381600087803b15801561088557600080fd5b505af1158015610899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bd91906135d8565b91506108c983836127bf565b6109e9565b7f000000000000000000000000a356867fdcea8e71aeaf87805808803806231fdc73ffffffffffffffffffffffffffffffffffffffff1663f87dc1b78960008151811061091e5761091d6132f1565b5b60200260200101518a60018151811061093a576109396132f1565b5b60200260200101518d8d8c8c8b60008e6040518a63ffffffff1660e01b815260040161096e99989796959493929190613864565b602060405180830381600087803b15801561098857600080fd5b505af115801561099c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c091906135d8565b91506109e8886001815181106109d9576109d86132f1565b5b60200260200101518484612727565b5b505b98975050505050505050565b6000606060003414610adb578273ffffffffffffffffffffffffffffffffffffffff16637ff36ab56127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff16340281610a5957610a58613320565b5b048989888a6040518663ffffffff1660e01b8152600401610a7d9493929190613971565b6000604051808303818588803b158015610a9657600080fd5b505af1158015610aaa573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f82011682018060405250810190610ad49190613a80565b9050610d63565b60008073ffffffffffffffffffffffffffffffffffffffff1687600181518110610b0857610b076132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16149050610b5087600081518110610b4057610b3f6132f1565b5b602002602001015133308c6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff168a0281610b8a57610b89613320565b5b049850610bb387600081518110610ba457610ba36132f1565b5b6020026020010151858b61268f565b80610c57578373ffffffffffffffffffffffffffffffffffffffff166338ed17398a8a8a898b6040518663ffffffff1660e01b8152600401610bf9959493929190613ac9565b600060405180830381600087803b158015610c1357600080fd5b505af1158015610c27573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c509190613a80565b9150610d61565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc287600181518110610c8c57610c8b6132f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508373ffffffffffffffffffffffffffffffffffffffff166318cbafe58a8a8a898b6040518663ffffffff1660e01b8152600401610d07959493929190613ac9565b600060405180830381600087803b158015610d2157600080fd5b505af1158015610d35573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d5e9190613a80565b91505b505b80600181518110610d7757610d766132f1565b5b60200260200101519150509695505050505050565b6000803414610ec5576127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff16340281610dcf57610dce613320565b5b0495507f000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb73ffffffffffffffffffffffffffffffffffffffff1663d3a4acd38786600081518110610e2357610e226132f1565b5b602002602001015187600181518110610e3f57610e3e6132f1565b5b60200260200101518a8a89896040518863ffffffff1660e01b8152600401610e6c96959493929190613b23565b6020604051808303818588803b158015610e8557600080fd5b505af1158015610e99573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ebe91906135d8565b905061105d565b610eec84600081518110610edc57610edb6132f1565b5b60200260200101513330896125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff16870281610f2657610f25613320565b5b049550610f6f84600081518110610f4057610f3f6132f1565b5b60200260200101517f000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb8861268f565b7f000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb73ffffffffffffffffffffffffffffffffffffffff1663d3a4acd385600081518110610fbf57610fbe6132f1565b5b602002602001015186600181518110610fdb57610fda6132f1565b5b6020026020010151898988886040518763ffffffff1660e01b815260040161100896959493929190613b23565b602060405180830381600087803b15801561102257600080fd5b505af1158015611036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105a91906135d8565b90505b95945050505050565b6000803414611144578473ffffffffffffffffffffffffffffffffffffffff1663ad65d76d6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff163402816110c5576110c4613320565b5b048a6020015187876040518563ffffffff1660e01b81526004016110eb93929190613b84565b6020604051808303818588803b15801561110457600080fd5b505af1158015611118573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061113d91906135d8565b905061136e565b61117c8787600081811061115b5761115a6132f1565b5b905060200201602081019061117091906130e4565b33308b600001516125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff16896000015102816111ba576111b9613320565b5b048860000181815250506111fb878760008181106111db576111da6132f1565b5b90506020020160208101906111f091906130e4565b868a6000015161268f565b81156112a1578473ffffffffffffffffffffffffffffffffffffffff16637237e03189600001518a6020015187876040518563ffffffff1660e01b81526004016112489493929190613bbb565b602060405180830381600087803b15801561126257600080fd5b505af1158015611276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129a91906135d8565b905061136d565b8473ffffffffffffffffffffffffffffffffffffffff1663f552d91b89600001518a602001518b6040015188888d8d60018181106112e2576112e16132f1565b5b90506020020160208101906112f791906130e4565b6040518763ffffffff1660e01b815260040161131896959493929190613c00565b602060405180830381600087803b15801561133257600080fd5b505af1158015611346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136a91906135d8565b90505b5b979650505050505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113b4919061308f565b60206040518083038186803b1580156113cc57600080fd5b505afa1580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140491906135d8565b905073123cb0304c7f65b0d48276b9857f4df4733d1dd8331461142657600080fd5b60405163a9059cbb6000528260205281604052602060006060601c6000885af13d15600160005114171661146257637939f4246000526004601cfd5b60006060528060405250505050565b60008034146115c4576127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff163402816114b4576114b3613320565b5b0496507f00000000000000000000000081c46feca27b31f3adc2b91ee4be9717d1cd3dd773ffffffffffffffffffffffffffffffffffffffff16631a4c1ca3888588886000818110611509576115086132f1565b5b905060200201602081019061151e91906130e4565b89896001818110611532576115316132f1565b5b905060200201602081019061154791906130e4565b8c8c896040518863ffffffff1660e01b815260040161156b96959493929190613c61565b6020604051808303818588803b15801561158457600080fd5b505af1158015611598573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906115bd91906135d8565b9050611790565b6115f8858560008181106115db576115da6132f1565b5b90506020020160208101906115f091906130e4565b33308a6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff1688028161163257611631613320565b5b0496506116888585600081811061164c5761164b6132f1565b5b905060200201602081019061166191906130e4565b7f00000000000000000000000081c46feca27b31f3adc2b91ee4be9717d1cd3dd78961268f565b7f00000000000000000000000081c46feca27b31f3adc2b91ee4be9717d1cd3dd773ffffffffffffffffffffffffffffffffffffffff16631a4c1ca384878760008181106116d9576116d86132f1565b5b90506020020160208101906116ee91906130e4565b88886001818110611702576117016132f1565b5b905060200201602081019061171791906130e4565b8b8b886040518763ffffffff1660e01b815260040161173b96959493929190613c61565b602060405180830381600087803b15801561175557600080fd5b505af1158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d91906135d8565b90505b9695505050505050565b7f000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe514981565b7f000000000000000000000000000000000000000000000000000000000000270e81565b600047905073123cb0304c7f65b0d48276b9857f4df4733d1dd8331461180757600080fd5b60008060008084865af13d15600160005114171661182d57637939f4246000526004601cfd5b5050565b6000803414611a7d576127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff1634028161187457611873613320565b5b0497507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0896040518263ffffffff1660e01b81526004016000604051808303818588803b1580156118df57600080fd5b505af11580156118f3573d6000803e3d6000fd5b505050505061191e8660008151811061190f5761190e6132f1565b5b6020026020010151848a61268f565b8273ffffffffffffffffffffffffffffffffffffffff1663a8c9ed676040518061010001604052808960008151811061195a576119596132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200189600181518110611991576119906132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018762ffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018b81526020018a8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611a249190613d82565b602060405180830381600087803b158015611a3e57600080fd5b505af1158015611a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7691906135d8565b9050611ebc565b611aa486600081518110611a9457611a936132f1565b5b602002602001015133308b6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff16890281611ade57611add613320565b5b04975060008073ffffffffffffffffffffffffffffffffffffffff1687600181518110611b0e57611b0d6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16149050611b5587600081518110611b4657611b456132f1565b5b6020026020010151858b61268f565b80611cc5578373ffffffffffffffffffffffffffffffffffffffff1663a8c9ed676040518061010001604052808a600081518110611b9657611b956132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018a60018c51611bc89190613d9e565b81518110611bd957611bd86132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018862ffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018c81526020018b8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611c6c9190613d82565b602060405180830381600087803b158015611c8657600080fd5b505af1158015611c9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbe91906135d8565b9150611eba565b8373ffffffffffffffffffffffffffffffffffffffff1663a8c9ed676040518061010001604052808a600081518110611d0157611d006132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1681526020018862ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018c81526020018b8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611dd09190613d82565b602060405180830381600087803b158015611dea57600080fd5b505af1158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2291906135d8565b91507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b8152600401611e7d9190612a13565b600060405180830381600087803b158015611e9757600080fd5b505af1158015611eab573d6000803e3d6000fd5b50505050611eb983836127bf565b5b505b979650505050505050565b6000803414612153576127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff16340281611f0a57611f09613320565b5b0496507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f7557600080fd5b505af1158015611f89573d6000803e3d6000fd5b5050505050611fd485600081518110611fa557611fa46132f1565b5b60200260200101517f000000000000000000000000e592427a0aece92de3edee1f18e0157c058615648961268f565b7f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663414bf389604051806101000160405280886000815181106120305761202f6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200188600181518110612067576120666132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018662ffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018a8152602001898152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b81526004016120fa9190613e74565b602060405180830381600087803b15801561211457600080fd5b505af1158015612128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214c91906135d8565b90506125e6565b61217a8560008151811061216a576121696132f1565b5b602002602001015133308a6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff168802816121b4576121b3613320565b5b0496506121fd856000815181106121ce576121cd6132f1565b5b60200260200101517f000000000000000000000000e592427a0aece92de3edee1f18e0157c058615648961268f565b60008073ffffffffffffffffffffffffffffffffffffffff168660018151811061222a576122296132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16149050806123cf577f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663414bf389604051806101000160405280896000815181106122ac576122ab6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168152602001896001815181106122e3576122e26132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018762ffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018b81526020018a8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b81526004016123769190613e74565b602060405180830381600087803b15801561239057600080fd5b505af11580156123a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c891906135d8565b91506125e4565b7f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663414bf3896040518061010001604052808960008151811061242b5761242a6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1681526020018762ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018b81526020018a8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b81526004016124fa9190613e74565b602060405180830381600087803b15801561251457600080fd5b505af1158015612528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254c91906135d8565b91507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b81526004016125a79190612a13565b600060405180830381600087803b1580156125c157600080fd5b505af11580156125d5573d6000803e3d6000fd5b505050506125e383836127bf565b5b505b9695505050505050565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081528460048201528360248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080612688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267f90613eed565b60405180910390fd5b5050505050565b60006040517f095ea7b3000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080612721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271890613f59565b60405180910390fd5b50505050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806127b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b090613fc5565b60405180910390fd5b50505050565b600080600080600085875af190508061280d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280490614031565b60405180910390fd5b505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61283981612826565b811461284457600080fd5b50565b60008135905061285681612830565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126128815761288061285c565b5b8235905067ffffffffffffffff81111561289e5761289d612861565b5b6020830191508360208202830111156128ba576128b9612866565b5b9250929050565b6000819050919050565b6128d4816128c1565b81146128df57600080fd5b50565b6000813590506128f1816128cb565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612922826128f7565b9050919050565b61293281612917565b811461293d57600080fd5b50565b60008135905061294f81612929565b92915050565b600080600080600080600060c0888a0312156129745761297361281c565b5b60006129828a828b01612847565b97505060206129938a828b01612847565b965050604088013567ffffffffffffffff8111156129b4576129b3612821565b5b6129c08a828b0161286b565b955095505060606129d38a828b01612847565b93505060806129e48a828b016128e2565b92505060a06129f58a828b01612940565b91505092959891949750929550565b612a0d81612826565b82525050565b6000602082019050612a286000830184612a04565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a7782612a2e565b810181811067ffffffffffffffff82111715612a9657612a95612a3f565b5b80604052505050565b6000612aa9612812565b9050612ab58282612a6e565b919050565b600067ffffffffffffffff821115612ad557612ad4612a3f565b5b602082029050602081019050919050565b6000612af1826128f7565b9050919050565b612b0181612ae6565b8114612b0c57600080fd5b50565b600081359050612b1e81612af8565b92915050565b6000612b37612b3284612aba565b612a9f565b90508083825260208201905060208402830185811115612b5a57612b59612866565b5b835b81811015612b835780612b6f8882612b0f565b845260208401935050602081019050612b5c565b5050509392505050565b600082601f830112612ba257612ba161285c565b5b8135612bb2848260208601612b24565b91505092915050565b60008060008060008060008060e0898b031215612bdb57612bda61281c565b5b6000612be98b828c01612847565b9850506020612bfa8b828c01612847565b975050604089013567ffffffffffffffff811115612c1b57612c1a612821565b5b612c278b828c01612b8d565b965050606089013567ffffffffffffffff811115612c4857612c47612821565b5b612c548b828c0161286b565b95509550506080612c678b828c01612847565b93505060a0612c788b828c01612847565b92505060c0612c898b828c01612b0f565b9150509295985092959890939650565b6000612ca482612ae6565b9050919050565b612cb481612c99565b8114612cbf57600080fd5b50565b600081359050612cd181612cab565b92915050565b60008060008060008060c08789031215612cf457612cf361281c565b5b6000612d0289828a01612847565b9650506020612d1389828a01612847565b955050604087013567ffffffffffffffff811115612d3457612d33612821565b5b612d4089828a01612b8d565b9450506060612d5189828a01612847565b9350506080612d6289828a01612b0f565b92505060a0612d7389828a01612cc2565b9150509295509295509295565b600080600080600060a08688031215612d9c57612d9b61281c565b5b6000612daa88828901612847565b9550506020612dbb88828901612847565b945050604086013567ffffffffffffffff811115612ddc57612ddb612821565b5b612de888828901612b8d565b9350506060612df988828901612847565b9250506080612e0a88828901612b0f565b9150509295509295909350565b600080fd5b600060608284031215612e3257612e31612e17565b5b612e3c6060612a9f565b90506000612e4c84828501612847565b6000830152506020612e6084828501612847565b6020830152506040612e7484828501612847565b60408301525092915050565b60008115159050919050565b612e9581612e80565b8114612ea057600080fd5b50565b600081359050612eb281612e8c565b92915050565b6000806000806000806000610100888a031215612ed857612ed761281c565b5b6000612ee68a828b01612e1c565b975050606088013567ffffffffffffffff811115612f0757612f06612821565b5b612f138a828b0161286b565b96509650506080612f268a828b01612b0f565b94505060a0612f378a828b01612847565b93505060c0612f488a828b01612b0f565b92505060e0612f598a828b01612ea3565b91505092959891949750929550565b6000612f7382612ae6565b9050919050565b612f8381612f68565b8114612f8e57600080fd5b50565b600081359050612fa081612f7a565b92915050565b60008060408385031215612fbd57612fbc61281c565b5b6000612fcb85828601612f91565b9250506020612fdc85828601612b0f565b9150509250929050565b60008060008060008060a087890312156130035761300261281c565b5b600061301189828a01612847565b965050602061302289828a01612847565b955050604087013567ffffffffffffffff81111561304357613042612821565b5b61304f89828a0161286b565b9450945050606061306289828a01612b0f565b925050608061307389828a01612b0f565b9150509295509295509295565b61308981612ae6565b82525050565b60006020820190506130a46000830184613080565b92915050565b600063ffffffff82169050919050565b6130c3816130aa565b82525050565b60006020820190506130de60008301846130ba565b92915050565b6000602082840312156130fa576130f961281c565b5b600061310884828501612b0f565b91505092915050565b600062ffffff82169050919050565b61312981613111565b811461313457600080fd5b50565b60008135905061314681613120565b92915050565b600061315782612ae6565b9050919050565b6131678161314c565b811461317257600080fd5b50565b6000813590506131848161315e565b92915050565b600080600080600080600060e0888a0312156131a9576131a861281c565b5b60006131b78a828b01612847565b97505060206131c88a828b01612847565b965050604088013567ffffffffffffffff8111156131e9576131e8612821565b5b6131f58a828b01612b8d565b95505060606132068a828b01612847565b94505060806132178a828b01613137565b93505060a06132288a828b01613175565b92505060c06132398a828b01612940565b91505092959891949750929550565b60008060008060008060c087890312156132655761326461281c565b5b600061327389828a01612847565b965050602061328489828a01612847565b955050604087013567ffffffffffffffff8111156132a5576132a4612821565b5b6132b189828a01612b8d565b94505060606132c289828a01612847565b93505060806132d389828a01613137565b92505060a06132e489828a01612940565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b613387816128c1565b82525050565b6002811061339e5761339d61334f565b5b50565b60008190506133af8261338d565b919050565b60006133bf826133a1565b9050919050565b6133cf816133b4565b82525050565b6133de81612ae6565b82525050565b6133ed81612826565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561342d578082015181840152602081019050613412565b8381111561343c576000848401525b50505050565b600061344d826133f3565b61345781856133fe565b935061346781856020860161340f565b61347081612a2e565b840191505092915050565b600060c083016000830151613493600086018261337e565b5060208301516134a660208601826133c6565b5060408301516134b960408601826133d5565b5060608301516134cc60608601826133d5565b5060808301516134df60808601826133e4565b5060a083015184820360a08601526134f78282613442565b9150508091505092915050565b61350d81612e80565b82525050565b61351c81612917565b82525050565b60808201600082015161353860008501826133d5565b50602082015161354b6020850182613504565b50604082015161355e6040850182613513565b5060608201516135716060850182613504565b50505050565b600060e0820190508181036000830152613591818761347b565b90506135a06020830186613522565b6135ad60a0830185612a04565b6135ba60c0830184612a04565b95945050505050565b6000815190506135d281612830565b92915050565b6000602082840312156135ee576135ed61281c565b5b60006135fc848285016135c3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061363f82612826565b915061364a83612826565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561368357613682613605565b5b828202905092915050565b600061369982612826565b91506136a483612826565b9250826136b4576136b3613320565b5b828204905092915050565b600082825260208201905092915050565b6000819050919050565b60006136e683836133d5565b60208301905092915050565b60006137016020840184612b0f565b905092915050565b6000602082019050919050565b600061372283856136bf565b935061372d826136d0565b8060005b858110156137665761374382846136f2565b61374d88826136da565b975061375883613709565b925050600181019050613731565b5085925050509392505050565b61377c81612e80565b82525050565b600060c082019050613797600083018a613080565b6137a46020830189612a04565b81810360408301526137b7818789613716565b90506137c66060830186612a04565b6137d36080830185613773565b6137e060a0830184612a04565b98975050505050505050565b600060e082019050613801600083018b613080565b61380e602083018a612a04565b61381b6040830189612a04565b818103606083015261382e818789613716565b905061383d6080830186612a04565b61384a60a0830185613773565b61385760c0830184612a04565b9998505050505050505050565b60006101008201905061387a600083018c613080565b613887602083018b613080565b613894604083018a612a04565b6138a16060830189612a04565b81810360808301526138b4818789613716565b90506138c360a0830186612a04565b6138d060c0830185613773565b6138dd60e0830184612a04565b9a9950505050505050505050565b600081519050919050565b6000819050602082019050919050565b6000602082019050919050565b600061391e826138eb565b61392881856136bf565b9350613933836138f6565b8060005b8381101561396457815161394b88826136da565b975061395683613906565b925050600181019050613937565b5085935050505092915050565b60006080820190506139866000830187612a04565b81810360208301526139988186613913565b90506139a76040830185613080565b6139b46060830184612a04565b95945050505050565b600067ffffffffffffffff8211156139d8576139d7612a3f565b5b602082029050602081019050919050565b60006139fc6139f7846139bd565b612a9f565b90508083825260208201905060208402830185811115613a1f57613a1e612866565b5b835b81811015613a485780613a3488826135c3565b845260208401935050602081019050613a21565b5050509392505050565b600082601f830112613a6757613a6661285c565b5b8151613a778482602086016139e9565b91505092915050565b600060208284031215613a9657613a9561281c565b5b600082015167ffffffffffffffff811115613ab457613ab3612821565b5b613ac084828501613a52565b91505092915050565b600060a082019050613ade6000830188612a04565b613aeb6020830187612a04565b8181036040830152613afd8186613913565b9050613b0c6060830185613080565b613b196080830184612a04565b9695505050505050565b600060c082019050613b386000830189613080565b613b456020830188613080565b613b526040830187612a04565b613b5f6060830186612a04565b613b6c6080830185612a04565b613b7960a0830184613080565b979650505050505050565b6000606082019050613b996000830186612a04565b613ba66020830185612a04565b613bb36040830184613080565b949350505050565b6000608082019050613bd06000830187612a04565b613bdd6020830186612a04565b613bea6040830185612a04565b613bf76060830184613080565b95945050505050565b600060c082019050613c156000830189612a04565b613c226020830188612a04565b613c2f6040830187612a04565b613c3c6060830186612a04565b613c496080830185613080565b613c5660a0830184613080565b979650505050505050565b600060c082019050613c766000830189613080565b613c836020830188613080565b613c906040830187613080565b613c9d6060830186612a04565b613caa6080830185612a04565b613cb760a0830184613080565b979650505050505050565b613ccb81613111565b82525050565b613cda816128f7565b82525050565b61010082016000820151613cf760008501826133d5565b506020820151613d0a60208501826133d5565b506040820151613d1d6040850182613cc2565b506060820151613d3060608501826133d5565b506080820151613d4360808501826133e4565b5060a0820151613d5660a08501826133e4565b5060c0820151613d6960c08501826133e4565b5060e0820151613d7c60e0850182613cd1565b50505050565b600061010082019050613d986000830184613ce0565b92915050565b6000613da982612826565b9150613db483612826565b925082821015613dc757613dc6613605565b5b828203905092915050565b61010082016000820151613de960008501826133d5565b506020820151613dfc60208501826133d5565b506040820151613e0f6040850182613cc2565b506060820151613e2260608501826133d5565b506080820151613e3560808501826133e4565b5060a0820151613e4860a08501826133e4565b5060c0820151613e5b60c08501826133e4565b5060e0820151613e6e60e0850182613cd1565b50505050565b600061010082019050613e8a6000830184613dd2565b92915050565b600082825260208201905092915050565b7f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000600082015250565b6000613ed7601483613e90565b9150613ee282613ea1565b602082019050919050565b60006020820190508181036000830152613f0681613eca565b9050919050565b7f415050524f56455f4641494c4544000000000000000000000000000000000000600082015250565b6000613f43600e83613e90565b9150613f4e82613f0d565b602082019050919050565b60006020820190508181036000830152613f7281613f36565b9050919050565b7f5452414e534645525f4641494c45440000000000000000000000000000000000600082015250565b6000613faf600f83613e90565b9150613fba82613f79565b602082019050919050565b60006020820190508181036000830152613fde81613fa2565b9050919050565b7f4554485f5452414e534645525f4641494c454400000000000000000000000000600082015250565b600061401b601383613e90565b915061402682613fe5565b602082019050919050565b6000602082019050818103600083015261404a8161400e565b905091905056fea264697066735822122049188845bc30825a516c453a51ee4fdcd0f16dbfb14e1620c9fdb1477d8948f864736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c800000000000000000000000081c46feca27b31f3adc2b91ee4be9717d1cd3dd7000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb000000000000000000000000a356867fdcea8e71aeaf87805808803806231fdc000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe5149000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000270e
-----Decoded View---------------
Arg [0] : _uniswapV3Router (address): 0xE592427A0AEce92De3Edee1F18E0157C05861564
Arg [1] : _balancer (address): 0xBA12222222228d8Ba445958a75a0704d566BF2C8
Arg [2] : _curveTC1Router (address): 0x81C46fECa27B31F3ADC2b91eE4be9717d1cd3DD7
Arg [3] : _bancorRouter (address): 0xeEF417e1D5CC832e619ae18D2F140De2999dD4fB
Arg [4] : _DodoRouter (address): 0xa356867fDCEa8e71AEaF87805808803806231FdC
Arg [5] : _dodoApproveProxy (address): 0xCB859eA579b28e02B87A1FDE08d087ab9dbE5149
Arg [6] : _WETHAddress (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [7] : fee (uint32): 9998
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564
Arg [1] : 000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c8
Arg [2] : 00000000000000000000000081c46feca27b31f3adc2b91ee4be9717d1cd3dd7
Arg [3] : 000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb
Arg [4] : 000000000000000000000000a356867fdcea8e71aeaf87805808803806231fdc
Arg [5] : 000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe5149
Arg [6] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [7] : 000000000000000000000000000000000000000000000000000000000000270eLoading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingMultichain Portfolio | 30 Chains
Chain Token Portfolio % Price Amount Value ETH 70.71% $101,594 0.00116667 $118.53 ETH 11.26% $3,669.7 0.00514356 $18.88 ETH 8.00% $0.138399 96.9314 $13.42 ETH 5.30% $0.999514 8.8943 $8.89 ETH 1.92% $23.56 0.1364 $3.21 ETH 1.19% $0.000024 82,731.7359 $2 ETH 0.39% $14.96 0.0433 $0.648 ETH Ether (ETH)0.35% $3,669.7 0.00016186 $0.593977 ETH 0.29% $0.522636 0.9288 $0.4854 ETH 0.18% $336.89 0.00089222 $0.3005 ETH 0.12% $3.07 0.0676 $0.2075 ETH 0.11% $0.246822 0.7434 $0.1834 ETH 0.10% $0.568811 0.2842 $0.1616 ETH 0.07% $2.02 0.0562 $0.1136 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.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addressesPrivate Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.Compiler specific version warnings:
The compiled contract might be susceptible to VerbatimInvalidDeduplication (low-severity), FullInlinerNonExpressionSplitArgumentEvaluationOrder (low-severity), MissingSideEffectsOnSelectorAccess (low-severity), AbiReencodingHeadOverflowWithStaticArrayCleanup (medium-severity), DirtyBytesArrayToStorage (low-severity), DataLocationChangeInInternalOverride (very low-severity), NestedCalldataArrayAbiReencodingSizeValidation (very low-severity) Solidity Compiler Bugs.
Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.SignIn
Address Cards
To use this feature, please login to your Etherscan account and return to this page.Before You Copy
Transaction Private Note
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.