ETH Price: $2,940.40 (-0.92%)
 

More Info

Private Name Tags

Transaction Hash
Method
Block
From
To
Update Oracle228882462025-07-10 10:40:592 days ago1752144059IN
Angle Protocol: Transmuter
0 ETH0.000430933.4096859
Update Oracle228180442025-06-30 15:10:4712 days ago1751296247IN
Angle Protocol: Transmuter
0 ETH0.000843717.15811303
Update Oracle227701712025-06-23 22:40:5918 days ago1750718459IN
Angle Protocol: Transmuter
0 ETH0.0012995311.02531784
Update Oracle225997902025-05-31 2:40:4742 days ago1748659247IN
Angle Protocol: Transmuter
0 ETH0.000340222.88650867
Update Oracle224956972025-05-16 12:40:4757 days ago1747399247IN
Angle Protocol: Transmuter
0 ETH0.000540034.58171832
Update Oracle223386332025-04-24 11:40:5979 days ago1745494859IN
Angle Protocol: Transmuter
0 ETH0.000429273.64198576
Update Oracle222783282025-04-16 1:40:4787 days ago1744767647IN
Angle Protocol: Transmuter
0 ETH0.000280452.37936
Update Oracle222361972025-04-10 4:40:5993 days ago1744260059IN
Angle Protocol: Transmuter
0 ETH0.000303472.40121204
Update Oracle221842752025-04-02 22:40:47100 days ago1743633647IN
Angle Protocol: Transmuter
0 ETH0.000479813.7964538
Update Oracle221051692025-03-22 21:40:47112 days ago1742679647IN
Angle Protocol: Transmuter
0 ETH0.000276882.34914156
Update Oracle220759102025-03-18 19:40:47116 days ago1742326847IN
Angle Protocol: Transmuter
0 ETH0.000316652.50546434
Update Oracle219828362025-03-05 19:40:47129 days ago1741203647IN
Angle Protocol: Transmuter
0 ETH0.000305872.59504336
Update Oracle219359402025-02-27 6:40:47135 days ago1740638447IN
Angle Protocol: Transmuter
0 ETH0.000345072.73031281
Update Oracle218670522025-02-17 15:40:47145 days ago1739806847IN
Angle Protocol: Transmuter
0 ETH0.0049169941.71614056
Update Oracle218432752025-02-14 7:40:59148 days ago1739518859IN
Angle Protocol: Transmuter
0 ETH0.000376052.97543115
Update Oracle217958852025-02-07 16:40:47155 days ago1738946447IN
Angle Protocol: Transmuter
0 ETH0.000370993.14755154
Update Oracle217483082025-02-01 1:12:47161 days ago1738372367IN
Angle Protocol: Transmuter
0 ETH0.000403663.42469332
Update Oracle217483062025-02-01 1:12:23161 days ago1738372343IN
Angle Protocol: Transmuter
0 ETH0.000445723.52668932
Update Oracle216666122025-01-20 15:30:59173 days ago1737387059IN
Angle Protocol: Transmuter
0 ETH0.0046060439.07800218
Update Oracle215911592025-01-10 2:40:47183 days ago1736476847IN
Angle Protocol: Transmuter
0 ETH0.000737045.83168067
Update Oracle215559562025-01-05 4:40:59188 days ago1736052059IN
Angle Protocol: Transmuter
0 ETH0.000994987.87258674
Update Oracle215550592025-01-05 1:40:47188 days ago1736041247IN
Angle Protocol: Transmuter
0 ETH0.000860887.30376987
Update Oracle213386952024-12-05 20:30:59219 days ago1733430659IN
Angle Protocol: Transmuter
0 ETH0.0037142228.61236032
Update Oracle212872202024-11-28 15:54:11226 days ago1732809251IN
Angle Protocol: Transmuter
0 ETH0.0021531718.2676525
Update Oracle212368882024-11-21 15:05:47233 days ago1732201547IN
Angle Protocol: Transmuter
0 ETH0.0039802230.66146636
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x60806040178697562023-08-08 10:57:59704 days ago1691492279  Contract Creation0 ETH

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DiamondProxy

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 1000 runs

Other Settings:
paris EvmVersion, None license
File 1 of 13 : DiamondProxy.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

import { LibDiamond } from "./libraries/LibDiamond.sol";
import { LibStorage as s } from "./libraries/LibStorage.sol";

import "../utils/Errors.sol";
import "./Storage.sol";

/// @title DiamondProxy
/// @author Angle Labs, Inc.
/// @notice Implementation of a Diamond Proxy
/// @dev Reference: EIP-2535 Diamonds
/// @dev Forked from https://github.com/mudgen/diamond-3/blob/master/contracts/Diamond.sol by mudgen
contract DiamondProxy {
    constructor(FacetCut[] memory _diamondCut, address _init, bytes memory _calldata) payable {
        LibDiamond.diamondCut(_diamondCut, _init, _calldata);
    }

    /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                       FALLBACK                                                     
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    /// @dev 1. Find the facet for the function that is called.
    /// @dev 2. Delegate the execution to the found facet via `delegatecall`.
    fallback() external payable {
        DiamondStorage storage ds = s.diamondStorage();
        // Get facet from function selector
        address facetAddress = ds.selectorInfo[msg.sig].facetAddress;
        if (facetAddress == address(0)) {
            revert FunctionNotFound(msg.sig);
        }

        assembly {
            // The pointer to the free memory slot
            let ptr := mload(0x40)
            // Copy function signature and arguments from calldata at zero position into memory at pointer position
            calldatacopy(ptr, 0, calldatasize())
            // Delegatecall method of the implementation contract returns 0 on error
            let result := delegatecall(gas(), facetAddress, ptr, calldatasize(), 0, 0)
            // Get the size of the last return data
            let size := returndatasize()
            // Copy the size length of bytes from return data at zero position to pointer position
            returndatacopy(ptr, 0, size)
            // Depending on the result value
            switch result
            case 0 {
                // End execution and revert state changes
                revert(ptr, size)
            }
            default {
                // Return data with length of size at pointers position
                return(ptr, size)
            }
        }
    }
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import { LibStorage as s } from "./LibStorage.sol";

import "../../utils/Errors.sol";
import "../Storage.sol";

/// @title LibDiamond
/// @author Angle Labs, Inc.
/// @notice Helper library to deal with diamond proxies.
/// @dev Reference: EIP-2535 Diamonds
/// @dev Forked from https://github.com/mudgen/diamond-3/blob/master/contracts/libraries/LibDiamond.sol by mudgen
library LibDiamond {
    event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);

    /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                  INTERNAL FUNCTIONS                                                
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    /// @notice Checks whether `admin` has the governor role
    function isGovernor(address admin) internal view returns (bool) {
        return s.diamondStorage().accessControlManager.isGovernor(admin);
    }

    /// @notice Checks whether `admin` has the guardian role
    function isGovernorOrGuardian(address admin) internal view returns (bool) {
        return s.diamondStorage().accessControlManager.isGovernorOrGuardian(admin);
    }

    /// @notice Internal function version of `diamondCut`
    function diamondCut(FacetCut[] memory _diamondCut, address _init, bytes memory _calldata) internal {
        uint256 diamondCutLength = _diamondCut.length;
        for (uint256 facetIndex; facetIndex < diamondCutLength; facetIndex++) {
            bytes4[] memory functionSelectors = _diamondCut[facetIndex].functionSelectors;
            address facetAddress = _diamondCut[facetIndex].facetAddress;

            if (functionSelectors.length == 0) {
                revert NoSelectorsProvidedForFacetForCut(facetAddress);
            }

            FacetCutAction action = _diamondCut[facetIndex].action;
            if (action == FacetCutAction.Add) {
                _addFunctions(facetAddress, functionSelectors);
            } else if (action == FacetCutAction.Replace) {
                _replaceFunctions(facetAddress, functionSelectors);
            } else if (action == FacetCutAction.Remove) {
                _removeFunctions(facetAddress, functionSelectors);
            }
        }

        emit DiamondCut(_diamondCut, _init, _calldata);
        _initializeDiamondCut(_init, _calldata);
    }

    /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                   PRIVATE FUNCTIONS                                                
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    /// @notice Does a delegate call on `_init` with `_calldata`
    function _initializeDiamondCut(address _init, bytes memory _calldata) private {
        if (_init == address(0)) {
            return;
        }
        _enforceHasContractCode(_init);
        (bool success, bytes memory error) = _init.delegatecall(_calldata);
        if (!success) {
            if (error.length > 0) {
                assembly {
                    let returndata_size := mload(error)
                    revert(add(32, error), returndata_size)
                }
            } else {
                revert InitializationFunctionReverted(_init, _calldata);
            }
        }
    }

    /// @notice Adds a new function to the diamond proxy
    /// @dev Reverts if selectors are already existing
    function _addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) private {
        if (_facetAddress == address(0)) {
            revert CannotAddSelectorsToZeroAddress(_functionSelectors);
        }
        DiamondStorage storage ds = s.diamondStorage();
        uint16 selectorCount = uint16(ds.selectors.length);
        _enforceHasContractCode(_facetAddress);
        uint256 functionSelectorsLength = _functionSelectors.length;
        for (uint256 selectorIndex; selectorIndex < functionSelectorsLength; selectorIndex++) {
            bytes4 selector = _functionSelectors[selectorIndex];
            address oldFacetAddress = ds.selectorInfo[selector].facetAddress;
            if (oldFacetAddress != address(0)) {
                revert CannotAddFunctionToDiamondThatAlreadyExists(selector);
            }
            ds.selectorInfo[selector] = FacetInfo(_facetAddress, selectorCount);
            ds.selectors.push(selector);
            selectorCount++;
        }
    }

    /// @notice Upgrades a function in the diamond proxy
    /// @dev Reverts if selectors do not already exist
    function _replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) private {
        DiamondStorage storage ds = s.diamondStorage();
        if (_facetAddress == address(0)) {
            revert CannotReplaceFunctionsFromFacetWithZeroAddress(_functionSelectors);
        }
        _enforceHasContractCode(_facetAddress);
        uint256 functionSelectorsLength = _functionSelectors.length;
        for (uint256 selectorIndex; selectorIndex < functionSelectorsLength; selectorIndex++) {
            bytes4 selector = _functionSelectors[selectorIndex];
            address oldFacetAddress = ds.selectorInfo[selector].facetAddress;
            // Can't replace immutable functions -- functions defined directly in the diamond in this case
            if (oldFacetAddress == address(this)) {
                revert CannotReplaceImmutableFunction(selector);
            }
            if (oldFacetAddress == _facetAddress) {
                revert CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet(selector);
            }
            if (oldFacetAddress == address(0)) {
                revert CannotReplaceFunctionThatDoesNotExists(selector);
            }
            // Replace old facet address
            ds.selectorInfo[selector].facetAddress = _facetAddress;
        }
    }

    /// @notice Removes a function in the diamond proxy
    /// @dev Reverts if selectors do not already exist
    function _removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) private {
        DiamondStorage storage ds = s.diamondStorage();
        uint256 selectorCount = ds.selectors.length;
        if (_facetAddress != address(0)) {
            revert RemoveFacetAddressMustBeZeroAddress(_facetAddress);
        }
        uint256 functionSelectorsLength = _functionSelectors.length;
        for (uint256 selectorIndex; selectorIndex < functionSelectorsLength; selectorIndex++) {
            bytes4 selector = _functionSelectors[selectorIndex];
            FacetInfo memory oldFacetAddressAndSelectorPosition = ds.selectorInfo[selector];
            if (oldFacetAddressAndSelectorPosition.facetAddress == address(0)) {
                revert CannotRemoveFunctionThatDoesNotExist(selector);
            }

            // Can't remove immutable functions -- functions defined directly in the diamond
            if (oldFacetAddressAndSelectorPosition.facetAddress == address(this)) {
                revert CannotRemoveImmutableFunction(selector);
            }
            // Replace selector with last selector
            selectorCount--;
            if (oldFacetAddressAndSelectorPosition.selectorPosition != selectorCount) {
                bytes4 lastSelector = ds.selectors[selectorCount];
                ds.selectors[oldFacetAddressAndSelectorPosition.selectorPosition] = lastSelector;
                ds.selectorInfo[lastSelector].selectorPosition = oldFacetAddressAndSelectorPosition.selectorPosition;
            }
            // Delete last selector
            ds.selectors.pop();
            delete ds.selectorInfo[selector];
        }
    }

    /// @notice Checks that an address has a non void bytecode
    function _enforceHasContractCode(address _contract) private view {
        uint256 contractSize;
        assembly {
            contractSize := extcodesize(_contract)
        }
        if (contractSize == 0) {
            revert ContractHasNoCode();
        }
    }
}

// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.19;

import "../../utils/Constants.sol";
import { DiamondStorage, ImplementationStorage, TransmuterStorage } from "../Storage.sol";

/// @title LibStorage
/// @author Angle Labs, Inc.
library LibStorage {
    /// @notice Returns the storage struct stored at the `DIAMOND_STORAGE_POSITION` slot
    /// @dev This struct handles the logic of the different facets used in the diamond proxy
    function diamondStorage() internal pure returns (DiamondStorage storage ds) {
        bytes32 position = DIAMOND_STORAGE_POSITION;
        assembly {
            ds.slot := position
        }
    }

    /// @notice Returns the storage struct stored at the `TRANSMUTER_STORAGE_POSITION` slot
    /// @dev This struct handles the particular logic of the Transmuter system
    function transmuterStorage() internal pure returns (TransmuterStorage storage ts) {
        bytes32 position = TRANSMUTER_STORAGE_POSITION;
        assembly {
            ts.slot := position
        }
    }

    /// @notice Returns the storage struct stored at the `IMPLEMENTATION_STORAGE_POSITION` slot
    /// @dev This struct handles the logic for making the contract easily usable on Etherscan
    function implementationStorage() internal pure returns (ImplementationStorage storage ims) {
        bytes32 position = IMPLEMENTATION_STORAGE_POSITION;
        assembly {
            ims.slot := position
        }
    }
}

File 4 of 13 : Errors.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.19;

error AlreadyAdded();
error CannotAddFunctionToDiamondThatAlreadyExists(bytes4 _selector);
error CannotAddSelectorsToZeroAddress(bytes4[] _selectors);
error CannotRemoveFunctionThatDoesNotExist(bytes4 _selector);
error CannotRemoveImmutableFunction(bytes4 _selector);
error CannotReplaceFunctionsFromFacetWithZeroAddress(bytes4[] _selectors);
error CannotReplaceFunctionThatDoesNotExists(bytes4 _selector);
error CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet(bytes4 _selector);
error CannotReplaceImmutableFunction(bytes4 _selector);
error ContractHasNoCode();
error FunctionNotFound(bytes4 _functionSelector);
error IncorrectFacetCutAction(uint8 _action);
error InitializationFunctionReverted(address _initializationContractAddress, bytes _calldata);
error InvalidChainlinkRate();
error InvalidLengths();
error InvalidNegativeFees();
error InvalidOracleType();
error InvalidParam();
error InvalidParams();
error InvalidRate();
error InvalidSwap();
error InvalidTokens();
error ManagerHasAssets();
error NoSelectorsProvidedForFacetForCut(address _facetAddress);
error NotAllowed();
error NotCollateral();
error NotGovernor();
error NotGovernorOrGuardian();
error NotTrusted();
error NotWhitelisted();
error OneInchSwapFailed();
error Paused();
error ReentrantCall();
error RemoveFacetAddressMustBeZeroAddress(address _facetAddress);
error TooBigAmountIn();
error TooLate();
error TooSmallAmountOut();
error ZeroAddress();
error ZeroAmount();

File 5 of 13 : Storage.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.19;

import { IERC20 } from "oz/token/ERC20/IERC20.sol";

import { IAccessControlManager } from "interfaces/IAccessControlManager.sol";
import { IAgToken } from "interfaces/IAgToken.sol";

/*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                        ENUMS                                                      
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

enum FacetCutAction {
    Add,
    Replace,
    Remove
}

enum ManagerType {
    EXTERNAL
}

enum ActionType {
    Mint,
    Burn,
    Redeem
}

enum TrustedType {
    Updater,
    Seller
}

enum QuoteType {
    MintExactInput,
    MintExactOutput,
    BurnExactInput,
    BurnExactOutput
}

enum OracleReadType {
    CHAINLINK_FEEDS,
    EXTERNAL,
    NO_ORACLE,
    STABLE,
    WSTETH,
    CBETH,
    RETH,
    SFRXETH,
    PYTH
}

enum OracleQuoteType {
    UNIT,
    TARGET
}

enum WhitelistType {
    BACKED
}

/*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                    STRUCTS                                                     
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

struct Permit2Details {
    address to;                                  // Address that will receive the funds
    uint256 nonce;                               // Nonce of the transaction
    bytes signature;                             // Permit signature of the user
}       

struct FacetCut {
    address facetAddress;                        // Facet contract address
    FacetCutAction action;                       // Can be add, remove or replace
    bytes4[] functionSelectors;                  // Ex. bytes4(keccak256("transfer(address,uint256)"))
}

struct Facet {
    address facetAddress;                        // Facet contract address
    bytes4[] functionSelectors;                  // Ex. bytes4(keccak256("transfer(address,uint256)"))
}

struct FacetInfo {
    address facetAddress;                        // Facet contract address
    uint16 selectorPosition;                     // Position in the list of all selectors
}

struct DiamondStorage {
    bytes4[] selectors;                          // List of all available selectors
    mapping(bytes4 => FacetInfo) selectorInfo;   // Selector to (address, position in list)
    IAccessControlManager accessControlManager;  // Contract handling access control
}

struct ImplementationStorage {
    address implementation;                      // Dummy implementation address for Etherscan usability
}

struct ManagerStorage {
    IERC20[] subCollaterals;                     // Subtokens handled by the manager or strategies
    bytes config;                                // Additional configuration data
}

struct Collateral {
    uint8 isManaged;                             // If the collateral is managed through external strategies
    uint8 isMintLive;                            // If minting from this asset is unpaused
    uint8 isBurnLive;                            // If burning to this asset is unpaused
    uint8 decimals;                              // IERC20Metadata(collateral).decimals()
    uint8 onlyWhitelisted;                       // If only whitelisted addresses can burn or redeem for this token
    uint216 normalizedStables;                   // Normalized amount of stablecoins issued from this collateral
    uint64[] xFeeMint;                           // Increasing exposures in [0,BASE_9[
    int64[] yFeeMint;                            // Mint fees at the exposures specified in `xFeeMint`
    uint64[] xFeeBurn;                           // Decreasing exposures in ]0,BASE_9]
    int64[] yFeeBurn;                            // Burn fees at the exposures specified in `xFeeBurn`
    bytes oracleConfig;                          // Data about the oracle used for the collateral
    bytes whitelistData;                         // For whitelisted collateral, data used to verify whitelists
    ManagerStorage managerData;                  // For managed collateral, data used to handle the strategies
}

struct TransmuterStorage {
    IAgToken agToken;                            // agToken handled by the system
    uint8 isRedemptionLive;                      // If redemption is unpaused
    uint8 statusReentrant;                        // If call is reentrant or not
    uint128 normalizedStables;                   // Normalized amount of stablecoins issued by the system
    uint128 normalizer;                          // To reconcile `normalizedStables` values with the actual amount
    address[] collateralList;                    // List of collateral assets supported by the system
    uint64[] xRedemptionCurve;                   // Increasing collateral ratios > 0
    int64[] yRedemptionCurve;                    // Value of the redemption fees at `xRedemptionCurve`
    mapping(address => Collateral) collaterals;  // Maps a collateral asset to its parameters
    mapping(address => uint256) isTrusted;       // If an address is trusted to update the normalizer value
    mapping(address => uint256) isSellerTrusted; // If an address is trusted to sell accruing reward tokens
    mapping(WhitelistType => mapping(address => uint256)) isWhitelistedForType;
                                                 // Whether an address is whitelisted for a specific whitelist type
}

File 6 of 13 : Constants.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity >=0.5.0;

import { ICbETH } from "interfaces/external/coinbase/ICbETH.sol";
import { ISfrxETH } from "interfaces/external/frax/ISfrxETH.sol";
import { IStETH } from "interfaces/external/lido/IStETH.sol";
import { IRETH } from "interfaces/external/rocketPool/IRETH.sol";

/*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                 STORAGE SLOTS                                                  
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

/// @dev Storage position of `DiamondStorage` structure
/// @dev Equals `keccak256("diamond.standard.diamond.storage") - 1`
bytes32 constant DIAMOND_STORAGE_POSITION = 0xc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131b;

/// @dev Storage position of `TransmuterStorage` structure
/// @dev Equals `keccak256("diamond.standard.transmuter.storage") - 1`
bytes32 constant TRANSMUTER_STORAGE_POSITION = 0xc1f2f38dde3351ac0a64934139e816326caa800303a1235dc53707d0de05d8bd;

/// @dev Storage position of `ImplementationStorage` structure
/// @dev Equals `keccak256("eip1967.proxy.implementation") - 1`
bytes32 constant IMPLEMENTATION_STORAGE_POSITION = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

/*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                     MATHS                                                      
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

uint256 constant BASE_6 = 1e6;
uint256 constant BASE_8 = 1e8;
uint256 constant BASE_9 = 1e9;
uint256 constant BASE_12 = 1e12;
uint256 constant BASE_18 = 1e18;
uint256 constant HALF_BASE_27 = 1e27 / 2;
uint256 constant BASE_27 = 1e27;
uint256 constant BASE_36 = 1e36;
uint256 constant MAX_BURN_FEE = 999_000_000;
uint256 constant MAX_MINT_FEE = BASE_12 - 1;

/*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                     REENTRANT                                                      
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint8 constant NOT_ENTERED = 1;
uint8 constant ENTERED = 2;

/*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                               COMMON ADDRESSES                                                 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

address constant PERMIT_2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3;
address constant ONE_INCH_ROUTER = 0x1111111254EEB25477B68fb85Ed929f73A960582;
address constant AGEUR = 0x1a7e4e63778B4f12a199C062f3eFdD288afCBce8;
ICbETH constant CBETH = ICbETH(0xBe9895146f7AF43049ca1c1AE358B0541Ea49704);
IRETH constant RETH = IRETH(0xae78736Cd615f374D3085123A210448E74Fc6393);
IStETH constant STETH = IStETH(0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84);
ISfrxETH constant SFRXETH = ISfrxETH(0xac3E018457B222d93114458476f3E3416Abbe38F);

// 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);
}

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

/// @title IAccessControlManager
/// @author Angle Labs, Inc.
interface IAccessControlManager {
    /// @notice Checks whether an address is governor of the Angle Protocol or not
    /// @param admin Address to check
    /// @return Whether the address has the `GOVERNOR_ROLE` or not
    function isGovernor(address admin) external view returns (bool);

    /// @notice Checks whether an address is governor or a guardian of the Angle Protocol or not
    /// @param admin Address to check
    /// @return Whether the address has the `GUARDIAN_ROLE` or not
    /// @dev Governance should make sure when adding a governor to also give this governor the guardian
    /// role by calling the `addGovernor` function
    function isGovernorOrGuardian(address admin) external view returns (bool);
}

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

import { IERC20 } from "oz/token/ERC20/IERC20.sol";

/// @title IAgToken
/// @author Angle Labs, Inc.
/// @notice Interface for the stablecoins `AgToken` contracts
interface IAgToken is IERC20 {
    /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                              MINTER ROLE ONLY FUNCTIONS                                            
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    /// @notice Lets a whitelisted contract mint agTokens
    /// @param account Address to mint to
    /// @param amount Amount to mint
    function mint(address account, uint256 amount) external;

    /// @notice Burns `amount` tokens from a `burner` address after being asked to by `sender`
    /// @param amount Amount of tokens to burn
    /// @param burner Address to burn from
    /// @param sender Address which requested the burn from `burner`
    /// @dev This method is to be called by a contract with the minter right after being requested
    /// to do so by a `sender` address willing to burn tokens from another `burner` address
    /// @dev The method checks the allowance between the `sender` and the `burner`
    function burnFrom(uint256 amount, address burner, address sender) external;

    /// @notice Burns `amount` tokens from a `burner` address
    /// @param amount Amount of tokens to burn
    /// @param burner Address to burn from
    /// @dev This method is to be called by a contract with a minter right on the AgToken after being
    /// requested to do so by an address willing to burn tokens from its address
    function burnSelf(uint256 amount, address burner) external;

    /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                TREASURY ONLY FUNCTIONS                                             
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    /// @notice Adds a minter in the contract
    /// @param minter Minter address to add
    /// @dev Zero address checks are performed directly in the `Treasury` contract
    function addMinter(address minter) external;

    /// @notice Removes a minter from the contract
    /// @param minter Minter address to remove
    /// @dev This function can also be called by a minter wishing to revoke itself
    function removeMinter(address minter) external;

    /// @notice Sets a new treasury contract
    /// @param _treasury New treasury address
    function setTreasury(address _treasury) external;

    /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                  EXTERNAL FUNCTIONS                                                
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    /// @notice Checks whether an address has the right to mint agTokens
    /// @param minter Address for which the minting right should be checked
    /// @return Whether the address has the right to mint agTokens or not
    function isMinter(address minter) external view returns (bool);

    /// @notice Amount of decimals of the stablecoin
    function decimals() external view returns (uint8);
}

File 10 of 13 : ICbETH.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

/// @title ICbETH
/// @notice Interface for the `cbETH` contract
interface ICbETH {
    function exchangeRate() external view returns (uint256);
}

File 11 of 13 : ISfrxETH.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

/// @title ISfrxETH
/// @notice Interface for the `sfrxETH` contract
interface ISfrxETH {
    function pricePerShare() external view returns (uint256);
}

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

/// @title IStETH
/// @notice Interface for the `StETH` contract
interface IStETH {
    function getPooledEthByShares(uint256 _sharesAmount) external view returns (uint256);

    function submit(address) external payable returns (uint256);

    function getSharesByPooledEth(uint256 _ethAmount) external view returns (uint256);
}

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

/// @title IRETH
/// @notice Interface for the `rETH` contract
interface IRETH {
    function getExchangeRate() external view returns (uint256);
}

Settings
{
  "remappings": [
    "@chainlink/=lib/borrow-contracts/node_modules/@chainlink/",
    "@ensdomains/=node_modules/@ensdomains/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "@prb/test/=lib/prb-math/lib/prb-test/src/",
    "@uniswap/=lib/borrow-contracts/node_modules/@uniswap/",
    "borrow-contracts/=lib/borrow-contracts/",
    "borrow/=lib/borrow-contracts/contracts/",
    "contracts/=contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "interfaces/=contracts/interfaces/",
    "mock/=test/mock/",
    "oz-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/",
    "oz/=node_modules/@openzeppelin/contracts/",
    "prb-math/=lib/prb-math/src/",
    "prb/math/=lib/prb-math/src/",
    "solidity-stringutils/=lib/solidity-stringutils/src/",
    "src/=lib/prb-math/src/",
    "stringutils/=lib/solidity-stringutils/",
    "test/=test/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "metadata": {
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": true,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"internalType":"struct FacetCut[]","name":"_diamondCut","type":"tuple[]"},{"internalType":"address","name":"_init","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"CannotAddFunctionToDiamondThatAlreadyExists","type":"error"},{"inputs":[{"internalType":"bytes4[]","name":"_selectors","type":"bytes4[]"}],"name":"CannotAddSelectorsToZeroAddress","type":"error"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"CannotRemoveFunctionThatDoesNotExist","type":"error"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"CannotRemoveImmutableFunction","type":"error"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"CannotReplaceFunctionThatDoesNotExists","type":"error"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet","type":"error"},{"inputs":[{"internalType":"bytes4[]","name":"_selectors","type":"bytes4[]"}],"name":"CannotReplaceFunctionsFromFacetWithZeroAddress","type":"error"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"CannotReplaceImmutableFunction","type":"error"},{"inputs":[],"name":"ContractHasNoCode","type":"error"},{"inputs":[{"internalType":"bytes4","name":"_functionSelector","type":"bytes4"}],"name":"FunctionNotFound","type":"error"},{"inputs":[{"internalType":"address","name":"_initializationContractAddress","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"InitializationFunctionReverted","type":"error"},{"inputs":[{"internalType":"address","name":"_facetAddress","type":"address"}],"name":"NoSelectorsProvidedForFacetForCut","type":"error"},{"inputs":[{"internalType":"address","name":"_facetAddress","type":"address"}],"name":"RemoveFacetAddressMustBeZeroAddress","type":"error"},{"stateMutability":"payable","type":"fallback"}]

6080604052610de5803803806100148161021e565b928339606090818382810103126100da578251916001600160401b0383116100da57818401601f8486010112156100da578284015161005a61005582610243565b61021e565b93602085838152019084870160208460051b838a010101116100da57602081880101915b60208460051b838a01010183106100df5787878761009e6020840161025a565b6040840151939091906001600160401b0385116100da576100cc946100c692820191016102ac565b9161049e565b60405160f19081610cb48239f35b600080fd5b82516001600160401b0381116100da578289010185601f1982898c010301126100da5761010a6101db565b906101176020820161025a565b8252604081015160038110156100da57602083015280870151906001600160401b0382116100da5701878a01603f820112156100da5760208101519061015f61005583610243565b91602083828152018a8d0160408360051b850101116100da5760408301905b60408360051b85010182106101a45750505050604082015281526020928301920161007e565b81516001600160e01b0319811681036100da5781526020918201910161017e565b634e487b7160e01b600052604160045260246000fd5b60405190606082016001600160401b038111838210176101fa57604052565b6101c5565b60408051919082016001600160401b038111838210176101fa57604052565b6040519190601f01601f191682016001600160401b038111838210176101fa57604052565b6001600160401b0381116101fa5760051b60200190565b51906001600160a01b03821682036100da57565b6001600160401b0381116101fa57601f01601f191660200190565b60005b83811061029c5750506000910152565b818101518382015260200161028c565b81601f820112156100da5780516102c56100558261026e565b92818452602082840101116100da576102e49160208085019101610289565b90565b634e487b7160e01b600052601160045260246000fd5b600019811461030c5760010190565b6102e7565b634e487b7160e01b600052603260045260246000fd5b805182101561033b5760209160051b010190565b610311565b6003111561034a57565b634e487b7160e01b600052602160045260246000fd5b51600381101561034a5790565b90815180825260208080930193019160005b82811061038d575050505090565b83516001600160e01b0319168552938101939281019260010161037f565b906020916103c481518092818552858086019101610289565b601f01601f1916010190565b93929091936060928382019380835281518095526080830160808660051b85010195602080940192600080915b83831061042f575050505050506102e494956104229183019060018060a01b03169052565b60408184039101526103ab565b909192939498607f1988820301865289519060018060a01b03825116815287820151600381101561048a5761047c60019385848c959486809601528160408094015193820152019061036d565b9b01960194930191906103fd565b634e487b7160e01b85526021600452602485fd5b929190835160005b8181106104f05750507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673816104ee94956104e685604051938493846103d0565b0390a16105eb565b565b6040806104fd8389610327565b51015161051b61050d848a610327565b51516001600160a01b031690565b918151156105a65750908291610540602061053961055d968c610327565b5101610360565b61054981610340565b80610562575061055891610751565b6102fd565b6104a6565b61056b81610340565b6001810361057d5750610558916108a9565b80610589600292610340565b14610596575b50506102fd565b61059f91610a81565b388061058f565b5163e767f91f60e01b81526001600160a01b0383166004820152602490fd5b0390fd5b6001600160a01b0390911681526040602082018190526102e4929101906103ab565b906001600160a01b0382161561066e5761060482610c99565b600080825160208401855af4913d15610666573d926106256100558561026e565b9384523d6000602086013e5b1561063b57505050565b82511561064a57825160208401fd5b6105c560405192839263192105d760e01b8452600484016105c9565b606092610631565b5050565b9060206102e492818152019061036d565b8151815460209093015161ffff60a01b60a09190911b166001600160b01b03199093166001600160a01b0390911617919091179055565b90600080516020610dc5833981519152805483101561033b57600052601c60206000208360031c019260021b1690565b600080516020610dc583398151915290815491680100000000000000008310156101fa57826107219160016104ee950190556106ba565b90919063ffffffff83549160031b9260e01c831b921b1916179055565b61ffff80911690811461030c5760010190565b906001600160a01b0382161561088c57600080516020610dc58339815191525461ffff1661077e83610c99565b8151916000915b838310610793575050505050565b6107ae6107a08484610327565b516001600160e01b03191690565b6107f76107eb6107de8363ffffffff60e01b16600052600080516020610da5833981519152602052604060002090565b546001600160a01b031690565b6001600160a01b031690565b610868576108629161085761085c926108526108116101ff565b6001600160a01b038b16815261ffff851660208201526001600160e01b031983166000908152600080516020610da583398151915260205260409020610683565b6106ea565b61073e565b926102fd565b91610785565b60405163ebbf5d0760e01b81526001600160e01b0319919091166004820152602490fd5b6040516302b8da0760e21b81529081906105c59060048301610672565b6001600160a01b038116919082156109e6576108c481610c99565b81519160005b8381106108d8575050505050565b6108e56107a08284610327565b6109156107eb6107de8363ffffffff60e01b16600052600080516020610da5833981519152602052604060002090565b3081146109c4578681146109a2571561097e57906105588461095a6109799463ffffffff60e01b16600052600080516020610da5833981519152602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b6108ca565b604051637479f93960e01b81526001600160e01b0319919091166004820152602490fd5b604051631ac6ce8d60e11b81526001600160e01b031983166004820152602490fd5b604051632901806d60e11b81526001600160e01b031983166004820152602490fd5b60405163cd98a96f60e01b8152806105c58460048301610672565b9061ffff610a0d6101ff565b92546001600160a01b038116845260a01c166020830152565b801561030c576000190190565b600080516020610dc583398151915280548015610a6b576000190190610a58826106ba565b63ffffffff82549160031b1b1916905555565b634e487b7160e01b600052603160045260246000fd5b600080516020610dc58339815191525491906001600160a01b038116610c765750809291925190600090815b838110610abc57505050509050565b610ac96107a08284610327565b95610afc610af78863ffffffff60e01b16600052600080516020610da5833981519152602052604060002090565b610a01565b8051909190610b13906001600160a01b03166107eb565b15610c545781513090610b2e906001600160a01b03166107eb565b14610c3257610b9460209798610b9a9493610b498894610a26565b998a91018161ffff610b5d835161ffff1690565b1603610ba2575b5050610b6e610a33565b63ffffffff60e01b16600052600080516020610da5833981519152602052604060002090565b556102fd565b949394610aad565b610c0c610be5610bc4610bb7610c2b956106ba565b90549060031b1c60e01b90565b92610bdd84610721610bd8845161ffff1690565b6106ba565b5161ffff1690565b9163ffffffff60e01b16600052600080516020610da5833981519152602052604060002090565b805461ffff60a01b191660a09290921b61ffff60a01b16919091179055565b8838610b64565b604051630df5fd6160e31b81526001600160e01b031989166004820152602490fd5b604051637a08a22d60e01b81526001600160e01b031989166004820152602490fd5b60405163d091bc8160e01b81526001600160a01b03919091166004820152602490fd5b3b15610ca157565b60405163c1df45cf60e01b8152600490fdfe60007fffffffff000000000000000000000000000000000000000000000000000000008135168082527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c60205273ffffffffffffffffffffffffffffffffffffffff604083205416908115608e57508180913682608037608036915af43d809260803e15608a576080f35b6080fd5b7f5416eb980000000000000000000000000000000000000000000000000000000060805260845260246080fdfea26469706673582212208af5ce7195da66a8929b8a8218f4e6d16be2cbf188e5989679595bf0f5123eff64736f6c63430008130033c8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131cc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131b0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e8c2c34599eaf8006e466398b378067db7d3c4790000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000053b7d70013dec21a97f216e80eefcf45f25c29000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000011f931c1c00000000000000000000000000000000000000000000000000000000000000000000000000000000fa94cd9d711de75695693c877beca5473462cf120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000025c60da1b00000000000000000000000000000000000000000000000000000000c39aa07d0000000000000000000000000000000000000000000000000000000000000000000000000000000065ddeedf8e68f26d787b678e28af13fde0249967000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004cdffacc60000000000000000000000000000000000000000000000000000000052ef6b2c00000000000000000000000000000000000000000000000000000000adfca15e000000000000000000000000000000000000000000000000000000007a0ed62700000000000000000000000000000000000000000000000000000000000000000000000000000000d1b575ed715e4630340bfdc4fb8a37df3383c84a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000016b4a0bdf300000000000000000000000000000000000000000000000000000000ee565a6300000000000000000000000000000000000000000000000000000000847da7be00000000000000000000000000000000000000000000000000000000eb7aac5f000000000000000000000000000000000000000000000000000000003335221000000000000000000000000000000000000000000000000000000000b718136100000000000000000000000000000000000000000000000000000000b85780bc00000000000000000000000000000000000000000000000000000000cd377c5300000000000000000000000000000000000000000000000000000000782513bd0000000000000000000000000000000000000000000000000000000094e35d9e000000000000000000000000000000000000000000000000000000004ea3e3430000000000000000000000000000000000000000000000000000000010d3d22e0000000000000000000000000000000000000000000000000000000038c269eb00000000000000000000000000000000000000000000000000000000adc9d1f7000000000000000000000000000000000000000000000000000000008db9653f000000000000000000000000000000000000000000000000000000000d1266270000000000000000000000000000000000000000000000000000000096d6487900000000000000000000000000000000000000000000000000000000fe7d0c540000000000000000000000000000000000000000000000000000000077dc342900000000000000000000000000000000000000000000000000000000f9839d8900000000000000000000000000000000000000000000000000000000a52aefd40000000000000000000000000000000000000000000000000000000099eeca4900000000000000000000000000000000000000000000000000000000000000000000000000000000770756e43b9ac742538850003791def3020211f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000105b41934000000000000000000000000000000000000000000000000000000000000000000000000000000001f37f93c6aa7d987ae04786145d3066eab8eeb4300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000af0d2d5a800000000000000000000000000000000000000000000000000000000c1cdee7e0000000000000000000000000000000000000000000000000000000087c8ab7a000000000000000000000000000000000000000000000000000000005c3eebda000000000000000000000000000000000000000000000000000000001f0ec8ee000000000000000000000000000000000000000000000000000000000e32cb860000000000000000000000000000000000000000000000000000000081ee2deb00000000000000000000000000000000000000000000000000000000b13b0847000000000000000000000000000000000000000000000000000000001b0c7182000000000000000000000000000000000000000000000000000000007c0343a100000000000000000000000000000000000000000000000000000000000000000000000000000000dda8f002925a0dfb151c0eacb48d7136ce6a999f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004629feb62000000000000000000000000000000000000000000000000000000004eec47b900000000000000000000000000000000000000000000000000000000a9e6a1a400000000000000000000000000000000000000000000000000000000b607d0990000000000000000000000000000000000000000000000000000000000000000000000000000000006c33a0c80c3970cbedde641c7a6419d703d93d70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000064583aea6000000000000000000000000000000000000000000000000000000009525f3ab000000000000000000000000000000000000000000000000000000003b6a1fe000000000000000000000000000000000000000000000000000000000d92c6cb200000000000000000000000000000000000000000000000000000000b92567fa00000000000000000000000000000000000000000000000000000000c10a6287000000000000000000000000000000000000000000000000000000000000000000000000000000008e669f6ef8485694196f32d568ba4ac268b9fe8f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004d703a0cd00000000000000000000000000000000000000000000000000000000815822c1000000000000000000000000000000000000000000000000000000002e7639bc00000000000000000000000000000000000000000000000000000000fd7daaf8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000005bc6bef80da563ebf6df6d6913513fa9a7ec89be0000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce80000000000000000000000005d34839a3d4051f630d36e26698d53c58dd3907200000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60007fffffffff000000000000000000000000000000000000000000000000000000008135168082527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c60205273ffffffffffffffffffffffffffffffffffffffff604083205416908115608e57508180913682608037608036915af43d809260803e15608a576080f35b6080fd5b7f5416eb980000000000000000000000000000000000000000000000000000000060805260845260246080fdfea26469706673582212208af5ce7195da66a8929b8a8218f4e6d16be2cbf188e5989679595bf0f5123eff64736f6c63430008130033

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

0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e8c2c34599eaf8006e466398b378067db7d3c4790000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000053b7d70013dec21a97f216e80eefcf45f25c29000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000011f931c1c00000000000000000000000000000000000000000000000000000000000000000000000000000000fa94cd9d711de75695693c877beca5473462cf120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000025c60da1b00000000000000000000000000000000000000000000000000000000c39aa07d0000000000000000000000000000000000000000000000000000000000000000000000000000000065ddeedf8e68f26d787b678e28af13fde0249967000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004cdffacc60000000000000000000000000000000000000000000000000000000052ef6b2c00000000000000000000000000000000000000000000000000000000adfca15e000000000000000000000000000000000000000000000000000000007a0ed62700000000000000000000000000000000000000000000000000000000000000000000000000000000d1b575ed715e4630340bfdc4fb8a37df3383c84a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000016b4a0bdf300000000000000000000000000000000000000000000000000000000ee565a6300000000000000000000000000000000000000000000000000000000847da7be00000000000000000000000000000000000000000000000000000000eb7aac5f000000000000000000000000000000000000000000000000000000003335221000000000000000000000000000000000000000000000000000000000b718136100000000000000000000000000000000000000000000000000000000b85780bc00000000000000000000000000000000000000000000000000000000cd377c5300000000000000000000000000000000000000000000000000000000782513bd0000000000000000000000000000000000000000000000000000000094e35d9e000000000000000000000000000000000000000000000000000000004ea3e3430000000000000000000000000000000000000000000000000000000010d3d22e0000000000000000000000000000000000000000000000000000000038c269eb00000000000000000000000000000000000000000000000000000000adc9d1f7000000000000000000000000000000000000000000000000000000008db9653f000000000000000000000000000000000000000000000000000000000d1266270000000000000000000000000000000000000000000000000000000096d6487900000000000000000000000000000000000000000000000000000000fe7d0c540000000000000000000000000000000000000000000000000000000077dc342900000000000000000000000000000000000000000000000000000000f9839d8900000000000000000000000000000000000000000000000000000000a52aefd40000000000000000000000000000000000000000000000000000000099eeca4900000000000000000000000000000000000000000000000000000000000000000000000000000000770756e43b9ac742538850003791def3020211f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000105b41934000000000000000000000000000000000000000000000000000000000000000000000000000000001f37f93c6aa7d987ae04786145d3066eab8eeb4300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000af0d2d5a800000000000000000000000000000000000000000000000000000000c1cdee7e0000000000000000000000000000000000000000000000000000000087c8ab7a000000000000000000000000000000000000000000000000000000005c3eebda000000000000000000000000000000000000000000000000000000001f0ec8ee000000000000000000000000000000000000000000000000000000000e32cb860000000000000000000000000000000000000000000000000000000081ee2deb00000000000000000000000000000000000000000000000000000000b13b0847000000000000000000000000000000000000000000000000000000001b0c7182000000000000000000000000000000000000000000000000000000007c0343a100000000000000000000000000000000000000000000000000000000000000000000000000000000dda8f002925a0dfb151c0eacb48d7136ce6a999f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004629feb62000000000000000000000000000000000000000000000000000000004eec47b900000000000000000000000000000000000000000000000000000000a9e6a1a400000000000000000000000000000000000000000000000000000000b607d0990000000000000000000000000000000000000000000000000000000000000000000000000000000006c33a0c80c3970cbedde641c7a6419d703d93d70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000064583aea6000000000000000000000000000000000000000000000000000000009525f3ab000000000000000000000000000000000000000000000000000000003b6a1fe000000000000000000000000000000000000000000000000000000000d92c6cb200000000000000000000000000000000000000000000000000000000b92567fa00000000000000000000000000000000000000000000000000000000c10a6287000000000000000000000000000000000000000000000000000000000000000000000000000000008e669f6ef8485694196f32d568ba4ac268b9fe8f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004d703a0cd00000000000000000000000000000000000000000000000000000000815822c1000000000000000000000000000000000000000000000000000000002e7639bc00000000000000000000000000000000000000000000000000000000fd7daaf8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000005bc6bef80da563ebf6df6d6913513fa9a7ec89be0000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce80000000000000000000000005d34839a3d4051f630d36e26698d53c58dd3907200000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _diamondCut (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [1] : _init (address): 0xE8C2c34599eAf8006E466398B378067DB7d3c479
Arg [2] : _calldata (bytes): 0xc0c53b8b0000000000000000000000005bc6bef80da563ebf6df6d6913513fa9a7ec89be0000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce80000000000000000000000005d34839a3d4051f630d36e26698d53c58dd39072

-----Encoded View---------------
108 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 000000000000000000000000e8c2c34599eaf8006e466398b378067db7d3c479
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000ce0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000380
Arg [8] : 00000000000000000000000000000000000000000000000000000000000006c0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000760
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000920
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000a20
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000b60
Arg [13] : 00000000000000000000000053b7d70013dec21a97f216e80eefcf45f25c2900
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [17] : 1f931c1c00000000000000000000000000000000000000000000000000000000
Arg [18] : 000000000000000000000000fa94cd9d711de75695693c877beca5473462cf12
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [22] : 5c60da1b00000000000000000000000000000000000000000000000000000000
Arg [23] : c39aa07d00000000000000000000000000000000000000000000000000000000
Arg [24] : 00000000000000000000000065ddeedf8e68f26d787b678e28af13fde0249967
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [28] : cdffacc600000000000000000000000000000000000000000000000000000000
Arg [29] : 52ef6b2c00000000000000000000000000000000000000000000000000000000
Arg [30] : adfca15e00000000000000000000000000000000000000000000000000000000
Arg [31] : 7a0ed62700000000000000000000000000000000000000000000000000000000
Arg [32] : 000000000000000000000000d1b575ed715e4630340bfdc4fb8a37df3383c84a
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [35] : 0000000000000000000000000000000000000000000000000000000000000016
Arg [36] : b4a0bdf300000000000000000000000000000000000000000000000000000000
Arg [37] : ee565a6300000000000000000000000000000000000000000000000000000000
Arg [38] : 847da7be00000000000000000000000000000000000000000000000000000000
Arg [39] : eb7aac5f00000000000000000000000000000000000000000000000000000000
Arg [40] : 3335221000000000000000000000000000000000000000000000000000000000
Arg [41] : b718136100000000000000000000000000000000000000000000000000000000
Arg [42] : b85780bc00000000000000000000000000000000000000000000000000000000
Arg [43] : cd377c5300000000000000000000000000000000000000000000000000000000
Arg [44] : 782513bd00000000000000000000000000000000000000000000000000000000
Arg [45] : 94e35d9e00000000000000000000000000000000000000000000000000000000
Arg [46] : 4ea3e34300000000000000000000000000000000000000000000000000000000
Arg [47] : 10d3d22e00000000000000000000000000000000000000000000000000000000
Arg [48] : 38c269eb00000000000000000000000000000000000000000000000000000000
Arg [49] : adc9d1f700000000000000000000000000000000000000000000000000000000
Arg [50] : 8db9653f00000000000000000000000000000000000000000000000000000000
Arg [51] : 0d12662700000000000000000000000000000000000000000000000000000000
Arg [52] : 96d6487900000000000000000000000000000000000000000000000000000000
Arg [53] : fe7d0c5400000000000000000000000000000000000000000000000000000000
Arg [54] : 77dc342900000000000000000000000000000000000000000000000000000000
Arg [55] : f9839d8900000000000000000000000000000000000000000000000000000000
Arg [56] : a52aefd400000000000000000000000000000000000000000000000000000000
Arg [57] : 99eeca4900000000000000000000000000000000000000000000000000000000
Arg [58] : 000000000000000000000000770756e43b9ac742538850003791def3020211f3
Arg [59] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [60] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [61] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [62] : 05b4193400000000000000000000000000000000000000000000000000000000
Arg [63] : 0000000000000000000000001f37f93c6aa7d987ae04786145d3066eab8eeb43
Arg [64] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [65] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [66] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [67] : f0d2d5a800000000000000000000000000000000000000000000000000000000
Arg [68] : c1cdee7e00000000000000000000000000000000000000000000000000000000
Arg [69] : 87c8ab7a00000000000000000000000000000000000000000000000000000000
Arg [70] : 5c3eebda00000000000000000000000000000000000000000000000000000000
Arg [71] : 1f0ec8ee00000000000000000000000000000000000000000000000000000000
Arg [72] : 0e32cb8600000000000000000000000000000000000000000000000000000000
Arg [73] : 81ee2deb00000000000000000000000000000000000000000000000000000000
Arg [74] : b13b084700000000000000000000000000000000000000000000000000000000
Arg [75] : 1b0c718200000000000000000000000000000000000000000000000000000000
Arg [76] : 7c0343a100000000000000000000000000000000000000000000000000000000
Arg [77] : 000000000000000000000000dda8f002925a0dfb151c0eacb48d7136ce6a999f
Arg [78] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [79] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [80] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [81] : 629feb6200000000000000000000000000000000000000000000000000000000
Arg [82] : 4eec47b900000000000000000000000000000000000000000000000000000000
Arg [83] : a9e6a1a400000000000000000000000000000000000000000000000000000000
Arg [84] : b607d09900000000000000000000000000000000000000000000000000000000
Arg [85] : 00000000000000000000000006c33a0c80c3970cbedde641c7a6419d703d93d7
Arg [86] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [87] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [88] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [89] : 4583aea600000000000000000000000000000000000000000000000000000000
Arg [90] : 9525f3ab00000000000000000000000000000000000000000000000000000000
Arg [91] : 3b6a1fe000000000000000000000000000000000000000000000000000000000
Arg [92] : d92c6cb200000000000000000000000000000000000000000000000000000000
Arg [93] : b92567fa00000000000000000000000000000000000000000000000000000000
Arg [94] : c10a628700000000000000000000000000000000000000000000000000000000
Arg [95] : 0000000000000000000000008e669f6ef8485694196f32d568ba4ac268b9fe8f
Arg [96] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [97] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [98] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [99] : d703a0cd00000000000000000000000000000000000000000000000000000000
Arg [100] : 815822c100000000000000000000000000000000000000000000000000000000
Arg [101] : 2e7639bc00000000000000000000000000000000000000000000000000000000
Arg [102] : fd7daaf800000000000000000000000000000000000000000000000000000000
Arg [103] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [104] : c0c53b8b0000000000000000000000005bc6bef80da563ebf6df6d6913513fa9
Arg [105] : a7ec89be0000000000000000000000001a7e4e63778b4f12a199c062f3efdd28
Arg [106] : 8afcbce80000000000000000000000005d34839a3d4051f630d36e26698d53c5
Arg [107] : 8dd3907200000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

:::-:0;1344:7:6;;;;472:2026;;;1328:15;472:2026;;;;;;;;1379:26;;;1375:89;;1474:1016;;;;;;472:2026;1474:1016;472:2026;1474:1016;;;;;;;472:2026;1474:1016;;;;472:2026;1474:1016;;472:2026;1474:1016;1375:89;1428:25;472:2026;1428:25;;472:2026;1428:25;472:2026;1428:25

Swarm Source

ipfs://8af5ce7195da66a8929b8a8218f4e6d16be2cbf188e5989679595bf0f5123eff

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Transmuter is a minting module for Angle stablecoins.

Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.