SirProxy

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/SirProxy.sol": {
      "content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {ISIR} from "core/interfaces/ISIR.sol";
import {IVault} from "core/interfaces/IVault.sol";
import {IERC20} from "core/interfaces/IWETH9.sol";
import {IAssistant} from "./interfaces/IAssistant.sol";
import {SirStructs} from "core/libraries/SirStructs.sol";
import {AddressClone} from "core/libraries/AddressClone.sol";

// Minimal interface to get VAULT from Assistant
interface IAssistantVault {
    function VAULT() external view returns (address);
}

/**
 * @title SirProxy
 * @dev This contract is designed for read-only operations
 */
contract SirProxy {
    ISIR public immutable SIR_TOKEN;
    IVault public immutable VAULT;
    IAssistant public immutable ASSISTANT;

    constructor(address _assistant) {
        ASSISTANT = IAssistant(_assistant);
        // Get VAULT address from Assistant (it has a public VAULT getter)
        VAULT = IVault(IAssistantVault(_assistant).VAULT());
        // Get SIR token address from Vault
        SIR_TOKEN = ISIR(payable(VAULT.SIR()));
    }

    /**
     * @notice Returns the name of the token
     * @return The name from the SIR token contract
     */
    function name() external view returns (string memory) {
        return "Proxy SIR for offchain operations";
    }

    /**
     * @notice Returns the symbol of the token
     * @return The symbol from the SIR token contract
     */
    function symbol() external view returns (string memory) {
        return SIR_TOKEN.symbol();
    }

    /**
     * @notice Returns the number of decimals the token uses
     * @return The decimals from the SIR token contract
     */
    function decimals() external view returns (uint8) {
        return SIR_TOKEN.decimals();
    }

    /**
     * @notice Returns the total supply of SIR tokens
     * @return The total supply from the SIR token contract
     */
    function totalSupply() external view returns (uint256) {
        return SIR_TOKEN.totalSupply();
    }

    /**
     * @notice Returns the aggregated SIR balance for an account from all sources
     * @dev Aggregates: current balance, staked (locked + unlocked), unclaimed rewards, pending contributor rewards, and equity from TEA/APE tokens
     * @param account The address to check the balance for
     * @return totalBalance The total aggregated SIR balance
     */
    function balanceOf(address account) external view returns (uint256 totalBalance) {
        // 1. Get current SIR token balance
        totalBalance = SIR_TOKEN.balanceOf(account);

        // 2. Get staked SIR (both unlocked and locked)
        (uint80 unlockedStake, uint80 lockedStake) = SIR_TOKEN.stakeOf(account);
        totalBalance += unlockedStake + lockedStake;

        // 3. Get unclaimed SIR rewards from LP positions across all vaults
        uint48 numberOfVaults = VAULT.numberOfVaults();
        for (uint48 vaultId = 1; vaultId <= numberOfVaults; vaultId++) {
            // Get unclaimed rewards for this vault
            uint80 unclaimedRewards = VAULT.unclaimedRewards(vaultId, account);
            totalBalance += unclaimedRewards;
        }

        // 4. Get pending contributor rewards
        uint80 contributorRewards = SIR_TOKEN.contributorUnclaimedSIR(account);
        totalBalance += contributorRewards;

        // 5. Get SIR equity from TEA and APE tokens
        totalBalance += _getSirEquityFromTeaAndApe(account, numberOfVaults);
    }

    /**
     * @notice Calculate SIR equity from TEA and APE token holdings
     * @dev Uses Assistant's quoteBurn to determine SIR value, wrapped in try-catch
     * @param account The account to check
     * @param numberOfVaults Total number of vaults to iterate through
     * @return sirEquity The total SIR equity from TEA and APE tokens
     */
    function _getSirEquityFromTeaAndApe(
        address account,
        uint48 numberOfVaults
    ) private view returns (uint256 sirEquity) {
        for (uint48 vaultId = 1; vaultId <= numberOfVaults; vaultId++) {
            // Get vault parameters
            SirStructs.VaultParameters memory vaultParams = VAULT.paramsById(vaultId);

            // Skip if collateral is not SIR
            if (vaultParams.collateralToken != address(SIR_TOKEN)) continue;

            // Get TEA balance and calculate SIR equity
            uint256 teaBalance = VAULT.balanceOf(account, vaultId);
            if (teaBalance > 0) {
                try ASSISTANT.quoteBurn(false, vaultParams, teaBalance) returns (uint144 collateralAmount) {
                    // Direct 1:1 since collateral is SIR
                    sirEquity += collateralAmount;
                } catch {
                    // If quoteBurn reverts, assume 0 SIR value
                }
            }

            // Get APE balance and calculate SIR equity
            address apeToken = AddressClone.getAddress(address(VAULT), vaultId);
            uint256 apeBalance = IERC20(apeToken).balanceOf(account);
            if (apeBalance > 0) {
                try ASSISTANT.quoteBurn(true, vaultParams, apeBalance) returns (uint144 collateralAmount) {
                    // Direct 1:1 since collateral is SIR
                    sirEquity += collateralAmount;
                } catch {
                    // If quoteBurn reverts, assume 0 SIR value
                }
            }
        }

        return sirEquity;
    }
}
"
    },
    "lib/Core/src/interfaces/ISIR.sol": {
      "content": "// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import {SirStructs} from "../libraries/SirStructs.sol";

interface ISIR {
    error AuctionIsNotOver();
    error BidTooLow();
    error InsufficientUnlockedStake();
    error InvalidSigner();
    error NewAuctionCannotStartYet();
    error NoAuction();
    error NoAuctionLot();
    error NoDividends();
    error NoFeesCollected();
    error NotTheAuctionWinner();
    error PRBMath_MulDiv_Overflow(uint256 x, uint256 y, uint256 denominator);
    error PermitDeadlineExpired();
    error TransferToStakingVaultNotPermitted();
    error TransferToZeroAddress();

    event Approval(address indexed owner, address indexed spender, uint256 amount);
    event AuctionStarted(address indexed token, uint256 feesToBeAuctioned);
    event AuctionedTokensSentToWinner(
        address indexed winner,
        address indexed beneficiary,
        address indexed token,
        uint256 reward
    );
    event BidReceived(address indexed bidder, address indexed token, uint96 previousBid, uint96 newBid);
    event DividendsClaimed(address indexed staker, uint96 amount);
    event DividendsPaid(uint96 amountETH, uint80 amountStakedSIR);
    event RewardsClaimed(address indexed contributor, uint256 indexed vaultId, uint80 rewards);
    event Staked(address indexed staker, uint80 amount);
    event Transfer(address indexed from, address indexed to, uint256 amount);
    event Unstaked(address indexed staker, uint80 amount);

    receive() external payable;

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function ISSUANCE_RATE() external pure returns (uint72);
    function LP_ISSUANCE_FIRST_3_YEARS() external pure returns (uint72);
    function STAKING_VAULT() external view returns (address);
    function SYSTEM_CONTROL() external view returns (address);
    function allowMinting(bool mintingOfSIRHalted_) external;
    function allowance(address, address) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function auctions(address token) external view returns (SirStructs.Auction memory);
    function balanceOf(address account) external view returns (uint256);
    function bid(address token, uint96 amount) external;
    function claim() external returns (uint96 dividends_);
    function collectFeesAndStartAuction(address token) external returns (uint256 totalFees);
    function contributorMint() external returns (uint80 rewards);
    function contributorMintAndStake() external returns (uint80 rewards);
    function contributorUnclaimedSIR(address contributor) external view returns (uint80);
    function decimals() external view returns (uint8);
    function getAuctionLot(address token, address beneficiary) external;
    function initialize(address vault_) external;
    function lperMint(uint256 vaultId) external returns (uint80 rewards);
    function lperMintAndStake(uint256 vaultId) external returns (uint80 rewards);
    function maxTotalSupply() external view returns (uint256);
    function name() external view returns (string memory);
    function nonces(address) external view returns (uint256);
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
    function stake(uint80 amount) external;
    function stakeOf(address staker) external view returns (uint80 unlockedStake, uint80 lockedStake);
    function supply() external view returns (uint256);
    function symbol() external view returns (string memory);
    function totalSupply() external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    function unclaimedDividends(address staker) external view returns (uint96);
    function unstake(uint80 amount) external;
    function unstakeAndClaim(uint80 amount) external returns (uint96 dividends_);
    function vault() external view returns (address);
}
"
    },
    "lib/Core/src/interfaces/IVault.sol": {
      "content": "// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import {SirStructs} from "../libraries/SirStructs.sol";

interface IVault {
    error AmountTooLow();
    error DeadlineExceeded();
    error ExcessiveDeposit();
    error InsufficientCollateralReceivedFromUniswap();
    error InsufficientDeposit();
    error LengthMismatch();
    error LeverageTierOutOfRange();
    error Locked();
    error NotAWETHVault();
    error NotAuthorized();
    error StringsInsufficientHexLength(uint256 value, uint256 length);
    error TEAMaxSupplyExceeded();
    error TransferToZeroAddress();
    error UnsafeRecipient();
    error VaultAlreadyInitialized();
    error VaultDoesNotExist();

    event ApprovalForAll(address indexed account, address indexed operator, bool approved);
    event ReservesChanged(uint48 indexed vaultId, bool isAPE, bool isMint, uint144 reserveLPers, uint144 reserveApes);
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] vaultIds,
        uint256[] amounts
    );
    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 amount
    );
    event URI(string value, uint256 indexed id);
    event VaultInitialized(
        address indexed debtToken,
        address indexed collateralToken,
        int8 indexed leverageTier,
        uint256 vaultId,
        address ape
    );
    event VaultNewTax(uint48 indexed vault, uint8 tax, uint16 cumulativeTax);

    function APE_IMPLEMENTATION() external view returns (address);
    function ORACLE() external view returns (address);
    function SIR() external view returns (address);
    function SYSTEM_CONTROL() external view returns (address);
    function TIMESTAMP_ISSUANCE_START() external view returns (uint40);
    function balanceOf(address account, uint256 vaultId) external view returns (uint256);
    function balanceOfBatch(
        address[] memory owners,
        uint256[] memory vaultIds
    ) external view returns (uint256[] memory balances_);
    function burn(
        bool isAPE,
        SirStructs.VaultParameters memory vaultParams,
        uint256 amount,
        uint40 deadline
    ) external returns (uint144);
    function claimSIR(uint256 vaultId, address lper) external returns (uint80);
    function cumulativeSIRPerTEA(uint256 vaultId) external view returns (uint176 cumulativeSIRPerTEAx96);
    function getReserves(
        SirStructs.VaultParameters memory vaultParams
    ) external view returns (SirStructs.Reserves memory);
    function initialize(SirStructs.VaultParameters memory vaultParams) external;
    function isApprovedForAll(address, address) external view returns (bool);
    function mint(
        bool isAPE,
        SirStructs.VaultParameters memory vaultParams,
        uint256 amountToDeposit,
        uint144 collateralToDepositMin,
        uint40 deadline
    ) external payable returns (uint256 amount);
    function numberOfVaults() external view returns (uint48);
    function paramsById(uint48 vaultId) external view returns (SirStructs.VaultParameters memory);
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory vaultIds,
        uint256[] memory amounts,
        bytes memory data
    ) external;
    function safeTransferFrom(address from, address to, uint256 vaultId, uint256 amount, bytes memory data) external;
    function setApprovalForAll(address operator, bool approved) external;
    function supportsInterface(bytes4 interfaceId) external pure returns (bool);
    function systemParams() external view returns (SirStructs.SystemParameters memory systemParams_);
    function totalReserves(address collateral) external view returns (uint256);
    function totalSupply(uint256 vaultId) external view returns (uint256);
    function unclaimedRewards(uint256 vaultId, address lper) external view returns (uint80);
    function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes memory data) external;
    function updateSystemState(uint16 baseFee, uint16 lpFee, bool mintingStopped) external;
    function updateVaults(
        uint48[] memory oldVaults,
        uint48[] memory newVaults,
        uint8[] memory newTaxes,
        uint16 cumulativeTax
    ) external;
    function uri(uint256 vaultId) external view returns (string memory);
    function vaultStates(
        SirStructs.VaultParameters memory vaultParams
    ) external view returns (SirStructs.VaultState memory);
    function vaultTax(uint48 vaultId) external view returns (uint8);
    function withdrawFees(address token) external returns (uint256 totalFeesToStakers);
    function withdrawToSaveSystem(address[] memory tokens, address to) external returns (uint256[] memory amounts);
}
"
    },
    "lib/Core/src/interfaces/IWETH9.sol": {
      "content": "// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;

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

/// @title Interface for WETH9
interface IWETH9 is IERC20 {
    /// @notice Deposit ether to get wrapped ether
    function deposit() external payable;

    /// @notice Withdraw wrapped ether to get ether
    function withdraw(uint256) external;
}
"
    },
    "src/interfaces/IAssistant.sol": {
      "content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {SirStructs} from "core/libraries/SirStructs.sol";

/** @notice Helper functions for SIR protocol
 */
interface IAssistant {
    error VaultCanBeCreated();

    enum VaultStatus {
        InvalidVault,
        NoUniswapPool,
        VaultCanBeCreated,
        VaultAlreadyExists
    }

    function getReserves(uint48[] calldata vaultIds) external view returns (SirStructs.Reserves[] memory reserves);

    function priceOfTEA(
        SirStructs.VaultParameters calldata vaultParams
    ) external view returns (uint256 num, uint256 den);

    function priceOfAPE(
        SirStructs.VaultParameters calldata vaultParams
    ) external view returns (uint256 num, uint256 den);

    function getVaultStatus(SirStructs.VaultParameters calldata vaultParams) external view returns (VaultStatus);

    function getAddressAPE(uint48 vaultId) external view returns (address);

    function quoteMint(
        bool isAPE,
        SirStructs.VaultParameters calldata vaultParams,
        uint144 amountCollateral
    ) external view returns (uint256 amountTokens);

    function quoteMintWithDebtToken(
        bool isAPE,
        SirStructs.VaultParameters calldata vaultParams,
        uint256 amountDebtToken
    ) external view returns (uint256 amountTokens, uint256 amountCollateral, uint256 amountCollateralIdeal);

    function quoteCollateralToDebtToken(
        address debtToken,
        address collateralToken,
        uint256 amountCollateral
    ) external view returns (uint256 amountDebtToken);

    function quoteBurn(
        bool isAPE,
        SirStructs.VaultParameters calldata vaultParams,
        uint256 amountTokens
    ) external view returns (uint144 amountCollateral);
}
"
    },
    "lib/Core/src/libraries/SirStructs.sol": {
      "content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library SirStructs {
    struct VaultIssuanceParams {
        uint8 tax; // (tax / type(uint8).max * 10%) of its fee revenue is directed to the Treasury.
        uint40 timestampLastUpdate; // timestamp of the last time cumulativeSIRPerTEAx96 was updated. 0 => use systemParams.timestampIssuanceStart instead
        uint176 cumulativeSIRPerTEAx96; // Q104.96, cumulative SIR minted by the vaultId per unit of TEA.
    }

    struct VaultParameters {
        address debtToken;
        address collateralToken;
        int8 leverageTier;
    }

    struct FeeStructure {
        uint16 fee; // Fee in basis points.
        uint16 feeNew; // New fee to replace fee if current time exceeds FEE_CHANGE_DELAY since timestampUpdate
        uint40 timestampUpdate; // Timestamp fee change was made. If 0, feeNew is not used.
    }

    struct SystemParameters {
        FeeStructure baseFee;
        FeeStructure lpFee;
        bool mintingStopped; // If true, no minting of TEA/APE
        /** Aggregated taxes for all vaults. Choice of uint16 type.
            For vault i, (tax_i / type(uint8).max)*10% is charged, where tax_i is of type uint8.
            They must satisfy the condition
                Σ_i (tax_i / type(uint8).max)^2 ≤ 0.1^2
            Under this constraint, cumulativeTax = Σ_i tax_i is maximized when all taxes are equal (tax_i = tax for all i) and
                tax = type(uint8).max / sqrt(Nvaults)
            Since the lowest non-zero value is tax=1, the maximum number of vaults with non-zero tax is
                Nvaults = type(uint8).max^2 < type(uint16).max
         */
        uint16 cumulativeTax;
    }

    /** Collateral owned by the apes and LPers in a vault
     */
    struct Reserves {
        uint144 reserveApes;
        uint144 reserveLPers;
        int64 tickPriceX42;
    }

    /** Data needed for recoverying the amount of collateral owned by the apes and LPers in a vault
     */
    struct VaultState {
        uint144 reserve; // reserve =  reserveApes + reserveLPers
        /** Price at the border of the power and saturation zone.
            Q21.42 - Fixed point number with 42 bits of precision after the comma.
            type(int64).max and type(int64).min are used to represent +∞ and -∞ respectively.
         */
        int64 tickPriceSatX42; // Saturation price in Q21.42 fixed point
        uint48 vaultId; // Allows the creation of approximately 281 trillion vaults
    }

    /** The sum of all amounts in Fees are equal to the amounts deposited by the user (in the case of a mint)
        or taken out by the user (in the case of a burn).
        collateralInOrWithdrawn: Amount of collateral deposited by the user (in the case of a mint) or taken out by the user (in the case of a burn).
        collateralFeeToStakers: Amount of collateral paid to the stakers.
        collateralFeeToLPers: Amount of collateral paid to the gentlemen.
        collateralFeeToProtocol: Amount of collateral paid to the protocol.
     */
    struct Fees {
        uint144 collateralInOrWithdrawn;
        uint144 collateralFeeToStakers;
        uint144 collateralFeeToLPers; // Sometimes all LPers and sometimes only protocol owned liquidity
    }

    struct StakingParams {
        uint80 stake; // Amount of staked SIR
        uint176 cumulativeETHPerSIRx80; // Cumulative ETH per SIR * 2^80
    }

    struct StakerParams {
        uint80 stake; // Total amount of staked SIR by the staker
        uint176 cumulativeETHPerSIRx80; // Cumulative ETH per SIR * 2^80 last time the user updated his balance of ETH dividends
        uint80 lockedStake; // Amount of stake that was locked at time 'tsLastUpdate'
        uint40 tsLastUpdate; // Timestamp of the last time the user staked or unstaked
    }

    struct Auction {
        address bidder; // Address of the bidder
        uint96 bid; // Amount of the bid
        uint40 startTime; // Auction start time
    }

    struct OracleState {
        int64 tickPriceX42; // Last stored price. Q21.42
        uint40 timeStampPrice; // Timestamp of the last stored price
        uint8 indexFeeTier; // Uniswap v3 fee tier currently being used as oracle
        uint8 indexFeeTierProbeNext; // Uniswap v3 fee tier to probe next
        uint40 timeStampFeeTier; // Timestamp of the last probed fee tier
        bool initialized; // Whether the oracle has been initialized
        UniswapFeeTier uniswapFeeTier; // Uniswap v3 fee tier currently being used as oracle
    }

    /**
     * Parameters of a Uniswap v3 tier.
     */
    struct UniswapFeeTier {
        uint24 fee;
        int24 tickSpacing;
    }
}
"
    },
    "lib/Core/src/libraries/AddressClone.sol": {
      "content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library AddressClone {
    /// @dev Hash of the `_CREATE3_PROXY_BYTECODE`.
    /// Equivalent to `keccak256(abi.encodePacked(hex"67363d3d37363d34f03d5260086018f3"))`.
    bytes32 private constant _CREATE3_PROXY_BYTECODE_HASH =
        0x21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f;

    function getAddress(address deployer, uint256 vaultId) internal pure returns (address clone) {
        /// @solidity memory-safe-assembly
        // solhint-disable-next-line no-inline-assembly
        assembly {
            // Cache the free memory pointer.
            let m := mload(0x40)
            // Store `address(this)`.
            mstore(0x00, deployer)
            // Store the prefix.
            mstore8(0x0b, 0xff)
            // Store the salt.
            mstore(0x20, vaultId)
            // Store the bytecode hash.
            mstore(0x40, _CREATE3_PROXY_BYTECODE_HASH)

            // Store the proxy's address.
            mstore(0x14, keccak256(0x0b, 0x55))
            // Restore the free memory pointer.
            mstore(0x40, m)
            // 0xd6 = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x01).
            // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex).
            mstore(0x00, 0xd694)
            // Nonce of the proxy contract (1).
            mstore8(0x34, 0x01)

            clone := and(keccak256(0x1e, 0x17), 0xffffffffffffffffffffffffffffffffffffffff)
        }
    }
}
"
    },
    "lib/Core/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": {
      "content": "// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

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

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

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

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

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

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

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

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}
"
    }
  },
  "settings": {
    "remappings": [
      "core/=lib/Core/src/",
      "v3-periphery/=lib/Core/lib/v3-periphery/contracts/",
      "v3-core/=lib/Core/lib/v3-core/contracts/",
      "v2-core/=lib/Core/lib/v2-core/contracts/",
      "solmate/=lib/solmate/src/",
      "openzeppelin/=lib/Core/lib/openzeppelin-contracts/contracts/",
      "@openzeppelin/=lib/Core/lib/openzeppelin-contracts/",
      "oz-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
      "@uniswap/lib/=lib/Core/lib/uniswap-lib/",
      "@uniswap/v3-core/=lib/Core/lib/v3-core/",
      "Core/=lib/Core/",
      "ERC1155-in-pure-yul/=lib/Core/lib/ERC1155-in-pure-yul/contracts/",
      "abdk-libraries-solidity/=lib/Core/lib/abdk-libraries-solidity/",
      "abdk/=lib/Core/lib/abdk-libraries-solidity/",
      "base64-sol/=lib/Core/lib/base64/",
      "base64/=lib/Core/lib/base64/",
      "canonical-weth/=lib/Core/lib/canonical-weth/contracts/",
      "clones-with-immutable-args/=lib/Core/lib/clones-with-immutable-args/src/",
      "ds-test/=lib/solmate/lib/ds-test/src/",
      "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
      "forge-std/=lib/forge-std/src/",
      "halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",
      "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
      "openzeppelin-contracts/=lib/Core/lib/openzeppelin-contracts/",
      "prb-math/=lib/Core/lib/prb-math/src/",
      "prb/=lib/Core/lib/prb-math/src/",
      "uniswap-lib/=lib/Core/lib/uniswap-lib/contracts/",
      "uniswap-openzeppelin/=lib/Core/lib/uniswap-openzeppelin/",
      "view-quoter-v3/=lib/view-quoter-v3/"
    ],
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "metadata": {
      "useLiteralContent": false,
      "bytecodeHash": "ipfs",
      "appendCBOR": true
    },
    "outputSelection": {
      "*": {
        "*": [
          "evm.bytecode",
          "evm.deployedBytecode",
          "devdoc",
          "userdoc",
          "metadata",
          "abi"
        ]
      }
    },
    "evmVersion": "cancun",
    "viaIR": false
  }
}}

Tags:
ERC20, ERC1155, ERC165, Proxy, Mintable, Burnable, Non-Fungible, Liquidity, Staking, Upgradeable, Factory, Oracle|addr:0xc046c450946e2d29703eb0299a32a647837f6d6c|verified:true|block:23497462|tx:0x2907a26c93c9d8e7424e16d41de2e6c6d98100c2f6872e7b31b039523b61707e|first_check:1759497037

Submitted on: 2025-10-03 15:10:38

Comments

Log in to comment.

No comments yet.