Contract 0x7a250c60cde7a5ca7b667209beab5ea4e16eed67 1

 

Contract Overview

Balance:
1 wei

MATIC Value:
Less Than $0.01 (@ $0.83/MATIC)

Token:
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x85bdc92a20154fc375d1e5d1083718356a4d88a60b8d6e7992b7f1ad05706e29Burn Liquidity435861012023-06-06 6:10:232 hrs 24 mins ago0xa4c68df8e1baa13675b5ac6f451b489f509c3a39 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.026320473049 150.589434039
0x3735711dbbe41fbcc2fb4cbee0705c05a6a162f914cbdecbfcac06829ba019b0Multicall435821762023-06-06 3:42:494 hrs 52 mins ago0x57af8c49be6f4c0431a0d9d2d98a3a00587a9989 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.0284002367144.1
0xcaf82e3dd53bc19c7824cdc22db8b12d40f0393e561454ab24539d0e768c5b81Multicall435737122023-06-05 22:35:0010 hrs ago0xd8d9323157d74f34c7d3c4891e117c24f339e2d4 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.030796289264 146.095226023
0xc84d2a623a105195a3dade0d0e35913ec66770da744d64490e26adde644aeb4fMulticall435715992023-06-05 21:17:4211 hrs 17 mins ago0x73a7984c3379aeedf004bc21bf2d614a2584b48f IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.031927918176 151.463586484
0x433986279e912e23df535a37b8651673f862d17d2f4bdb3156c8b33511ea669dBurn Liquidity435645122023-06-05 16:49:3615 hrs 45 mins ago0xfb942238c0805410b7580677b71b5d326b1af269 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.028846984871 156.468406736
0xe9d62b13d647ebe8998d0d2ad74dd7d189897bc72b283fe98b42cb67b1b016efMulticall435641572023-06-05 16:36:5915 hrs 58 mins ago0x4da854cf427f33ecf208da22572d2a1eae9458db IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.049448873739 235.284840265
0xc2fb137457234c583dbd55cf94a8e4e6fd9f7cfcb9b6edf3ff6c54ed04a67200Burn Liquidity435641532023-06-05 16:36:5115 hrs 58 mins ago0x1f45d3322f24d22100e48288455326f7a5801805 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.046813628067 238.160936025
0x798f854ab4e2c410c70960e73eb7121594b33a0fde61fb79e5aaa29ee90d16d7Multicall435641002023-06-05 16:34:5916 hrs ago0xca993100a7feb14765259b9098d3803ae5ae2181 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670.1 MATIC0.064192367064 266.698105323
0xc35397f93f12b43202c71310459e307d9e6567c01a5b034720c84da8ebc977e0Multicall435621012023-06-05 15:24:0517 hrs 11 mins ago0x8ff35b50f669c4d088dd6ce001e39bf6006402b9 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.038379138251 182.084953939
0x80a380baed923f939834a3215db0561d28f2923f4048381598e4b3a6748c5919Multicall435591162023-06-05 13:37:4618 hrs 57 mins ago0xc03277e2a72de02212ec652c122b2ea9e573b269 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.035850772815 170.096707813
0xe0ff15b517f16214644b65df6f8513939f8fbb9c8998c0308a75cba534397bc9Burn Liquidity435584792023-06-05 13:15:0419 hrs 20 mins ago0x9bc7f7aa4b4395391089da8588ffb0842b5483a6 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.030930219177
0x45d14f5f4867c971b24201f9450fa13b8dc00df705554e9b8f706719b4b9e087Burn Liquidity435578452023-06-05 12:51:5819 hrs 43 mins ago0xc2d3259640b7ac40ddf5ea11220eb631d325cd6d IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.032389986129 151.593800187
0xddc53ee3f810a33b76f0a1f89f55035ab9ddcd1c4e59c0f2cff2cb3b5480f50fMulticall435567342023-06-05 12:11:4920 hrs 23 mins ago0x6faa1db3046f28b31d1f274c4eee2a229b39e0cd IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.033131934359 168.091962497
0x6fb0697dea894e918e03ef576a2025f7f6bf2ef679cf7dc087274f2db95d6b0dBurn Liquidity435561452023-06-05 11:50:2520 hrs 44 mins ago0x2938724646db5bab75d73171dd60a6fc825d7659 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.030474676998 155.018780482
0x47c496238581b5f9357e39ef168c503817fd6153c26d85bf052286f9cfed3833Multicall435553762023-06-05 11:21:4521 hrs 13 mins ago0x2e1ce15a5eb2bfbe8060f3377330592e9f12888a IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.029622611056 150.28771857
0x944519f2e07b42bc9a0dfdfee5c9a5aaadd41383f982a1a1008cfde13f014190Burn Liquidity435553682023-06-05 11:21:2721 hrs 13 mins ago0x57af8c49be6f4c0431a0d9d2d98a3a00587a9989 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.0275092251153.3
0xdc0ce3ad35a17f0ef27d4f817cb7df9a1a3d6e9d5b3b6f38b59e7b39b2ba343dMulticall435549092023-06-05 11:05:0221 hrs 30 mins ago0xc169913de62d09cc475400c454d62d8ccbe6a0c2 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.035715044608 181.187953327
0xa98a4468fb58d35f4a52b930b1352f369e1f31e68481c9ed36bcecd9f6090aa4Multicall435544962023-06-05 10:49:4021 hrs 45 mins ago0x2586697eb0d385481e103cc3375815ef74740160 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.032366014601 153.541882204
0x823d10f60c7d3b248234dc101638a643342f8e6d23850147c6648190b450c379Multicall435530502023-06-05 9:56:0922 hrs 39 mins ago0x8054338d24ba25a6c0d0dd978d9eefdcbdf4ec58 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.029904578691 151.732882899
0xa2ce5d926627b609104de31259ae64693400264c9d236ada762477368c708162Multicall435525072023-06-05 9:36:2122 hrs 58 mins ago0xd62b50dd215ec779cd3fbadda563f20ff0dd495d IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.03982773292 155.550346504
0x571561c681dd2df19ab0dd9e559a1ec9df13b71d08704c307ddbf2f2ef1735e7Burn Liquidity435521742023-06-05 9:24:2523 hrs 10 mins ago0x2ab9fb108dd6297c4a45d616f23ba17bb66471f5 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.030945492006152.105914594
0x78e1e785e07d108ba9c9c855bf3afd49c11f3bc7065af349ac62d7d884c9e358Burn Liquidity435497222023-06-05 7:52:401 day 42 mins ago0x0f1bbf2f3ae49e8f0cb5c9556ccbc1c7d60ee6da IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.030764289008 158.923690113
0xdb355bceb1530e97e941d36642784af5b2c61c038ad39b93488aad024f49d020Burn Liquidity435488792023-06-05 7:19:481 day 1 hr ago0xbd98f80cc2e026590ff1a00a3f61ad93682ac825 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.032570835325 165.705133448
0x5f89b25854c63cf2e8d1221d12b2eb3fd48863f99a28fb8cc5af90689a23def4Burn Liquidity435487722023-06-05 7:15:401 day 1 hr ago0xbd98f80cc2e026590ff1a00a3f61ad93682ac825 IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.033107034893 162.095507793
0x58226b344bff63674bdd090f92975148ca72f342c7a8cf706260de749a3199a3Burn Liquidity435482492023-06-05 6:55:451 day 1 hr ago0xe065d88f41615231e69026040c075d9f9f1bd00a IN  0x7a250c60cde7a5ca7b667209beab5ea4e16eed670 MATIC0.038282608938177.75192082
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x3735711dbbe41fbcc2fb4cbee0705c05a6a162f914cbdecbfcac06829ba019b0435821762023-06-06 3:42:494 hrs 52 mins ago 0x7a250c60cde7a5ca7b667209beab5ea4e16eed670x57af8c49be6f4c0431a0d9d2d98a3a00587a9989310.933106670097575141 MATIC
0x3735711dbbe41fbcc2fb4cbee0705c05a6a162f914cbdecbfcac06829ba019b0435821762023-06-06 3:42:494 hrs 52 mins ago Polygon: WMATIC Token 0x7a250c60cde7a5ca7b667209beab5ea4e16eed67310.933106670097575141 MATIC
0xcaf82e3dd53bc19c7824cdc22db8b12d40f0393e561454ab24539d0e768c5b81435737122023-06-05 22:35:0010 hrs ago 0x7a250c60cde7a5ca7b667209beab5ea4e16eed670xd8d9323157d74f34c7d3c4891e117c24f339e2d4341.810139727313426028 MATIC
0xcaf82e3dd53bc19c7824cdc22db8b12d40f0393e561454ab24539d0e768c5b81435737122023-06-05 22:35:0010 hrs ago Polygon: WMATIC Token 0x7a250c60cde7a5ca7b667209beab5ea4e16eed67341.810139727313426028 MATIC
0xc84d2a623a105195a3dade0d0e35913ec66770da744d64490e26adde644aeb4f435715992023-06-05 21:17:4211 hrs 17 mins ago 0x7a250c60cde7a5ca7b667209beab5ea4e16eed670x73a7984c3379aeedf004bc21bf2d614a2584b48f977.80567809907607202 MATIC
0xc84d2a623a105195a3dade0d0e35913ec66770da744d64490e26adde644aeb4f435715992023-06-05 21:17:4211 hrs 17 mins ago Polygon: WMATIC Token 0x7a250c60cde7a5ca7b667209beab5ea4e16eed67977.80567809907607202 MATIC
0xe9d62b13d647ebe8998d0d2ad74dd7d189897bc72b283fe98b42cb67b1b016ef435641572023-06-05 16:36:5915 hrs 58 mins ago 0x7a250c60cde7a5ca7b667209beab5ea4e16eed670x4da854cf427f33ecf208da22572d2a1eae9458db167.168387923236805221 MATIC
0xe9d62b13d647ebe8998d0d2ad74dd7d189897bc72b283fe98b42cb67b1b016ef435641572023-06-05 16:36:5915 hrs 58 mins ago Polygon: WMATIC Token 0x7a250c60cde7a5ca7b667209beab5ea4e16eed67167.168387923236805221 MATIC
0x798f854ab4e2c410c70960e73eb7121594b33a0fde61fb79e5aaa29ee90d16d7435641002023-06-05 16:34:5916 hrs ago 0x7a250c60cde7a5ca7b667209beab5ea4e16eed67 SushiSwap: Bento Box V10.1 MATIC
0xc35397f93f12b43202c71310459e307d9e6567c01a5b034720c84da8ebc977e0435621012023-06-05 15:24:0517 hrs 11 mins ago 0x7a250c60cde7a5ca7b667209beab5ea4e16eed670x8ff35b50f669c4d088dd6ce001e39bf6006402b9755.738376177635779134 MATIC
0xc35397f93f12b43202c71310459e307d9e6567c01a5b034720c84da8ebc977e0435621012023-06-05 15:24:0517 hrs 11 mins ago Polygon: WMATIC Token 0x7a250c60cde7a5ca7b667209beab5ea4e16eed67755.738376177635779134 MATIC
0x80a380baed923f939834a3215db0561d28f2923f4048381598e4b3a6748c5919435591162023-06-05 13:37:4618 hrs 57 mins ago 0x7a250c60cde7a5ca7b667209beab5ea4e16eed670xc03277e2a72de02212ec652c122b2ea9e573b26919.426850683871023757 MATIC
0x80a380baed923f939834a3215db0561d28f2923f4048381598e4b3a6748c5919435591162023-06-05 13:37:4618 hrs 57 mins ago Polygon: WMATIC Token 0x7a250c60cde7a5ca7b667209beab5ea4e16eed6719.426850683871023757 MATIC
0xddc53ee3f810a33b76f0a1f89f55035ab9ddcd1c4e59c0f2cff2cb3b5480f50f435567342023-06-05 12:11:4920 hrs 23 mins ago 0x7a250c60cde7a5ca7b667209beab5ea4e16eed670x6faa1db3046f28b31d1f274c4eee2a229b39e0cd130.44424645027248993 MATIC
0xddc53ee3f810a33b76f0a1f89f55035ab9ddcd1c4e59c0f2cff2cb3b5480f50f435567342023-06-05 12:11:4920 hrs 23 mins ago Polygon: WMATIC Token 0x7a250c60cde7a5ca7b667209beab5ea4e16eed67130.44424645027248993 MATIC
0x47c496238581b5f9357e39ef168c503817fd6153c26d85bf052286f9cfed3833435553762023-06-05 11:21:4521 hrs 13 mins ago 0x7a250c60cde7a5ca7b667209beab5ea4e16eed670x2e1ce15a5eb2bfbe8060f3377330592e9f12888a76.007745741758103703 MATIC
0x47c496238581b5f9357e39ef168c503817fd6153c26d85bf052286f9cfed3833435553762023-06-05 11:21:4521 hrs 13 mins ago Polygon: WMATIC Token 0x7a250c60cde7a5ca7b667209beab5ea4e16eed6776.007745741758103703 MATIC
0xdc0ce3ad35a17f0ef27d4f817cb7df9a1a3d6e9d5b3b6f38b59e7b39b2ba343d435549092023-06-05 11:05:0221 hrs 30 mins ago 0x7a250c60cde7a5ca7b667209beab5ea4e16eed670xc169913de62d09cc475400c454d62d8ccbe6a0c224,826.671792058354523005 MATIC
0xdc0ce3ad35a17f0ef27d4f817cb7df9a1a3d6e9d5b3b6f38b59e7b39b2ba343d435549092023-06-05 11:05:0221 hrs 30 mins ago Polygon: WMATIC Token 0x7a250c60cde7a5ca7b667209beab5ea4e16eed6724,826.671792058354523005 MATIC
0xa98a4468fb58d35f4a52b930b1352f369e1f31e68481c9ed36bcecd9f6090aa4435544962023-06-05 10:49:4021 hrs 45 mins ago 0x7a250c60cde7a5ca7b667209beab5ea4e16eed670x2586697eb0d385481e103cc3375815ef74740160335.690865456357348096 MATIC
0xa98a4468fb58d35f4a52b930b1352f369e1f31e68481c9ed36bcecd9f6090aa4435544962023-06-05 10:49:4021 hrs 45 mins ago Polygon: WMATIC Token 0x7a250c60cde7a5ca7b667209beab5ea4e16eed67335.690865456357348096 MATIC
0x823d10f60c7d3b248234dc101638a643342f8e6d23850147c6648190b450c379435530502023-06-05 9:56:0922 hrs 39 mins ago 0x7a250c60cde7a5ca7b667209beab5ea4e16eed670x8054338d24ba25a6c0d0dd978d9eefdcbdf4ec586.977016928298814251 MATIC
0x823d10f60c7d3b248234dc101638a643342f8e6d23850147c6648190b450c379435530502023-06-05 9:56:0922 hrs 39 mins ago Polygon: WMATIC Token 0x7a250c60cde7a5ca7b667209beab5ea4e16eed676.977016928298814251 MATIC
0x2b3f2b5f6f3c408a28862953b4087a4a3813fc95fd70f606b91699900fe38a77435437202023-06-05 4:01:391 day 4 hrs ago 0x7a250c60cde7a5ca7b667209beab5ea4e16eed670x3e6462e70d256ccb47f53cedf502139c3a771bf486.425024673691756665 MATIC
0x2b3f2b5f6f3c408a28862953b4087a4a3813fc95fd70f606b91699900fe38a77435437202023-06-05 4:01:391 day 4 hrs ago Polygon: WMATIC Token 0x7a250c60cde7a5ca7b667209beab5ea4e16eed6786.425024673691756665 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TridentRouter

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion
File 1 of 13 : TridentRouter.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

import {Multicall} from "./abstract/Multicall.sol";
import {SelfPermit} from "./abstract/SelfPermit.sol";
import {Transfer} from "./libraries/Transfer.sol";
import {IBentoBoxMinimal} from "./interfaces/IBentoBoxMinimal.sol";
import {IMasterDeployer} from "./interfaces/IMasterDeployer.sol";
import {IPool} from "./interfaces/IPool.sol";
import {ITridentRouter} from "./interfaces/ITridentRouter.sol";
import {IWETH9} from "./interfaces/IWETH9.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

/// @dev Custom Errors
error NotWethSender();
error TooLittleReceived();
error NotEnoughLiquidityMinted();
error IncorrectTokenWithdrawn();
error IncorrectSlippageParams();
error InsufficientWETH();
error InvalidPool();

/// @notice Router contract that helps in swapping across Trident pools.
contract TridentRouter is ITridentRouter, SelfPermit, Multicall {
    using Transfer for address;

    /// @notice BentoBox token vault.
    IBentoBoxMinimal public immutable bento;

    /// @notice Master deployer.
    IMasterDeployer public immutable masterDeployer;

    /// @notice ERC-20 token for wrapped ETH (v9).
    address internal immutable wETH;

    /// @notice The user should use 0x0 if they want to use native currency, e.g., ETH.
    address constant USE_NATIVE = address(0);

    constructor(
        IBentoBoxMinimal _bento,
        IMasterDeployer _masterDeployer,
        address _wETH
    ) {
        bento = _bento;
        masterDeployer = _masterDeployer;
        wETH = _wETH;
        _bento.registerProtocol();
    }

    receive() external payable {
        if (msg.sender != wETH) revert NotWethSender();
    }

    /// @notice Swaps token A to token B directly. Swaps are done on `bento` tokens.
    /// @param params This includes the address of token A, pool, amount of token A to swap,
    /// minimum amount of token B after the swap and data required by the pool for the swap.
    /// @dev Ensure that the pool is trusted before calling this function. The pool can steal users' tokens.
    function exactInputSingle(ExactInputSingleParams calldata params) public payable returns (uint256 amountOut) {
        // Prefund the pool with token A.
        bento.transfer(params.tokenIn, msg.sender, params.pool, params.amountIn);
        // Trigger the swap in the pool.
        amountOut = IPool(params.pool).swap(params.data);
        // Ensure that the slippage wasn't too much. This assumes that the pool is honest.
        if (amountOut < params.amountOutMinimum) revert TooLittleReceived();
    }

    /// @notice Swaps token A to token B indirectly by using multiple hops.
    /// @param params This includes the addresses of the tokens, pools, amount of token A to swap,
    /// minimum amount of token B after the swap and data required by the pools for the swaps.
    /// @dev Ensure that the pools are trusted before calling this function. The pools can steal users' tokens.
    function exactInput(ExactInputParams calldata params) public payable returns (uint256 amountOut) {
        // Pay the first pool directly.
        bento.transfer(params.tokenIn, msg.sender, params.path[0].pool, params.amountIn);
        // Call every pool in the path.
        // Pool `N` should transfer its output tokens to pool `N+1` directly.
        // The last pool should transfer its output tokens to the user.
        // If the user wants to unwrap `wETH`, the final destination should be this contract and
        // a batch call should be made to `unwrapWETH`.
        uint256 n = params.path.length;
        for (uint256 i = 0; i < n; i = _increment(i)) {
            amountOut = IPool(params.path[i].pool).swap(params.path[i].data);
        }
        // Ensure that the slippage wasn't too much. This assumes that the pool is honest.
        if (amountOut < params.amountOutMinimum) revert TooLittleReceived();
    }

    /// @notice Swaps token A to token B directly. It's the same as `exactInputSingle` except
    /// it takes raw ERC-20 tokens from the users and deposits them into `bento`.
    /// @param params This includes the address of token A, pool, amount of token A to swap,
    /// minimum amount of token B after the swap and data required by the pool for the swap.
    /// @dev Ensure that the pool is trusted before calling this function. The pool can steal users' tokens.
    function exactInputSingleWithNativeToken(ExactInputSingleParams calldata params) public payable returns (uint256 amountOut) {
        // Deposits the native ERC-20 token from the user into the pool's `bento`.
        _depositToBentoBox(params.tokenIn, params.pool, params.amountIn);
        // Trigger the swap in the pool.
        amountOut = IPool(params.pool).swap(params.data);
        // Ensure that the slippage wasn't too much. This assumes that the pool is honest.
        if (amountOut < params.amountOutMinimum) revert TooLittleReceived();
    }

    /// @notice Swaps token A to token B indirectly by using multiple hops. It's the same as `exactInput` except
    /// it takes raw ERC-20 tokens from the users and deposits them into `bento`.
    /// @param params This includes the addresses of the tokens, pools, amount of token A to swap,
    /// minimum amount of token B after the swap and data required by the pools for the swaps.
    /// @dev Ensure that the pools are trusted before calling this function. The pools can steal users' tokens.
    function exactInputWithNativeToken(ExactInputParams calldata params) public payable returns (uint256 amountOut) {
        // Deposits the native ERC-20 token from the user into the pool's `bento`.
        _depositToBentoBox(params.tokenIn, params.path[0].pool, params.amountIn);
        // Call every pool in the path.
        // Pool `N` should transfer its output tokens to pool `N+1` directly.
        // The last pool should transfer its output tokens to the user.
        uint256 n = params.path.length;
        for (uint256 i = 0; i < n; i = _increment(i)) {
            amountOut = IPool(params.path[i].pool).swap(params.path[i].data);
        }
        // Ensure that the slippage wasn't too much. This assumes that the pool is honest.
        if (amountOut < params.amountOutMinimum) revert TooLittleReceived();
    }

    /// @notice Swaps multiple input tokens to multiple output tokens using multiple paths, in different percentages.
    /// For example, you can swap 50 DAI + 100 USDC into 60% ETH and 40% BTC.
    /// @param params This includes everything needed for the swap. Look at the `ComplexPathParams` struct for more details.
    /// @dev This function is not optimized for single swaps and should only be used in complex cases where
    /// the amounts are large enough that minimizing slippage by using multiple paths is worth the extra gas.
    function complexPath(ComplexPathParams calldata params) public payable {
        // Deposit all initial tokens to respective pools and initiate the swaps.
        // Input tokens come from the user - output goes to following pools.
        uint256 n = params.initialPath.length;
        for (uint256 i = 0; i < n; i = _increment(i)) {
            if (params.initialPath[i].native) {
                _depositToBentoBox(params.initialPath[i].tokenIn, params.initialPath[i].pool, params.initialPath[i].amount);
            } else {
                bento.transfer(params.initialPath[i].tokenIn, msg.sender, params.initialPath[i].pool, params.initialPath[i].amount);
            }
            IPool(params.initialPath[i].pool).swap(params.initialPath[i].data);
        }
        // Do all the middle swaps. Input comes from previous pools.
        n = params.percentagePath.length;
        for (uint256 i = 0; i < n; i = _increment(i)) {
            uint256 balanceShares = bento.balanceOf(params.percentagePath[i].tokenIn, address(this));
            uint256 transferShares = (balanceShares * params.percentagePath[i].balancePercentage) / uint256(10)**8;
            bento.transfer(params.percentagePath[i].tokenIn, address(this), params.percentagePath[i].pool, transferShares);
            IPool(params.percentagePath[i].pool).swap(params.percentagePath[i].data);
        }
        // Ensure enough was received and transfer the ouput to the recipient.
        n = params.output.length;
        for (uint256 i = 0; i < n; i = _increment(i)) {
            uint256 balanceShares = bento.balanceOf(params.output[i].token, address(this));
            if (balanceShares < params.output[i].minAmount) revert TooLittleReceived();
            if (params.output[i].unwrapBento) {
                bento.withdraw(params.output[i].token, address(this), params.output[i].to, 0, balanceShares);
            } else {
                bento.transfer(params.output[i].token, address(this), params.output[i].to, balanceShares);
            }
        }
    }

    /// @notice Add liquidity to a pool.
    /// @param tokenInput Token address and amount to add as liquidity.
    /// @param pool Pool address to add liquidity to.
    /// @param minLiquidity Minimum output liquidity - caps slippage.
    /// @param data Data required by the pool to add liquidity.
    function addLiquidity(
        TokenInput[] calldata tokenInput,
        address pool,
        uint256 minLiquidity,
        bytes calldata data
    ) public payable returns (uint256 liquidity) {
        // Send all input tokens to the pool.
        uint256 n = tokenInput.length;
        for (uint256 i = 0; i < n; i = _increment(i)) {
            if (tokenInput[i].native) {
                _depositToBentoBox(tokenInput[i].token, pool, tokenInput[i].amount);
            } else {
                bento.transfer(tokenInput[i].token, msg.sender, pool, tokenInput[i].amount);
            }
        }
        liquidity = IPool(pool).mint(data);
        if (liquidity < minLiquidity) revert NotEnoughLiquidityMinted();
    }

    /// @notice Burn liquidity tokens to get back `bento` tokens.
    /// @param pool Pool address.
    /// @param liquidity Amount of liquidity tokens to burn.
    /// @param data Data required by the pool to burn liquidity.
    /// @param minWithdrawals Minimum amount of `bento` tokens to be returned.
    function burnLiquidity(
        address pool,
        uint256 liquidity,
        bytes calldata data,
        IPool.TokenAmount[] calldata minWithdrawals
    ) public payable {
        pool.safeTransferFrom(msg.sender, pool, liquidity);
        IPool.TokenAmount[] memory withdrawnLiquidity = IPool(pool).burn(data);
        uint256 n = minWithdrawals.length;
        for (uint256 i = 0; i < n; i = _increment(i)) {
            if (minWithdrawals[i].token != withdrawnLiquidity[i].token) revert IncorrectSlippageParams();
            if (withdrawnLiquidity[i].amount < minWithdrawals[i].amount) revert TooLittleReceived();
        }
    }

    /// @notice Burn liquidity tokens to get back `bento` tokens.
    /// @dev The tokens are swapped automatically and the output is in a single token.
    /// @param pool Pool address.
    /// @param liquidity Amount of liquidity tokens to burn.
    /// @param data Data required by the pool to burn liquidity.
    /// @param minWithdrawal Minimum amount of tokens to be returned.
    function burnLiquiditySingle(
        address pool,
        uint256 liquidity,
        bytes calldata data,
        uint256 minWithdrawal
    ) public payable {
        // Use 'liquidity = 0' for prefunding.
        pool.safeTransferFrom(msg.sender, pool, liquidity);
        uint256 withdrawn = IPool(pool).burnSingle(data);
        if (withdrawn < minWithdrawal) revert TooLittleReceived();
    }

    /// @notice Recover mistakenly sent tokens.
    function sweep(
        address token,
        address recipient,
        bool fromBento
    ) external payable {
        if (fromBento) {
            uint256 shares = bento.balanceOf(token, address(this));
            bento.transfer(token, address(this), recipient, shares);
        } else {
            uint256 amount = token == USE_NATIVE ? address(this).balance : (IERC20(token).balanceOf(address(this)) - 1);
            token == USE_NATIVE ? recipient.safeTransferETH(amount) : token.safeTransfer(recipient, amount);
        }
    }

    /// @notice Unwrap this contract's wETH into ETH.
    function unwrapWETH(address recipient) external payable {
        uint256 balance = IWETH9(wETH).balanceOf(address(this));
        IWETH9(wETH).withdraw(balance);
        recipient.safeTransferETH(balance);
    }

    /// @notice Wrapper function to allow pool deployment to be batched.
    function deployPool(address factory, bytes calldata deployData) external payable returns (address) {
        return masterDeployer.deployPool(factory, deployData);
    }

    /// @notice Wrapper function to allow bento set master contract approval to be batched, so the first trade can happen in one transaction.
    function approveMasterContract(
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable {
        bento.setMasterContractApproval(msg.sender, address(this), true, v, r, s);
    }

    /// @notice Call BentoBox harvest function to rebalance a BentoBox token strategy and ensure there are enough tokens available to withdraw a swap output.
    /// @dev Should be batched in before a swap.
    function harvest(address token, uint256 maxChangeAmount) external payable {
        bento.harvest(token, true, maxChangeAmount);
    }

    /// @notice Deposit from the user's wallet into BentoBox.
    /// @dev Amount is the native token amount. We let BentoBox do the conversion into shares.
    function _depositToBentoBox(
        address token,
        address recipient,
        uint256 amount
    ) internal {
        bento.deposit{value: token == USE_NATIVE ? amount : 0}(token, msg.sender, recipient, amount, 0);
    }

    function _increment(uint256 i) internal pure returns (uint256) {
        unchecked {
            return i + 1;
        }
    }
}

File 2 of 13 : Multicall.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

/// @notice Helper utility that enables calling multiple local methods in a single call.
/// @author Modified from Uniswap (https://github.com/Uniswap/v3-periphery/blob/main/contracts/base/Multicall.sol)
/// License-Identifier: GPL-2.0-or-later
abstract contract Multicall {
    function multicall(bytes[] calldata data) public payable returns (bytes[] memory results) {
        results = new bytes[](data.length);
        
        for (uint256 i; i < data.length;) {
            (bool success, bytes memory result) = address(this).delegatecall(data[i]);

            if (!success) {
                // Next 5 lines from https://ethereum.stackexchange.com/a/83577
                if (result.length < 68) revert();
                assembly {
                    result := add(result, 0x04)
                }
                revert(abi.decode(result, (string)));
            }

            results[i] = result;

            // cannot realistically overflow on human timescales
            unchecked {
                ++i;
            }
        }
    }
}

File 3 of 13 : SelfPermit.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol";

import "../interfaces/IERC20PermitAllowed.sol";

abstract contract SelfPermit {
    function selfPermit(
        address token,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public payable {
        IERC20Permit(token).permit(msg.sender, address(this), value, deadline, v, r, s);
    }

    function selfPermitIfNecessary(
        address token,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable {
        if (IERC20(token).allowance(msg.sender, address(this)) < value) selfPermit(token, value, deadline, v, r, s);
    }

    function selfPermitAllowed(
        address token,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public payable {
        IERC20PermitAllowed(token).permit(msg.sender, address(this), nonce, expiry, true, v, r, s);
    }

    function selfPermitAllowedIfNecessary(
        address token,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable {
        if (IERC20(token).allowance(msg.sender, address(this)) < type(uint256).max)
            selfPermitAllowed(token, nonce, expiry, v, r, s);
    }
}

File 4 of 13 : Transfer.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

library Transfer {
    /// @notice Transfers tokens from the targeted address to the given destination
    /// @notice Errors with 'STF' if transfer fails
    /// @param token The contract address of the token to be transferred
    /// @param from The originating address from which the tokens will be transferred
    /// @param to The destination address of the transfer
    /// @param value The amount to be transferred
    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) =
            token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "STF");
    }

    /// @notice Transfers tokens from msg.sender to a recipient
    /// @dev Errors with ST if transfer fails
    /// @param token The contract address of the token which will be transferred
    /// @param to The recipient of the transfer
    /// @param value The value of the transfer
    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "ST");
    }

    /// @notice Approves the stipulated contract to spend the given allowance in the given token
    /// @dev Errors with 'SA' if transfer fails
    /// @param token The contract address of the token to be approved
    /// @param to The target of the approval
    /// @param value The amount of the given token the target will be allowed to spend
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "SA");
    }

    /// @notice Transfers ETH to the recipient address
    /// @dev Fails with `STE`
    /// @param to The destination of the transfer
    /// @param value The value to be transferred
    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, "STE");
    }
}

File 5 of 13 : IBentoBoxMinimal.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

import "../libraries/RebaseLibrary.sol";

/// @notice Minimal BentoBox vault interface.
/// @dev `token` is aliased as `address` from `IERC20` for simplicity.
interface IBentoBoxMinimal {
    /// @notice Balance per ERC-20 token per account in shares.
    function balanceOf(address, address) external view returns (uint256);

    /// @dev Helper function to represent an `amount` of `token` in shares.
    /// @param token The ERC-20 token.
    /// @param amount The `token` amount.
    /// @param roundUp If the result `share` should be rounded up.
    /// @return share The token amount represented in shares.
    function toShare(
        address token,
        uint256 amount,
        bool roundUp
    ) external view returns (uint256 share);

    /// @dev Helper function to represent shares back into the `token` amount.
    /// @param token The ERC-20 token.
    /// @param share The amount of shares.
    /// @param roundUp If the result should be rounded up.
    /// @return amount The share amount back into native representation.
    function toAmount(
        address token,
        uint256 share,
        bool roundUp
    ) external view returns (uint256 amount);

    /// @notice Registers this contract so that users can approve it for BentoBox.
    function registerProtocol() external;

    /// @notice Deposit an amount of `token` represented in either `amount` or `share`.
    /// @param token The ERC-20 token to deposit.
    /// @param from which account to pull the tokens.
    /// @param to which account to push the tokens.
    /// @param amount Token amount in native representation to deposit.
    /// @param share Token amount represented in shares to deposit. Takes precedence over `amount`.
    /// @return amountOut The amount deposited.
    /// @return shareOut The deposited amount represented in shares.
    function deposit(
        address token,
        address from,
        address to,
        uint256 amount,
        uint256 share
    ) external payable returns (uint256 amountOut, uint256 shareOut);

    /// @notice Withdraws an amount of `token` from a user account.
    /// @param token_ The ERC-20 token to withdraw.
    /// @param from which user to pull the tokens.
    /// @param to which user to push the tokens.
    /// @param amount of tokens. Either one of `amount` or `share` needs to be supplied.
    /// @param share Like above, but `share` takes precedence over `amount`.
    function withdraw(
        address token_,
        address from,
        address to,
        uint256 amount,
        uint256 share
    ) external returns (uint256 amountOut, uint256 shareOut);

    /// @notice Transfer shares from a user account to another one.
    /// @param token The ERC-20 token to transfer.
    /// @param from which user to pull the tokens.
    /// @param to which user to push the tokens.
    /// @param share The amount of `token` in shares.
    function transfer(
        address token,
        address from,
        address to,
        uint256 share
    ) external;

    /// @dev Reads the Rebase `totals`from storage for a given token
    function totals(address token) external view returns (Rebase memory total);

    /// @dev Approves users' BentoBox assets to a "master" contract.
    function setMasterContractApproval(
        address user,
        address masterContract,
        bool approved,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function harvest(
        address token,
        bool balance,
        uint256 maxChangeAmount
    ) external;
}

File 6 of 13 : IMasterDeployer.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

/// @notice Trident pool deployer interface.
interface IMasterDeployer {
    function barFee() external view returns (uint256);

    function barFeeTo() external view returns (address);

    function bento() external view returns (address);

    function migrator() external view returns (address);

    function pools(address pool) external view returns (bool);

    function deployPool(address factory, bytes calldata deployData) external returns (address);
}

File 7 of 13 : IPool.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.5.0;
pragma experimental ABIEncoderV2;

/// @notice Trident pool interface.
interface IPool {
    /// @notice Executes a swap from one token to another.
    /// @dev The input tokens must've already been sent to the pool.
    /// @param data ABI-encoded params that the pool requires.
    /// @return finalAmountOut The amount of output tokens that were sent to the user.
    function swap(bytes calldata data) external returns (uint256 finalAmountOut);

    /// @notice Executes a swap from one token to another with a callback.
    /// @dev This function allows borrowing the output tokens and sending the input tokens in the callback.
    /// @param data ABI-encoded params that the pool requires.
    /// @return finalAmountOut The amount of output tokens that were sent to the user.
    function flashSwap(bytes calldata data) external returns (uint256 finalAmountOut);

    /// @notice Mints liquidity tokens.
    /// @param data ABI-encoded params that the pool requires.
    /// @return liquidity The amount of liquidity tokens that were minted for the user.
    function mint(bytes calldata data) external returns (uint256 liquidity);

    /// @notice Burns liquidity tokens.
    /// @dev The input LP tokens must've already been sent to the pool.
    /// @param data ABI-encoded params that the pool requires.
    /// @return withdrawnAmounts The amount of various output tokens that were sent to the user.
    function burn(bytes calldata data) external returns (TokenAmount[] memory withdrawnAmounts);

    /// @notice Burns liquidity tokens for a single output token.
    /// @dev The input LP tokens must've already been sent to the pool.
    /// @param data ABI-encoded params that the pool requires.
    /// @return amountOut The amount of output tokens that were sent to the user.
    function burnSingle(bytes calldata data) external returns (uint256 amountOut);

    /// @return A unique identifier for the pool type.
    function poolIdentifier() external pure returns (bytes32);

    /// @return An array of tokens supported by the pool.
    function getAssets() external view returns (address[] memory);

    /// @notice Simulates a trade and returns the expected output.
    /// @dev The pool does not need to include a trade simulator directly in itself - it can use a library.
    /// @param data ABI-encoded params that the pool requires.
    /// @return finalAmountOut The amount of output tokens that will be sent to the user if the trade is executed.
    function getAmountOut(bytes calldata data) external view returns (uint256 finalAmountOut);

    /// @notice Simulates a trade and returns the expected output.
    /// @dev The pool does not need to include a trade simulator directly in itself - it can use a library.
    /// @param data ABI-encoded params that the pool requires.
    /// @return finalAmountIn The amount of input tokens that are required from the user if the trade is executed.
    function getAmountIn(bytes calldata data) external view returns (uint256 finalAmountIn);

    /// @dev This event must be emitted on all swaps.
    event Swap(address indexed recipient, address indexed tokenIn, address indexed tokenOut, uint256 amountIn, uint256 amountOut);

    /// @dev This struct frames output tokens for burns.
    struct TokenAmount {
        address token;
        uint256 amount;
    }
}

File 8 of 13 : ITridentRouter.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

/// @notice Trident pool router interface.
interface ITridentRouter {
    struct Path {
        address pool;
        bytes data;
    }

    struct ExactInputSingleParams {
        uint256 amountIn;
        uint256 amountOutMinimum;
        address pool;
        address tokenIn;
        bytes data;
    }

    struct ExactInputParams {
        address tokenIn;
        uint256 amountIn;
        uint256 amountOutMinimum;
        Path[] path;
    }

    struct TokenInput {
        address token;
        bool native;
        uint256 amount;
    }

    struct InitialPath {
        address tokenIn;
        address pool;
        bool native;
        uint256 amount;
        bytes data;
    }

    struct PercentagePath {
        address tokenIn;
        address pool;
        uint64 balancePercentage; // Multiplied by 10^6. 100% = 100_000_000
        bytes data;
    }

    struct Output {
        address token;
        address to;
        bool unwrapBento;
        uint256 minAmount;
    }

    struct ComplexPathParams {
        InitialPath[] initialPath;
        PercentagePath[] percentagePath;
        Output[] output;
    }
}

File 9 of 13 : IWETH9.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IWETH9 is IERC20 {
    function deposit() external payable;
    function withdraw(uint256) external;
}

File 10 of 13 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 11 of 13 : draft-IERC20Permit.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

File 12 of 13 : IERC20PermitAllowed.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

interface IERC20PermitAllowed {
    function permit(
        address holder,
        address spender,
        uint256 nonce,
        uint256 expiry,
        bool allowed,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

File 13 of 13 : RebaseLibrary.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.8;

struct Rebase {
    uint128 elastic;
    uint128 base;
}

/// @notice A rebasing library
library RebaseLibrary {
    /// @notice Calculates the base value in relationship to `elastic` and `total`.
    function toBase(Rebase memory total, uint256 elastic) internal pure returns (uint256 base) {
        if (total.elastic == 0) {
            base = elastic;
        } else {
            base = (elastic * total.base) / total.elastic;
        }
    }

    /// @notice Calculates the elastic value in relationship to `base` and `total`.
    function toElastic(Rebase memory total, uint256 base) internal pure returns (uint256 elastic) {
        if (total.base == 0) {
            elastic = base;
        } else {
            elastic = (base * total.elastic) / total.base;
        }
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IBentoBoxMinimal","name":"_bento","type":"address"},{"internalType":"contract IMasterDeployer","name":"_masterDeployer","type":"address"},{"internalType":"address","name":"_wETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"IncorrectSlippageParams","type":"error"},{"inputs":[],"name":"NotEnoughLiquidityMinted","type":"error"},{"inputs":[],"name":"NotWethSender","type":"error"},{"inputs":[],"name":"TooLittleReceived","type":"error"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"native","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ITridentRouter.TokenInput[]","name":"tokenInput","type":"tuple[]"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"approveMasterContract","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"bento","outputs":[{"internalType":"contract IBentoBoxMinimal","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount[]","name":"minWithdrawals","type":"tuple[]"}],"name":"burnLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minWithdrawal","type":"uint256"}],"name":"burnLiquiditySingle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"bool","name":"native","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ITridentRouter.InitialPath[]","name":"initialPath","type":"tuple[]"},{"components":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint64","name":"balancePercentage","type":"uint64"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ITridentRouter.PercentagePath[]","name":"percentagePath","type":"tuple[]"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"unwrapBento","type":"bool"},{"internalType":"uint256","name":"minAmount","type":"uint256"}],"internalType":"struct ITridentRouter.Output[]","name":"output","type":"tuple[]"}],"internalType":"struct ITridentRouter.ComplexPathParams","name":"params","type":"tuple"}],"name":"complexPath","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"bytes","name":"deployData","type":"bytes"}],"name":"deployPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ITridentRouter.Path[]","name":"path","type":"tuple[]"}],"internalType":"struct ITridentRouter.ExactInputParams","name":"params","type":"tuple"}],"name":"exactInput","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ITridentRouter.ExactInputSingleParams","name":"params","type":"tuple"}],"name":"exactInputSingle","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ITridentRouter.ExactInputSingleParams","name":"params","type":"tuple"}],"name":"exactInputSingleWithNativeToken","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ITridentRouter.Path[]","name":"path","type":"tuple[]"}],"internalType":"struct ITridentRouter.ExactInputParams","name":"params","type":"tuple"}],"name":"exactInputWithNativeToken","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"maxChangeAmount","type":"uint256"}],"name":"harvest","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"masterDeployer","outputs":[{"internalType":"contract IMasterDeployer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitAllowed","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitAllowedIfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitIfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"fromBento","type":"bool"}],"name":"sweep","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"unwrapWETH","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b5060405162003a4c38038062003a4c8339810160408190526200003491620000c3565b6001600160a01b03808416608081905283821660a05290821660c0526040805163577268d960e11b8152905163aee4d1b29160048082019260009290919082900301818387803b1580156200008857600080fd5b505af11580156200009d573d6000803e3d6000fd5b5050505050505062000117565b6001600160a01b0381168114620000c057600080fd5b50565b600080600060608486031215620000d957600080fd5b8351620000e681620000aa565b6020850151909350620000f981620000aa565b60408501519092506200010c81620000aa565b809150509250925092565b60805160a05160c05161388e620001be600039600081816101800152818161152901526115db0152600081816103ac015261095a0152600081816102d30152818161043401528181610669015281816109f701528181610caf01528181610f000152818161129f0152818161136901528181611a0f01528181611ca201528181611e1e01528181612099015281816122370152818161238f01526125f6015261388e6000f3fe6080604052600436106101635760003560e01c8063783312d9116100c0578063ac9650d811610074578063c2e3140a11610059578063c2e3140a14610387578063cf58879a1461039a578063f3995c67146103ce57600080fd5b8063ac9650d814610354578063b96c5c0e1461037457600080fd5b806389a3f136116100a557806389a3f1361461031b5780639fa744911461032e578063a4a78f0c1461034157600080fd5b8063783312d9146102f55780637f6ad4551461030857600080fd5b80632c0d9a0111610117578063403335a8116100fc578063403335a81461029b5780634659a494146102ae5780634da31827146102c157600080fd5b80632c0d9a01146102755780632cfcb94f1461028857600080fd5b80630f93d439116101485780630f93d439146102175780631aa349a81461022a578063250558dc1461023d57600080fd5b8063018ee9b7146101de5780630b0d1b1e146101f157600080fd5b366101d9573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d7576040517fe7218bb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b600080fd5b6101d76101ec366004612acc565b6103e1565b6102046101ff366004612af8565b610494565b6040519081526020015b60405180910390f35b610204610225366004612b3a565b610650565b6101d7610238366004612bbe565b610822565b61025061024b366004612c22565b61091a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161020e565b610204610283366004612af8565b6109de565b610204610296366004612c77565b610c1f565b6101d76102a9366004612d43565b610eae565b6101d76102bc366004612d76565b610f76565b3480156102cd57600080fd5b506102507f000000000000000000000000000000000000000000000000000000000000000081565b6101d7610303366004612dd0565b611031565b6101d7610316366004612e99565b61124b565b6101d7610329366004612ee4565b6114f8565b61020461033c366004612b3a565b611671565b6101d761034f366004612d76565b6116ad565b610367610362366004612f01565b611777565b60405161020e9190612fec565b6101d761038236600461306c565b6118e7565b6101d7610395366004612d76565b6124bc565b3480156103a657600080fd5b506102507f000000000000000000000000000000000000000000000000000000000000000081565b6101d76103dc366004612d76565b612562565b6040517f66c6bb0b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260016024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906366c6bb0b90606401600060405180830381600087803b15801561047857600080fd5b505af115801561048c573d6000803e3d6000fd5b505050505050565b60006104ee6104a66020840184612ee4565b6104b360608501856130a7565b60008181106104c4576104c461310f565b90506020028101906104d6919061313e565b6104e4906020810190612ee4565b84602001356125df565b60006104fd60608401846130a7565b9050905060005b8181101561060b5761051960608501856130a7565b828181106105295761052961310f565b905060200281019061053b919061313e565b610549906020810190612ee4565b73ffffffffffffffffffffffffffffffffffffffff1663627dd56a61057160608701876130a7565b848181106105815761058161310f565b9050602002810190610593919061313e565b6105a190602081019061317c565b6040518363ffffffff1660e01b81526004016105be92919061322a565b6020604051808303816000875af11580156105dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610601919061323e565b9250600101610504565b50826040013582101561064a576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50919050565b600073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663f18d03cc61069e6080850160608601612ee4565b336106af6060870160408801612ee4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529183166024830152909116604482015284356064820152608401600060405180830381600087803b15801561072c57600080fd5b505af1158015610740573d6000803e3d6000fd5b50610755925050506060830160408401612ee4565b73ffffffffffffffffffffffffffffffffffffffff1663627dd56a61077d608085018561317c565b6040518363ffffffff1660e01b815260040161079a92919061322a565b6020604051808303816000875af11580156107b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107dd919061323e565b9050816020013581101561081d576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61084473ffffffffffffffffffffffffffffffffffffffff86163387876126de565b6040517faf8c09bf00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff87169063af8c09bf9061089b908790879060040161322a565b6020604051808303816000875af11580156108ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108de919061323e565b90508181101561048c576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f250558dc00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063250558dc9061099390879087908790600401613257565b6020604051808303816000875af11580156109b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d69190613290565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663f18d03cc610a296020850185612ee4565b33610a3760608701876130a7565b6000818110610a4857610a4861310f565b9050602002810190610a5a919061313e565b610a68906020810190612ee4565b60405160e085901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff93841660048201529183166024830152909116604482015260208501356064820152608401600060405180830381600087803b158015610ae857600080fd5b505af1158015610afc573d6000803e3d6000fd5b5060009250610b1191505060608401846130a7565b9050905060005b8181101561060b57610b2d60608501856130a7565b82818110610b3d57610b3d61310f565b9050602002810190610b4f919061313e565b610b5d906020810190612ee4565b73ffffffffffffffffffffffffffffffffffffffff1663627dd56a610b8560608701876130a7565b84818110610b9557610b9561310f565b9050602002810190610ba7919061313e565b610bb590602081019061317c565b6040518363ffffffff1660e01b8152600401610bd292919061322a565b6020604051808303816000875af1158015610bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c15919061323e565b9250600101610b18565b600085815b81811015610dcf57888882818110610c3e57610c3e61310f565b9050606002016020016020810190610c5691906132ad565b15610cad57610ca8898983818110610c7057610c7061310f565b610c869260206060909202019081019150612ee4565b888b8b85818110610c9957610c9961310f565b905060600201604001356125df565b610dc7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f18d03cc8a8a84818110610cfb57610cfb61310f565b610d119260206060909202019081019150612ee4565b338a8d8d87818110610d2557610d2561310f565b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e08a901b16815273ffffffffffffffffffffffffffffffffffffffff978816600482015295871660248701529590931660448501525060609091020191909101356064820152608401600060405180830381600087803b158015610dae57600080fd5b505af1158015610dc2573d6000803e3d6000fd5b505050505b600101610c24565b506040517f7ba0e2e700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690637ba0e2e790610e24908790879060040161322a565b6020604051808303816000875af1158015610e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e67919061323e565b915084821015610ea3576040517f249942be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b509695505050505050565b6040517fc0a47c930000000000000000000000000000000000000000000000000000000081523360048201523060248201526001604482015260ff841660648201526084810183905260a481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c0a47c939060c401600060405180830381600087803b158015610f5957600080fd5b505af1158015610f6d573d6000803e3d6000fd5b50505050505050565b6040517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052606481018590526001608482015260ff841660a482015260c4810183905260e4810182905273ffffffffffffffffffffffffffffffffffffffff871690638fcbaf0c90610104015b600060405180830381600087803b15801561101157600080fd5b505af1158015611025573d6000803e3d6000fd5b50505050505050505050565b61105373ffffffffffffffffffffffffffffffffffffffff87163388886126de565b6040517f2a07b6c700000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff881690632a07b6c7906110aa908890889060040161322a565b6000604051808303816000875af11580156110c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261110f9190810190613371565b90508160005b818110156112405782818151811061112f5761112f61310f565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff168585838181106111635761116361310f565b6111799260206040909202019081019150612ee4565b73ffffffffffffffffffffffffffffffffffffffff16146111c6576040517f2664ab9d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484828181106111d8576111d861310f565b905060400201602001358382815181106111f4576111f461310f565b6020026020010151602001511015611238576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101611115565b505050505050505050565b80156113cd576040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301523060248301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063f7888aec90604401602060405180830381865afa1580156112e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130c919061323e565b6040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301523060248301528581166044830152606482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063f18d03cc90608401600060405180830381600087803b1580156113af57600080fd5b505af11580156113c3573d6000803e3d6000fd5b5050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff84161561148b576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260019073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190602401602060405180830381865afa158015611458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147c919061323e565b6114869190613476565b61148d565b475b905073ffffffffffffffffffffffffffffffffffffffff8416156114d1576114cc73ffffffffffffffffffffffffffffffffffffffff8516848361284f565b6114f1565b6114f173ffffffffffffffffffffffffffffffffffffffff8416826129b8565b505b505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611585573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a9919061323e565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561163457600080fd5b505af1158015611648573d6000803e3d6000fd5b5061166d9250505073ffffffffffffffffffffffffffffffffffffffff8316826129b8565b5050565b600061169d6116866080840160608501612ee4565b6116966060850160408601612ee4565b84356125df565b6107556060830160408401612ee4565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90604401602060405180830381865afa15801561173f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611763919061323e565b101561048c5761048c868686868686610f76565b60608167ffffffffffffffff811115611792576117926132ca565b6040519080825280602002602001820160405280156117c557816020015b60608152602001906001900390816117b05790505b50905060005b828110156118e057600080308686858181106117e9576117e961310f565b90506020028101906117fb919061317c565b60405161180992919061348d565b600060405180830381855af49150503d8060008114611844576040519150601f19603f3d011682016040523d82523d6000602084013e611849565b606091505b5091509150816118b85760448151101561186257600080fd5b6004810190508080602001905181019061187c919061349d565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118af919061354f565b60405180910390fd5b808484815181106118cb576118cb61310f565b602090810291909101015250506001016117cb565b5092915050565b60006118f382806130a7565b9050905060005b81811015611c6c5761190c83806130a7565b8281811061191c5761191c61310f565b905060200281019061192e9190613562565b61193f9060608101906040016132ad565b156119f8576119f361195184806130a7565b838181106119615761196161310f565b90506020028101906119739190613562565b611981906020810190612ee4565b61198b85806130a7565b8481811061199b5761199b61310f565b90506020028101906119ad9190613562565b6119be906040810190602001612ee4565b6119c886806130a7565b858181106119d8576119d861310f565b90506020028101906119ea9190613562565b606001356125df565b611b71565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663f18d03cc611a3e85806130a7565b84818110611a4e57611a4e61310f565b9050602002810190611a609190613562565b611a6e906020810190612ee4565b33611a7987806130a7565b86818110611a8957611a8961310f565b9050602002810190611a9b9190613562565b611aac906040810190602001612ee4565b611ab688806130a7565b87818110611ac657611ac661310f565b9050602002810190611ad89190613562565b60405160e086901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff94851660048201529284166024840152921660448201526060909101356064820152608401600060405180830381600087803b158015611b5857600080fd5b505af1158015611b6c573d6000803e3d6000fd5b505050505b611b7b83806130a7565b82818110611b8b57611b8b61310f565b9050602002810190611b9d9190613562565b611bae906040810190602001612ee4565b73ffffffffffffffffffffffffffffffffffffffff1663627dd56a611bd385806130a7565b84818110611be357611be361310f565b9050602002810190611bf59190613562565b611c0390608081019061317c565b6040518363ffffffff1660e01b8152600401611c2092919061322a565b6020604051808303816000875af1158015611c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c63919061323e565b506001016118fa565b50611c7a60208301836130a7565b9050905060005b8181101561206357600073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663f7888aec611cd460208701876130a7565b85818110611ce457611ce461310f565b9050602002810190611cf69190613596565b611d04906020810190612ee4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152306024820152604401602060405180830381865afa158015611d73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d97919061323e565b90506000611da76008600a6136ec565b611db460208701876130a7565b85818110611dc457611dc461310f565b9050602002810190611dd69190613596565b611de79060608101906040016136fb565b611dfb9067ffffffffffffffff1684613725565b611e059190613762565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663f18d03cc611e5060208801886130a7565b86818110611e6057611e6061310f565b9050602002810190611e729190613596565b611e80906020810190612ee4565b30611e8e60208a018a6130a7565b88818110611e9e57611e9e61310f565b9050602002810190611eb09190613596565b611ec1906040810190602001612ee4565b60405160e085901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff93841660048201529183166024830152909116604482015260648101849052608401600060405180830381600087803b158015611f3e57600080fd5b505af1158015611f52573d6000803e3d6000fd5b50611f649250505060208601866130a7565b84818110611f7457611f7461310f565b9050602002810190611f869190613596565b611f97906040810190602001612ee4565b73ffffffffffffffffffffffffffffffffffffffff1663627dd56a611fbf60208801886130a7565b86818110611fcf57611fcf61310f565b9050602002810190611fe19190613596565b611fef90606081019061317c565b6040518363ffffffff1660e01b815260040161200c92919061322a565b6020604051808303816000875af115801561202b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204f919061323e565b50505061205c8160010190565b9050611c81565b50612071604083018361379d565b9050905060005b818110156114f357600073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663f7888aec6120cb604087018761379d565b858181106120db576120db61310f565b6120f19260206080909202019081019150612ee4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152306024820152604401602060405180830381865afa158015612160573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612184919061323e565b9050612193604085018561379d565b838181106121a3576121a361310f565b905060800201606001358110156121e6576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121f3604085018561379d565b838181106122035761220361310f565b905060800201604001602081019061221b91906132ad565b156123785773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166397da6d30612269604087018761379d565b858181106122795761227961310f565b61228f9260206080909202019081019150612ee4565b3061229d604089018961379d565b878181106122ad576122ad61310f565b90506080020160200160208101906122c59190612ee4565b60405160e085901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff938416600482015291831660248301529091166044820152600060648201526084810184905260a40160408051808303816000875af115801561234d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123719190613805565b50506124b3565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663f18d03cc6123c1604087018761379d565b858181106123d1576123d161310f565b6123e79260206080909202019081019150612ee4565b306123f5604089018961379d565b878181106124055761240561310f565b905060800201602001602081019061241d9190612ee4565b60405160e085901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff93841660048201529183166024830152909116604482015260648101849052608401600060405180830381600087803b15801561249a57600080fd5b505af11580156124ae573d6000803e3d6000fd5b505050505b50600101612078565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152859073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90604401602060405180830381865afa15801561252e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612552919061323e565b101561048c5761048c8686868686865b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff87169063d505accf9060e401610ff7565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116906302b9446c9085161561262c57600061262e565b825b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff808816600483015233602483015286166044820152606481018590526000608482015260a401604080518083038185885af11580156126b2573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126d79190613805565b5050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161277d9190613829565b6000604051808303816000865af19150503d80600081146127ba576040519150601f19603f3d011682016040523d82523d6000602084013e6127bf565b606091505b50915091508180156127e95750805115806127e95750808060200190518101906127e9919061383b565b61048c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f535446000000000000000000000000000000000000000000000000000000000060448201526064016118af565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916128e69190613829565b6000604051808303816000865af19150503d8060008114612923576040519150601f19603f3d011682016040523d82523d6000602084013e612928565b606091505b5091509150818015612952575080511580612952575080806020019051810190612952919061383b565b6126d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f535400000000000000000000000000000000000000000000000000000000000060448201526064016118af565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516129ef9190613829565b60006040518083038185875af1925050503d8060008114612a2c576040519150601f19603f3d011682016040523d82523d6000602084013e612a31565b606091505b50509050806114f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f535445000000000000000000000000000000000000000000000000000000000060448201526064016118af565b73ffffffffffffffffffffffffffffffffffffffff81168114612abe57600080fd5b50565b803561081d81612a9c565b60008060408385031215612adf57600080fd5b8235612aea81612a9c565b946020939093013593505050565b600060208284031215612b0a57600080fd5b813567ffffffffffffffff811115612b2157600080fd5b820160808185031215612b3357600080fd5b9392505050565b600060208284031215612b4c57600080fd5b813567ffffffffffffffff811115612b6357600080fd5b820160a08185031215612b3357600080fd5b60008083601f840112612b8757600080fd5b50813567ffffffffffffffff811115612b9f57600080fd5b602083019150836020828501011115612bb757600080fd5b9250929050565b600080600080600060808688031215612bd657600080fd5b8535612be181612a9c565b945060208601359350604086013567ffffffffffffffff811115612c0457600080fd5b612c1088828901612b75565b96999598509660600135949350505050565b600080600060408486031215612c3757600080fd5b8335612c4281612a9c565b9250602084013567ffffffffffffffff811115612c5e57600080fd5b612c6a86828701612b75565b9497909650939450505050565b60008060008060008060808789031215612c9057600080fd5b863567ffffffffffffffff80821115612ca857600080fd5b818901915089601f830112612cbc57600080fd5b813581811115612ccb57600080fd5b8a6020606083028501011115612ce057600080fd5b60208301985080975050612cf660208a01612ac1565b9550604089013594506060890135915080821115612d1357600080fd5b50612d2089828a01612b75565b979a9699509497509295939492505050565b803560ff8116811461081d57600080fd5b600080600060608486031215612d5857600080fd5b612d6184612d32565b95602085013595506040909401359392505050565b60008060008060008060c08789031215612d8f57600080fd5b8635612d9a81612a9c565b95506020870135945060408701359350612db660608801612d32565b92506080870135915060a087013590509295509295509295565b60008060008060008060808789031215612de957600080fd5b8635612df481612a9c565b955060208701359450604087013567ffffffffffffffff80821115612e1857600080fd5b612e248a838b01612b75565b90965094506060890135915080821115612e3d57600080fd5b818901915089601f830112612e5157600080fd5b813581811115612e6057600080fd5b8a60208260061b8501011115612e7557600080fd5b6020830194508093505050509295509295509295565b8015158114612abe57600080fd5b600080600060608486031215612eae57600080fd5b8335612eb981612a9c565b92506020840135612ec981612a9c565b91506040840135612ed981612e8b565b809150509250925092565b600060208284031215612ef657600080fd5b8135612b3381612a9c565b60008060208385031215612f1457600080fd5b823567ffffffffffffffff80821115612f2c57600080fd5b818501915085601f830112612f4057600080fd5b813581811115612f4f57600080fd5b8660208260051b8501011115612f6457600080fd5b60209290920196919550909350505050565b60005b83811015612f91578181015183820152602001612f79565b838111156114f15750506000910152565b60008151808452612fba816020860160208601612f76565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561305f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261304d858351612fa2565b94509285019290850190600101613013565b5092979650505050505050565b60006020828403121561307e57600080fd5b813567ffffffffffffffff81111561309557600080fd5b820160608185031215612b3357600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126130dc57600080fd5b83018035915067ffffffffffffffff8211156130f757600080fd5b6020019150600581901b3603821315612bb757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261317257600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126131b157600080fd5b83018035915067ffffffffffffffff8211156131cc57600080fd5b602001915036819003821315612bb757600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6020815260006109d66020830184866131e1565b60006020828403121561325057600080fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff841681526040602082015260006132876040830184866131e1565b95945050505050565b6000602082840312156132a257600080fd5b8151612b3381612a9c565b6000602082840312156132bf57600080fd5b8135612b3381612e8b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561331c5761331c6132ca565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613369576133696132ca565b604052919050565b6000602080838503121561338457600080fd5b825167ffffffffffffffff8082111561339c57600080fd5b818501915085601f8301126133b057600080fd5b8151818111156133c2576133c26132ca565b6133d0848260051b01613322565b818152848101925060069190911b8301840190878211156133f057600080fd5b928401925b8184101561343c576040848903121561340e5760008081fd5b6134166132f9565b845161342181612a9c565b815284860151868201528352604090930192918401916133f5565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561348857613488613447565b500390565b8183823760009101908152919050565b6000602082840312156134af57600080fd5b815167ffffffffffffffff808211156134c757600080fd5b818401915084601f8301126134db57600080fd5b8151818111156134ed576134ed6132ca565b61351e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613322565b915080825285602082850101111561353557600080fd5b613546816020840160208601612f76565b50949350505050565b602081526000612b336020830184612fa2565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261317257600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261317257600080fd5b600181815b8085111561362357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561360957613609613447565b8085161561361657918102915b93841c93908002906135cf565b509250929050565b60008261363a575060016136e6565b81613647575060006136e6565b816001811461365d576002811461366757613683565b60019150506136e6565b60ff84111561367857613678613447565b50506001821b6136e6565b5060208310610133831016604e8410600b84101617156136a6575081810a6136e6565b6136b083836135ca565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156136e2576136e2613447565b0290505b92915050565b6000612b3360ff84168361362b565b60006020828403121561370d57600080fd5b813567ffffffffffffffff81168114612b3357600080fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561375d5761375d613447565b500290565b600082613798577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126137d257600080fd5b83018035915067ffffffffffffffff8211156137ed57600080fd5b6020019150600781901b3603821315612bb757600080fd5b6000806040838503121561381857600080fd5b505080516020909101519092909150565b60008251613172818460208701612f76565b60006020828403121561384d57600080fd5b8151612b3381612e8b56fea26469706673582212200415ef60859319d7d187c25545410ef4faa3bb09dcd795c90e34fd5d95f1b99e64736f6c634300080a00330000000000000000000000000319000133d3ada02600f0875d2cf03d442c33670000000000000000000000002f28678432edf5243955054cc04a32b18ca63c970000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000319000133d3ada02600f0875d2cf03d442c33670000000000000000000000002f28678432edf5243955054cc04a32b18ca63c970000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Decoded View---------------
Arg [0] : _bento (address): 0x0319000133d3ada02600f0875d2cf03d442c3367
Arg [1] : _masterDeployer (address): 0x2f28678432edf5243955054cc04a32b18ca63c97
Arg [2] : _wETH (address): 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000319000133d3ada02600f0875d2cf03d442c3367
Arg [1] : 0000000000000000000000002f28678432edf5243955054cc04a32b18ca63c97
Arg [2] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.