Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0xCe545F72Df7eaF7b554Cd4cfD40D34E04155D908
Balance 0 ETH
Nonce 1
Code Size 5977 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

5977 bytes
0x608060405260043610610089575f3560e01c80638da5cb5b116100585780638da5cb5b146101465780639cacfd1914610170578063a03e4bc314610198578063f3fef3a3146101c2578063fb7d8a1e146101ea57610090565b806316d3ffc3146100925780631a21c0bc146100ba57806347e7ef24146100f657806368ac4b3a1461011e57610090565b3661009057005b005b34801561009d575f80fd5b506100b860048036038101906100b39190610ec9565b610212565b005b3480156100c5575f80fd5b506100e060048036038101906100db9190610ec9565b6102f7565b6040516100ed9190610f0e565b60405180910390f35b348015610101575f80fd5b5061011c60048036038101906101179190610f5a565b610313565b005b348015610129575f80fd5b50610144600480360381019061013f9190610f98565b610611565b005b348015610151575f80fd5b5061015a610794565b6040516101679190610ff7565b60405180910390f35b34801561017b575f80fd5b5061019660048036038101906101919190611071565b6107b9565b005b3480156101a3575f80fd5b506101ac61092d565b6040516101b9919061113d565b60405180910390f35b3480156101cd575f80fd5b506101e860048036038101906101e39190610f5a565b610952565b005b3480156101f5575f80fd5b50610210600480360381019061020b9190610ec9565b610afd565b005b3373ffffffffffffffffffffffffffffffffffffffff1660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146102a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610298906111b0565b60405180910390fd5b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f602052805f5260405f205f915054906101000a900460ff1681565b5f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661039b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039290611218565b60405180910390fd5b5f81116103dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d490611280565b60405180910390fd5b5f8290505f8173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e3060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040161043e92919061129e565b602060405180830381865afa158015610459573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061047d91906112d9565b905082811015610545578173ffffffffffffffffffffffffffffffffffffffff1663095ea7b360025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610503929190611313565b6020604051808303815f875af115801561051f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105439190611364565b505b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663617ba0378585305f6040518563ffffffff1660e01b81526004016105a594939291906113d5565b5f604051808303815f87803b1580156105bc575f80fd5b505af11580156105ce573d5f803e3d5ffd5b505050507f39d22d7dbfa8f3c1279cc40836ecad0ef3ed82759d4fec13fae20e624f11b36c8484604051610603929190611313565b60405180910390a150505050565b5f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069090611218565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fe90611462565b60405180910390fd5b5f8111610749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610740906114ca565b60405180910390fd5b610754828483610be3565b7f29baef7536ff3b56598f2aabad1e725e5568fcc8b2f64750d3516f645b6428e7828483604051610787939291906114e8565b60405180910390a1505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083890611218565b60405180910390fd5b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161086a929190611559565b5f6040518083038185875af1925050503d805f81146108a4576040519150601f19603f3d011682016040523d82523d5f602084013e6108a9565b606091505b50509050806108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e4906115bb565b60405180910390fd5b7fcdee897399ab5e465acb1bd3ed5e32c695f196321764546c59720fa6c9ce4c69858560405161091e929190611313565b60405180910390a15050505050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166109da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d190611218565b60405180910390fd5b5f8111610a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1390611280565b60405180910390fd5b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166369328dec8484306040518463ffffffff1660e01b8152600401610a7b939291906115d9565b6020604051808303815f875af1158015610a97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abb91906112d9565b90507f6d5e1581595bc9180b2302f1eb1bd167cf108ae9d04ebc346e4582af1b2dd7ed838383604051610af09392919061160e565b60405180910390a1505050565b3373ffffffffffffffffffffffffffffffffffffffff1660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b83906111b0565b60405180910390fd5b60015f808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b73a614f803b6fd780986a42c78ec9c7f77e6ded13c73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610c70575073dac17f958d2ee523a2206206994597c13d831ec773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610ce2578273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610cb0929190611313565b5f604051808303815f87803b158015610cc7575f80fd5b505af1158015610cd9573d5f803e3d5ffd5b50505050610e62565b5f808473ffffffffffffffffffffffffffffffffffffffff166040518060400160405280601981526020017f7472616e7366657228616464726573732c75696e743235362900000000000000815250805190602001208585604051602401610d4b929190611313565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610db591906116a5565b5f604051808303815f865af19150503d805f8114610dee576040519150601f19603f3d011682016040523d82523d5f602084013e610df3565b606091505b5091509150818015610e2057505f81511480610e1f575080806020019051810190610e1e9190611364565b5b5b610e5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5690611705565b60405180910390fd5b50505b505050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e9882610e6f565b9050919050565b610ea881610e8e565b8114610eb2575f80fd5b50565b5f81359050610ec381610e9f565b92915050565b5f60208284031215610ede57610edd610e67565b5b5f610eeb84828501610eb5565b91505092915050565b5f8115159050919050565b610f0881610ef4565b82525050565b5f602082019050610f215f830184610eff565b92915050565b5f819050919050565b610f3981610f27565b8114610f43575f80fd5b50565b5f81359050610f5481610f30565b92915050565b5f8060408385031215610f7057610f6f610e67565b5b5f610f7d85828601610eb5565b9250506020610f8e85828601610f46565b9150509250929050565b5f805f60608486031215610faf57610fae610e67565b5b5f610fbc86828701610eb5565b9350506020610fcd86828701610eb5565b9250506040610fde86828701610f46565b9150509250925092565b610ff181610e8e565b82525050565b5f60208201905061100a5f830184610fe8565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261103157611030611010565b5b8235905067ffffffffffffffff81111561104e5761104d611014565b5b60208301915083600182028301111561106a57611069611018565b5b9250929050565b5f805f806060858703121561108957611088610e67565b5b5f61109687828801610eb5565b94505060206110a787828801610f46565b935050604085013567ffffffffffffffff8111156110c8576110c7610e6b565b5b6110d48782880161101c565b925092505092959194509250565b5f819050919050565b5f6111056111006110fb84610e6f565b6110e2565b610e6f565b9050919050565b5f611116826110eb565b9050919050565b5f6111278261110c565b9050919050565b6111378161111d565b82525050565b5f6020820190506111505f83018461112e565b92915050565b5f82825260208201905092915050565b7f6c6f6f6d783a206e6f7420746865206f776e65720000000000000000000000005f82015250565b5f61119a601483611156565b91506111a582611166565b602082019050919050565b5f6020820190508181035f8301526111c78161118e565b9050919050565b7f6c6f6f6d783a206e6f74207468652068616e646c6572000000000000000000005f82015250565b5f611202601683611156565b915061120d826111ce565b602082019050919050565b5f6020820190508181035f83015261122f816111f6565b9050919050565b7f416d6f756e74206d757374206265203e203000000000000000000000000000005f82015250565b5f61126a601283611156565b915061127582611236565b602082019050919050565b5f6020820190508181035f8301526112978161125e565b9050919050565b5f6040820190506112b15f830185610fe8565b6112be6020830184610fe8565b9392505050565b5f815190506112d381610f30565b92915050565b5f602082840312156112ee576112ed610e67565b5b5f6112fb848285016112c5565b91505092915050565b61130d81610f27565b82525050565b5f6040820190506113265f830185610fe8565b6113336020830184611304565b9392505050565b61134381610ef4565b811461134d575f80fd5b50565b5f8151905061135e8161133a565b92915050565b5f6020828403121561137957611378610e67565b5b5f61138684828501611350565b91505092915050565b5f819050919050565b5f61ffff82169050919050565b5f6113bf6113ba6113b58461138f565b6110e2565b611398565b9050919050565b6113cf816113a5565b82525050565b5f6080820190506113e85f830187610fe8565b6113f56020830186611304565b6114026040830185610fe8565b61140f60608301846113c6565b95945050505050565b7f6c6f6f6d783a2064657374696e6174696f6e206572726f7200000000000000005f82015250565b5f61144c601883611156565b915061145782611418565b602082019050919050565b5f6020820190508181035f83015261147981611440565b9050919050565b7f6c6f6f6d783a20696e76616c69642076616c75650000000000000000000000005f82015250565b5f6114b4601483611156565b91506114bf82611480565b602082019050919050565b5f6020820190508181035f8301526114e1816114a8565b9050919050565b5f6060820190506114fb5f830186610fe8565b6115086020830185610fe8565b6115156040830184611304565b949350505050565b5f81905092915050565b828183375f83830152505050565b5f611540838561151d565b935061154d838584611527565b82840190509392505050565b5f611565828486611535565b91508190509392505050565b7f6c6f6f6d783a2073776170206661696c656400000000000000000000000000005f82015250565b5f6115a5601283611156565b91506115b082611571565b602082019050919050565b5f6020820190508181035f8301526115d281611599565b9050919050565b5f6060820190506115ec5f830186610fe8565b6115f96020830185611304565b6116066040830184610fe8565b949350505050565b5f6060820190506116215f830186610fe8565b61162e6020830185611304565b61163b6040830184611304565b949350505050565b5f81519050919050565b5f5b8381101561166a57808201518184015260208101905061164f565b5f8484015250505050565b5f61167f82611643565b611689818561151d565b935061169981856020860161164d565b80840191505092915050565b5f6116b08284611675565b915081905092915050565b7f6c6f6f6d783a205452414e534645525f4641494c4544000000000000000000005f82015250565b5f6116ef601683611156565b91506116fa826116bb565b602082019050919050565b5f6020820190508181035f83015261171c816116e3565b905091905056fea2646970667358221220afcfa138874030ec15e23f21693c8a8505095c5c83e6fb8ef44133534fb81c2264736f6c63430008180033

Verified Source Code Full Match

Compiler: v0.8.24+commit.e11b9ed9 EVM: cancun Optimization: No
Vault.sol 153 lines
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.20;

//import "@openzeppelin/contracts/access/Ownable.sol";
//import "./NonStandardERC20.sol";

interface NonStandardERC20 {
    function transfer(address to, uint256 amount) external;
}

interface IERC20 {
    function approve(address spender, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
}

interface IAavePool {
    function supply(
        address asset,
        uint256 amount,
        address onBehalfOf,
        uint16 referralCode
    ) external;

    function withdraw(
        address asset,
        uint256 amount,
        address to
    ) external returns (uint256);
}

contract LoomXVault {
    bytes4 private constant SELECTOR =
        bytes4(keccak256(bytes("transfer(address,uint256)")));

    mapping(address => bool) public handlers;
    
    address public owner;

    IAavePool public aavePool;

    // event Received(address Sender, uint Value);

    // event FallbackCalled(address Sender, uint Value, bytes Data);

    event Swapped(address routerAddress, uint256 value);

    event spentToken(address tokenAddress, address to, uint256 value);

    event SupplyAAVE(address token, uint256 amount);
    event WithdrawAAVE(address token, uint256 amount, uint256 withdrawAmount);
    
    modifier onlyOwner() {
        require(owner == msg.sender, "loomx: not the owner");
        _;
    }

    modifier isHandler() {
        require(handlers[msg.sender], "loomx: not the handler");
        _;
    }

    constructor(address _pool) {
        owner = msg.sender;
        handlers[msg.sender] = true;
        aavePool = IAavePool(_pool);
    }

    function addHandler(address handler) external onlyOwner {
        handlers[handler] = true;
    }

    function removeHandler(address handler) external onlyOwner {
        handlers[handler] = false;
    }

    receive() external payable {}

    fallback() external payable {}

    function toSwap(
        address routerAddress,
        uint256 value,
        bytes calldata data
    ) external isHandler {
        // transfer tokens from this contract to the routerAddress
        (bool success, ) = routerAddress.call{value: value}(data);
        require(success, "loomx: swap failed");
        emit Swapped(routerAddress, value);
    }

    function spendToken(
        address destination,
        address tokenAddress,
        uint256 value
    ) external isHandler {
        require(
            destination != address(this),
            "loomx: destination error"
        );
        // transfer erc20 token
        require(value > 0, "loomx: invalid value");
        // transfer tokens from this contract to the destination address
        _safeTransfer(tokenAddress, destination, value);
        emit spentToken(tokenAddress, destination, value);
    }

    function deposit(address asset, uint256 amount) external isHandler {
        require(amount > 0, "Amount must be > 0");

        IERC20 token = IERC20(asset);
        uint256 allowance = token.allowance(address(this), address(aavePool));
        if (allowance < amount) {
            token.approve(address(aavePool), type(uint256).max);
        }

        aavePool.supply(
            asset,
            amount,
            address(this),
            0
        );
        emit SupplyAAVE(asset, amount);
    }

    function withdraw(address asset, uint256 amount) external isHandler {
        require(amount > 0, "Amount must be > 0");

        uint256 withdrawn = aavePool.withdraw(
            asset,
            amount,
            address(this)
        );
        emit WithdrawAAVE(asset, amount, withdrawn);
    }
    
    function _safeTransfer(address token, address to, uint256 value) private {
        if (
            token == 0xa614f803B6FD780986A42c78Ec9c7f77e6DeD13C ||
            token == 0xdAC17F958D2ee523a2206206994597C13D831ec7
        ) {
            NonStandardERC20(token).transfer(to, value);
            return;
        }
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(SELECTOR, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "loomx: TRANSFER_FAILED"
        );
    }
}

Read Contract

aavePool 0xa03e4bc3 → address
handlers 0x1a21c0bc → bool
owner 0x8da5cb5b → address

Write Contract 6 functions

These functions modify contract state and require a wallet transaction to execute.

addHandler 0xfb7d8a1e
address handler
deposit 0x47e7ef24
address asset
uint256 amount
removeHandler 0x16d3ffc3
address handler
spendToken 0x68ac4b3a
address destination
address tokenAddress
uint256 value
toSwap 0x9cacfd19
address routerAddress
uint256 value
bytes data
withdraw 0xf3fef3a3
address asset
uint256 amount

Recent Transactions

No transactions found for this address