UniV2ExpectedOutCalculator

Description:

Proxy contract enabling upgradeable smart contract patterns. Delegates calls to an implementation contract.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "src/deps/milkman/pricecheckers/UniV2ExpectedOutCalculator.sol": {
      "content": "// SPDX-License-Identifier: LGPL-3.0-or-later 
pragma solidity 0.8.28;

import { IExpectedOutCalculator } from "src/interfaces/deps/milkman/IExpectedOutCalculator.sol";
import { IUniV2 } from "src/interfaces/deps/milkman/IUniV2.sol";

/// @notice Expected output calculator that routes through a Uniswap V2 style router (SushiSwap).
/// @dev Mirrors Milkman's implementation with updated pragma and without SafeMath.
contract UniV2ExpectedOutCalculator is IExpectedOutCalculator {
    address internal constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    string public NAME;
    address public immutable UNIV2_ROUTER;

    constructor(string memory name_, address univ2Router) {
        NAME = name_;
        UNIV2_ROUTER = univ2Router;
    }

    function getExpectedOut(uint256 amountIn, address fromToken, address toToken, bytes calldata)
        external
        view
        override
        returns (uint256)
    {
        address[] memory path;

        if (fromToken == WETH || toToken == WETH) {
            path = new address[](2);
            path[0] = fromToken;
            path[1] = toToken;
        } else {
            path = new address[](3);
            path[0] = fromToken;
            path[1] = WETH;
            path[2] = toToken;
        }

        uint256[] memory amounts = IUniV2(UNIV2_ROUTER).getAmountsOut(amountIn, path);
        return amounts[amounts.length - 1];
    }
}
"
    },
    "src/interfaces/deps/milkman/IExpectedOutCalculator.sol": {
      "content": "// SPDX-License-Identifier: LGPL-3.0-or-later
pragma solidity 0.8.28;

interface IExpectedOutCalculator {
    function getExpectedOut(uint256 amountIn, address fromToken, address toToken, bytes calldata data)
        external
        view
        returns (uint256);
}
"
    },
    "src/interfaces/deps/milkman/IUniV2.sol": {
      "content": "// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;

interface IUniV2 {
    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);
}
"
    }
  },
  "settings": {
    "remappings": [
      "@openzeppelin/contracts/=dependencies/@openzeppelin-contracts-5.1.0/",
      "@openzeppelin-upgradeable/contracts/=dependencies/@openzeppelin-contracts-upgradeable-5.1.0/",
      "@openzeppelin/contracts-upgradeable/=dependencies/@openzeppelin-contracts-upgradeable-5.1.0/",
      "clones-with-immutable-args/=dependencies/clones-with-immutable-args-1.1.1/src/",
      "create3-factory/=dependencies/lifinance-create3-factory-0/",
      "euler-price-oracle/=dependencies/euler-price-oracle-1/",
      "forge-std/=dependencies/forge-std-1.9.6/src/",
      "milkman/=dependencies/milkman-1/",
      "token-plugins-upgradeable/=dependencies/token-plugins-upgradeable-1/",
      "@1inch/solidity-utils/=dependencies/solidity-utils-5.3.0/",
      "@1inch/farming/=dependencies/farming-3.2.0/",
      "@1inch/token-plugins/=dependencies/token-plugins-upgradeable-1/",
      "forge-deploy/=dependencies/forge-deploy-1/contracts/",
      "forge-safe/=dependencies/forge-safe-1/src/",
      "@solady/=dependencies/solady-0.1.17/src/",
      "dependencies/tokenized-strategy-3.0.4/:@openzeppelin/=dependencies/tokenized-strategy-3.0.4/lib/openzeppelin-contracts/",
      "@openzeppelin-contracts-5.1.0/=dependencies/@openzeppelin-contracts-5.1.0/",
      "@openzeppelin-contracts-upgradeable-5.1.0/=dependencies/@openzeppelin-contracts-upgradeable-5.1.0/",
      "clones-with-immutable-args-1.1.1/=dependencies/clones-with-immutable-args-1.1.1/",
      "euler-price-oracle-1/=dependencies/euler-price-oracle-1/",
      "farming-3.2.0/=dependencies/farming-3.2.0/",
      "forge-deploy-1/=dependencies/forge-deploy-1/",
      "forge-safe-1/=dependencies/forge-safe-1/",
      "forge-std-1.9.6/=dependencies/forge-std-1.9.6/",
      "lifinance/create3-factory-0/=dependencies/lifinance-create3-factory-0/",
      "milkman-1/=dependencies/milkman-1/",
      "solady-0.1.17/=dependencies/solady-0.1.17/",
      "solidity-utils-5.3.0/=dependencies/solidity-utils-5.3.0/",
      "token-plugins-upgradeable-1/=dependencies/token-plugins-upgradeable-1/",
      "tokenized-strategy-3.0.4/=dependencies/tokenized-strategy-3.0.4/",
      "@balancer/=dependencies/milkman-1/lib/balancer-v2-monorepo/contracts/",
      "@cow-protocol/=dependencies/milkman-1/lib/contracts/src/",
      "@pendle/core-v2/=dependencies/euler-price-oracle-1/dependencies/pendle-core-v2-public-1.0.0/contracts/",
      "@pyth/=dependencies/euler-price-oracle-1/dependencies/@pythnetwork-pyth-sdk-solidity-4.1.0/",
      "@pythnetwork-pyth-sdk-solidity-4.1.0/=dependencies/euler-price-oracle-1/dependencies/@pythnetwork-pyth-sdk-solidity-4.1.0/",
      "@redstone-finance-evm-connector-0.8.0/=dependencies/euler-price-oracle-1/dependencies/@redstone-finance-evm-connector-0.8.0/contracts/",
      "@redstone/evm-connector/=dependencies/euler-price-oracle-1/dependencies/@redstone-finance-evm-connector-0.8.0/contracts/",
      "@uniswap/v3-core/=dependencies/euler-price-oracle-1/dependencies/@v3-core-1.0.1-solc-0.8/",
      "@uniswap/v3-periphery/=dependencies/euler-price-oracle-1/dependencies/@v3-periphery-1.4.2-solc-0.8/",
      "@v3-core-1.0.1-solc-0.8/=dependencies/euler-price-oracle-1/dependencies/@v3-core-1.0.1-solc-0.8/contracts/",
      "@v3-periphery-1.4.2-solc-0.8/=dependencies/euler-price-oracle-1/dependencies/@v3-periphery-1.4.2-solc-0.8/contracts/",
      "ds-test/=dependencies/clones-with-immutable-args-1.1.1/lib/ds-test/src/",
      "erc4626-tests/=dependencies/tokenized-strategy-3.0.4/lib/erc4626-tests/",
      "ethereum-vault-connector-1.0.1/=dependencies/euler-price-oracle-1/dependencies/ethereum-vault-connector-1.0.1/",
      "ethereum-vault-connector/=dependencies/euler-price-oracle-1/dependencies/ethereum-vault-connector-1.0.1/src/",
      "forge-deploy-proxy/=dependencies/forge-deploy-1/examples/basic/lib/forge-deploy-proxy/src/",
      "forge-std-1.9.2/=dependencies/euler-price-oracle-1/dependencies/forge-std-1.9.2/src/",
      "lifinance-create3-factory-0/=dependencies/lifinance-create3-factory-0/",
      "openzeppelin-contracts-4.9.6/=dependencies/euler-price-oracle-1/dependencies/openzeppelin-contracts-4.9.6/",
      "openzeppelin-contracts/=dependencies/tokenized-strategy-3.0.4/lib/openzeppelin-contracts/",
      "openzeppelin/=dependencies/tokenized-strategy-3.0.4/lib/openzeppelin-contracts/contracts/",
      "pendle-core-v2-public-1.0.0/=dependencies/euler-price-oracle-1/dependencies/pendle-core-v2-public-1.0.0/contracts/",
      "solady-0.0.178/=dependencies/euler-price-oracle-1/dependencies/solady-0.0.178/src/",
      "solidity-stringutils/=dependencies/forge-safe-1/lib/surl/lib/solidity-stringutils/",
      "solmate/=dependencies/lifinance-create3-factory-0/lib/solmate/src/",
      "surl/=dependencies/forge-safe-1/lib/surl/"
    ],
    "optimizer": {
      "enabled": true,
      "runs": 400
    },
    "metadata": {
      "useLiteralContent": false,
      "bytecodeHash": "ipfs",
      "appendCBOR": true
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "evmVersion": "prague",
    "viaIR": true
  }
}}

Tags:
Proxy, Upgradeable, Factory, Oracle|addr:0xebf5e92f75d079ba4bff172185ba737e6996a2e2|verified:true|block:23701902|tx:0xeffb70b793a79010c1da330daab7ce375690fd2fe2ce6c7588ece014544ead01|first_check:1761995432

Submitted on: 2025-11-01 12:10:32

Comments

Log in to comment.

No comments yet.