ETH Price: $2,621.66 (-2.04%)

Contract

0xc5A4fec44fbDE08A7c9dE6e07b60De60aC074Ab9
 

Overview

ETH Balance

0.322308250505231126 ETH

Eth Value

$844.98 (@ $2,621.66/ETH)
Transaction Hash
Method
Block
From
To
Deposit206133272024-08-26 14:21:1134 days ago1724682071IN
0xc5A4fec4...0aC074Ab9
0.001 ETH0.000178653.90881379
Schedule Withdra...206133182024-08-26 14:19:2334 days ago1724681963IN
0xc5A4fec4...0aC074Ab9
0 ETH0.0001933.89153946
Deposit204917602024-08-09 14:52:2351 days ago1723215143IN
0xc5A4fec4...0aC074Ab9
0.005 ETH0.0005571912.19115456
Schedule Withdra...204917562024-08-09 14:51:3551 days ago1723215095IN
0xc5A4fec4...0aC074Ab9
0 ETH0.000583411.76580168
Deposit199348692024-05-23 20:08:47129 days ago1716494927IN
0xc5A4fec4...0aC074Ab9
0.008 ETH0.0013094628.65040186
Cancel Redirect198599852024-05-13 8:44:59139 days ago1715589899IN
0xc5A4fec4...0aC074Ab9
0 ETH0.00011415.3033196
Refund198599842024-05-13 8:44:47139 days ago1715589887IN
0xc5A4fec4...0aC074Ab9
0 ETH0.000154375.42486756
Cancel Withdraw198599832024-05-13 8:44:35139 days ago1715589875IN
0xc5A4fec4...0aC074Ab9
0 ETH0.000146425.29529652
Deposit198599522024-05-13 8:38:11139 days ago1715589491IN
0xc5A4fec4...0aC074Ab9
0.001 ETH0.000251935.51227237
Schedule Withdra...198599472024-05-13 8:37:11139 days ago1715589431IN
0xc5A4fec4...0aC074Ab9
0 ETH0.00028695.78617363
Set Redirect198599462024-05-13 8:36:59139 days ago1715589419IN
0xc5A4fec4...0aC074Ab9
0 ETH0.000271096.15548682
Refund198108242024-05-06 11:44:23146 days ago1714995863IN
0xc5A4fec4...0aC074Ab9
0 ETH0.000145215.1030973
Schedule Withdra...197939902024-05-04 3:13:59148 days ago1714792439IN
0xc5A4fec4...0aC074Ab9
0 ETH0.000287435.86344281
Set Redirect197896082024-05-03 12:32:11149 days ago1714739531IN
0xc5A4fec4...0aC074Ab9
0 ETH0.000194538.05834423
Deposit197860972024-05-03 0:45:35150 days ago1714697135IN
0xc5A4fec4...0aC074Ab9
0.2 ETH0.000196154.2917948
Schedule Withdra...197860862024-05-03 0:43:23150 days ago1714697003IN
0xc5A4fec4...0aC074Ab9
0 ETH0.000256145.16703432
Set Redirect197860852024-05-03 0:43:11150 days ago1714696991IN
0xc5A4fec4...0aC074Ab9
0 ETH0.000224075.08788228
Schedule Withdra...195877002024-04-05 6:16:47177 days ago1712297807IN
0xc5A4fec4...0aC074Ab9
0 ETH0.0008113616.36311801
Batch Execute195220232024-03-27 0:04:11187 days ago1711497851IN
0xc5A4fec4...0aC074Ab9
0 ETH0.0348366836.64785961
Schedule Withdra...194611402024-03-18 10:39:11195 days ago1710758351IN
0xc5A4fec4...0aC074Ab9
0 ETH0.0012523225.2560497
Batch Execute193509382024-03-03 0:03:47211 days ago1709424227IN
0xc5A4fec4...0aC074Ab9
0 ETH0.0470267449.78281978
Batch Execute193009012024-02-25 0:03:35218 days ago1708819415IN
0xc5A4fec4...0aC074Ab9
0 ETH0.0245995225.42115799
Schedule Withdra...191787702024-02-07 20:43:23235 days ago1707338603IN
0xc5A4fec4...0aC074Ab9
0 ETH0.0029914860.34502306
Batch Execute191084802024-01-29 0:01:47245 days ago1706486507IN
0xc5A4fec4...0aC074Ab9
0 ETH0.0100714210.85823373
Batch Execute190515332024-01-21 0:03:59253 days ago1705795439IN
0xc5A4fec4...0aC074Ab9
0 ETH0.0152691715.16218711
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
198599842024-05-13 8:44:47139 days ago1715589887
0xc5A4fec4...0aC074Ab9
0.001 ETH
198108242024-05-06 11:44:23146 days ago1714995863
0xc5A4fec4...0aC074Ab9
0.2 ETH
195220232024-03-27 0:04:11187 days ago1711497851
0xc5A4fec4...0aC074Ab9
0.00279454 ETH
195220232024-03-27 0:04:11187 days ago1711497851
0xc5A4fec4...0aC074Ab9
0.00353234 ETH
193509382024-03-03 0:03:47211 days ago1709424227
0xc5A4fec4...0aC074Ab9
0.00479836 ETH
193009012024-02-25 0:03:35218 days ago1708819415
0xc5A4fec4...0aC074Ab9
0.00193846 ETH
193009012024-02-25 0:03:35218 days ago1708819415
0xc5A4fec4...0aC074Ab9
0.00245024 ETH
191084802024-01-29 0:01:47245 days ago1706486507
0xc5A4fec4...0aC074Ab9
0.00104658 ETH
190515332024-01-21 0:03:59253 days ago1705795439
0xc5A4fec4...0aC074Ab9
0.00115617 ETH
190515332024-01-21 0:03:59253 days ago1705795439
0xc5A4fec4...0aC074Ab9
0.00146142 ETH
189515562024-01-07 0:03:47267 days ago1704585827
0xc5A4fec4...0aC074Ab9
0.00235596 ETH
189515562024-01-07 0:03:47267 days ago1704585827
0xc5A4fec4...0aC074Ab9
0.00160627 ETH
189160182024-01-02 0:03:35272 days ago1704153815
0xc5A4fec4...0aC074Ab9
0.0020783 ETH
189160182024-01-02 0:03:35272 days ago1704153815
0xc5A4fec4...0aC074Ab9
0.00138756 ETH
189160182024-01-02 0:03:35272 days ago1704153815
0xc5A4fec4...0aC074Ab9
0.00268602 ETH
188590672023-12-25 0:03:35280 days ago1703462615
0xc5A4fec4...0aC074Ab9
0.00189032 ETH
188448272023-12-23 0:03:47282 days ago1703289827
0xc5A4fec4...0aC074Ab9
0.00259203 ETH
188376962023-12-22 0:03:47283 days ago1703203427
0xc5A4fec4...0aC074Ab9
0.0025003 ETH
188376962023-12-22 0:03:47283 days ago1703203427
0xc5A4fec4...0aC074Ab9
0.00316041 ETH
187093052023-12-04 0:03:35301 days ago1701648215
0xc5A4fec4...0aC074Ab9
0.00383886 ETH
186735732023-11-29 0:03:47306 days ago1701216227
0xc5A4fec4...0aC074Ab9
0.00472234 ETH
186664202023-11-28 0:01:59307 days ago1701129719
0xc5A4fec4...0aC074Ab9
0.00371933 ETH
186378802023-11-24 0:03:59311 days ago1700784239
0xc5A4fec4...0aC074Ab9
0.00238984 ETH
186378792023-11-24 0:03:47311 days ago1700784227
0xc5A4fec4...0aC074Ab9
0.00253262 ETH
186307212023-11-23 0:01:11312 days ago1700697671
0xc5A4fec4...0aC074Ab9
0.03 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LlamaPayBot

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 3 : LlamaPayBot.sol
//SPDX-License-Identifier: AGPL-3.0-only

pragma solidity ^0.8.0;

import {ERC20} from "solmate/tokens/ERC20.sol";
import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol";

interface LlamaPay {
    function withdraw(
        address from,
        address to,
        uint216 amountPerSec
    ) external;

    function withdrawable(
        address from,
        address to,
        uint216 amountPerSec
    )
        external
        view
        returns (
            uint256 withdrawableAmount,
            uint256 lastUpdate,
            uint256 owed
        );
}

interface LlamaPayFactory {
    function getLlamaPayContractByToken(address _token)
        external
        view
        returns (address predictedAddress, bool isDeployed);
}

contract LlamaPayBot {
    using SafeTransferLib for ERC20;

    address public immutable factory;
    address public bot;
    address public llama;
    address public newLlama = address(0);
    uint256 public fee = 50000; // Covers bot gas cost for calling function

    event WithdrawScheduled(
        address owner,
        address token,
        address from,
        address to,
        uint216 amountPerSec,
        uint40 starts,
        uint40 frequency,
        bytes32 id
    );

    event WithdrawCancelled(
        address owner,
        address token,
        address from,
        address to,
        uint216 amountPerSec,
        uint40 starts,
        uint40 frequency,
        bytes32 id
    );

    event WithdrawExecuted(
        address owner,
        address token,
        address from,
        address to,
        uint216 amountPerSec,
        uint40 starts,
        uint40 frequency,
        bytes32 id
    );

    mapping(address => uint256) public balances;
    mapping(bytes32 => address) public owners;
    mapping(address => address) public redirects;

    constructor(
        address _factory,
        address _bot,
        address _llama
    ) {
        factory = _factory;
        bot = _bot;
        llama = _llama;
    }

    function deposit() external payable {
        require(msg.sender != bot, "bot cannot deposit");
        balances[msg.sender] += msg.value;
    }

    function refund() external {
        uint256 toSend = balances[msg.sender];
        balances[msg.sender] = 0;
        (bool sent, ) = msg.sender.call{value: toSend}("");
        require(sent, "failed to send ether");
    }

    function scheduleWithdraw(
        address _token,
        address _from,
        address _to,
        uint216 _amountPerSec,
        uint40 _starts,
        uint40 _frequency
    ) external returns (bytes32 id) {
        id = calcWithdrawId(
            _token,
            _from,
            _to,
            _amountPerSec,
            _starts,
            _frequency
        );
        require(owners[id] == address(0), "already exists");
        owners[id] = msg.sender;
        emit WithdrawScheduled(
            msg.sender,
            _token,
            _from,
            _to,
            _amountPerSec,
            _starts,
            _frequency,
            id
        );
    }

    function cancelWithdraw(
        address _token,
        address _from,
        address _to,
        uint216 _amountPerSec,
        uint40 _starts,
        uint40 _frequency
    ) external returns (bytes32 id) {
        id = calcWithdrawId(
            _token,
            _from,
            _to,
            _amountPerSec,
            _starts,
            _frequency
        );
        require(msg.sender == owners[id], "not owner");
        owners[id] = address(0);
        emit WithdrawCancelled(
            msg.sender,
            _token,
            _from,
            _to,
            _amountPerSec,
            _starts,
            _frequency,
            id
        );
    }

    function setRedirect(address _to) external {
        redirects[msg.sender] = _to;
    }

    function cancelRedirect() external {
        redirects[msg.sender] = address(0);
    }

    function executeWithdraw(
        address _owner,
        address _token,
        address _from,
        address _to,
        uint216 _amountPerSec,
        uint40 _starts,
        uint40 _frequency,
        bytes32 _id,
        bool _execute,
        bool _emitEvent
    ) external {
        require(msg.sender == bot, "not bot");
        if (_execute) {
            (address llamapay, bool isDeployed) = LlamaPayFactory(factory)
                .getLlamaPayContractByToken(_token);
            require(isDeployed, "invalid llamapay contract");
            if (redirects[_to] != address(0)) {
                (uint256 withdrawableAmount, , ) = LlamaPay(llamapay)
                    .withdrawable(_from, _to, _amountPerSec);
                LlamaPay(llamapay).withdraw(_from, _to, _amountPerSec);
                ERC20(_token).safeTransferFrom(
                    _to,
                    redirects[_to],
                    withdrawableAmount
                );
            } else {
                LlamaPay(llamapay).withdraw(_from, _to, _amountPerSec);
            }
        }
        if (_emitEvent) {
            emit WithdrawExecuted(
                _owner,
                _token,
                _from,
                _to,
                _amountPerSec,
                _starts,
                _frequency,
                _id
            );
        }
    }

    function execute(bytes[] calldata _calls, address _from) external {
        require(msg.sender == bot, "not bot");
        uint256 i;
        uint256 len = _calls.length;
        uint256 startGas = gasleft();
        for (i = 0; i < len; ++i) {
            address(this).delegatecall(_calls[i]);
        }
        uint256 gasUsed = ((startGas - gasleft()) + 21000) + fee;
        uint256 totalSpent = gasUsed * tx.gasprice;
        balances[_from] -= totalSpent;
        (bool sent, ) = bot.call{value: totalSpent}("");
        require(sent, "failed to send ether to bot");
    }

    function batchExecute(bytes[] calldata _calls) external {
        require(msg.sender == bot, "not bot");
        uint256 i;
        uint256 len = _calls.length;
        for (i = 0; i < len; ++i) {
            address(this).delegatecall(_calls[i]);
        }
    }

    function changeBot(address _newBot) external {
        require(msg.sender == llama, "not llama");
        bot = _newBot;
    }

    function changeLlama(address _newLlama) external {
        require(msg.sender == llama, "not llama");
        newLlama = _newLlama;
    }

    function confirmNewLlama() external {
        require(msg.sender == newLlama, "not new llama");
        llama = newLlama;
    }

    function changeFee(uint256 _newFee) external {
        require(msg.sender == llama, "not llama");
        fee = _newFee;
    }

    function calcWithdrawId(
        address _token,
        address _from,
        address _to,
        uint216 _amountPerSec,
        uint40 _starts,
        uint40 _frequency
    ) public pure returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(
                    _token,
                    _from,
                    _to,
                    _amountPerSec,
                    _starts,
                    _frequency
                )
            );
    }
}

File 2 of 3 : ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

File 3 of 3 : SafeTransferLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
            mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

Settings
{
  "remappings": [
    "ds-test/=lib/solmate/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "solmate/=lib/solmate/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_bot","type":"address"},{"internalType":"address","name":"_llama","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint216","name":"amountPerSec","type":"uint216"},{"indexed":false,"internalType":"uint40","name":"starts","type":"uint40"},{"indexed":false,"internalType":"uint40","name":"frequency","type":"uint40"},{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"WithdrawCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint216","name":"amountPerSec","type":"uint216"},{"indexed":false,"internalType":"uint40","name":"starts","type":"uint40"},{"indexed":false,"internalType":"uint40","name":"frequency","type":"uint40"},{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"WithdrawExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint216","name":"amountPerSec","type":"uint216"},{"indexed":false,"internalType":"uint40","name":"starts","type":"uint40"},{"indexed":false,"internalType":"uint40","name":"frequency","type":"uint40"},{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"WithdrawScheduled","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_calls","type":"bytes[]"}],"name":"batchExecute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bot","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint216","name":"_amountPerSec","type":"uint216"},{"internalType":"uint40","name":"_starts","type":"uint40"},{"internalType":"uint40","name":"_frequency","type":"uint40"}],"name":"calcWithdrawId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"cancelRedirect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint216","name":"_amountPerSec","type":"uint216"},{"internalType":"uint40","name":"_starts","type":"uint40"},{"internalType":"uint40","name":"_frequency","type":"uint40"}],"name":"cancelWithdraw","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newBot","type":"address"}],"name":"changeBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"changeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newLlama","type":"address"}],"name":"changeLlama","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmNewLlama","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"_calls","type":"bytes[]"},{"internalType":"address","name":"_from","type":"address"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint216","name":"_amountPerSec","type":"uint216"},{"internalType":"uint40","name":"_starts","type":"uint40"},{"internalType":"uint40","name":"_frequency","type":"uint40"},{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"bool","name":"_execute","type":"bool"},{"internalType":"bool","name":"_emitEvent","type":"bool"}],"name":"executeWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"llama","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newLlama","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"redirects","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint216","name":"_amountPerSec","type":"uint216"},{"internalType":"uint40","name":"_starts","type":"uint40"},{"internalType":"uint40","name":"_frequency","type":"uint40"}],"name":"scheduleWithdraw","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"setRedirect","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052600280546001600160a01b031916905561c3506003553480156200002757600080fd5b506040516200151a3803806200151a8339810160408190526200004a916200009e565b6001600160a01b03928316608052600080549284166001600160a01b031993841617905560018054919093169116179055620000e8565b80516001600160a01b03811681146200009957600080fd5b919050565b600080600060608486031215620000b457600080fd5b620000bf8462000081565b9250620000cf6020850162000081565b9150620000df6040850162000081565b90509250925092565b60805161140f6200010b600039600081816103460152610908015261140f6000f3fe6080604052600436106101355760003560e01c80639d97224a116100ab578063ddaea2fe1161006f578063ddaea2fe14610370578063ddc93f371461039f578063ddca3f43146103bf578063e6d8b7dc146103d5578063ea456e7c1461041f578063fb8ad6ff1461043f57600080fd5b80639d97224a146102be578063a01b5271146102de578063bc0d00f014610314578063c45a015514610334578063d0e30db01461036857600080fd5b80633e58e0a0116100fd5780633e58e0a014610214578063590e1ae314610229578063599360de1461023e5780636a1db1bf1461025e5780636e0462b11461027e578063856a65eb1461029e57600080fd5b806310814c371461013a5780631f25cfaf1461017757806327e235e314610199578063316ad930146101d4578063374d26d6146101f4575b600080fd5b34801561014657600080fd5b5060005461015a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561018357600080fd5b50610197610192366004610f25565b610475565b005b3480156101a557600080fd5b506101c66101b4366004610f25565b60046020526000908152604090205481565b60405190815260200161016e565b3480156101e057600080fd5b506101c66101ef366004610f7a565b6104ca565b34801561020057600080fd5b5061019761020f366004610f25565b6105a3565b34801561022057600080fd5b506101976105ef565b34801561023557600080fd5b5061019761065d565b34801561024a57600080fd5b506101c6610259366004610f7a565b610703565b34801561026a57600080fd5b50610197610279366004610ff4565b6107c2565b34801561028a57600080fd5b5060015461015a906001600160a01b031681565b3480156102aa57600080fd5b506101976102b9366004611059565b6107f1565b3480156102ca57600080fd5b5060025461015a906001600160a01b031681565b3480156102ea57600080fd5b5061015a6102f9366004610f25565b6006602052600090815260409020546001600160a01b031681565b34801561032057600080fd5b5061019761032f3660046110a9565b6108b4565b34801561034057600080fd5b5061015a7f000000000000000000000000000000000000000000000000000000000000000081565b610197610bad565b34801561037c57600080fd5b5061019733600090815260066020526040902080546001600160a01b0319169055565b3480156103ab57600080fd5b506101c66103ba366004610f7a565b610c22565b3480156103cb57600080fd5b506101c660035481565b3480156103e157600080fd5b506101976103f0366004610f25565b33600090815260066020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b34801561042b57600080fd5b5061019761043a36600461116a565b610caa565b34801561044b57600080fd5b5061015a61045a366004610ff4565b6005602052600090815260409020546001600160a01b031681565b6001546001600160a01b031633146104a85760405162461bcd60e51b815260040161049f906111c1565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006104da878787878787610c22565b6000818152600560205260409020549091506001600160a01b0316156105335760405162461bcd60e51b815260206004820152600e60248201526d616c72656164792065786973747360901b604482015260640161049f565b6000818152600560205260409081902080546001600160a01b0319163390811790915590517f2964df00d05d867fb39d81ec5ed1d5ab5125691de320bbc5cfc5faf7a550536991610591918a908a908a908a908a908a908a906111e4565b60405180910390a19695505050505050565b6001546001600160a01b031633146105cd5760405162461bcd60e51b815260040161049f906111c1565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146106395760405162461bcd60e51b815260206004820152600d60248201526c6e6f74206e6577206c6c616d6160981b604482015260640161049f565b600254600180546001600160a01b0319166001600160a01b03909216919091179055565b33600081815260046020526040808220805490839055905190929083908381818185875af1925050503d80600081146106b2576040519150601f19603f3d011682016040523d82523d6000602084013e6106b7565b606091505b50509050806106ff5760405162461bcd60e51b81526020600482015260146024820152733330b4b632b2103a379039b2b7321032ba3432b960611b604482015260640161049f565b5050565b6000610713878787878787610c22565b6000818152600560205260409020549091506001600160a01b031633146107685760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015260640161049f565b6000818152600560205260409081902080546001600160a01b0319169055517f2d7e851ad23abc91818637874db4164af53ae6d837db0c7d96f847a556ab2f69906105919033908a908a908a908a908a908a908a906111e4565b6001546001600160a01b031633146107ec5760405162461bcd60e51b815260040161049f906111c1565b600355565b6000546001600160a01b0316331461081b5760405162461bcd60e51b815260040161049f9061123d565b6000815b808210156108ae573084848481811061083a5761083a61125e565b905060200281019061084c9190611274565b60405161085a9291906112bb565b600060405180830381855af49150503d8060008114610895576040519150601f19603f3d011682016040523d82523d6000602084013e61089a565b606091505b505050816108a7906112e1565b915061081f565b50505050565b6000546001600160a01b031633146108de5760405162461bcd60e51b815260040161049f9061123d565b8115610b55576040516367420bf360e11b81526001600160a01b038a8116600483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063ce8417e6906024016040805180830381865afa15801561094e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097291906112fa565b91509150806109c35760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964206c6c616d6170617920636f6e747261637400000000000000604482015260640161049f565b6001600160a01b038981166000908152600660205260409020541615610aef57604051633f053acd60e01b81526000906001600160a01b03841690633f053acd90610a16908e908e908e90600401611334565b606060405180830381865afa158015610a33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a579190611360565b50506040516305e959b960e21b81529091506001600160a01b038416906317a566e490610a8c908e908e908e90600401611334565b600060405180830381600087803b158015610aa657600080fd5b505af1158015610aba573d6000803e3d6000fd5b5050506001600160a01b03808c16600090815260066020526040902054610ae992508e8216918d911684610e83565b50610b52565b6040516305e959b960e21b81526001600160a01b038316906317a566e490610b1f908d908d908d90600401611334565b600060405180830381600087803b158015610b3957600080fd5b505af1158015610b4d573d6000803e3d6000fd5b505050505b50505b8015610ba1577ff02b6913a0661fd5a19a298c7bac40f63b16c538b8799cf36812e1224e2e9c608a8a8a8a8a8a8a8a604051610b989897969594939291906111e4565b60405180910390a15b50505050505050505050565b6000546001600160a01b03163303610bfc5760405162461bcd60e51b8152602060048201526012602482015271189bdd0818d85b9b9bdd0819195c1bdcda5d60721b604482015260640161049f565b3360009081526004602052604081208054349290610c1b90849061138e565b9091555050565b6040516bffffffffffffffffffffffff19606088811b8216602084015287811b8216603484015286901b16604882015264ffffffffff19602885901b16605c8201526001600160d81b031960d884811b8216607784015283901b16607c8201526000906081016040516020818303038152906040528051906020012090509695505050505050565b6000546001600160a01b03163314610cd45760405162461bcd60e51b815260040161049f9061123d565b600082815a9050600092505b81831015610d6f5730868685818110610cfb57610cfb61125e565b9050602002810190610d0d9190611274565b604051610d1b9291906112bb565b600060405180830381855af49150503d8060008114610d56576040519150601f19603f3d011682016040523d82523d6000602084013e610d5b565b606091505b50505082610d68906112e1565b9250610ce0565b60006003545a610d7f90846113a7565b610d8b9061520861138e565b610d95919061138e565b90506000610da33a836113ba565b6001600160a01b038716600090815260046020526040812080549293508392909190610dd09084906113a7565b9091555050600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610e22576040519150601f19603f3d011682016040523d82523d6000602084013e610e27565b606091505b5050905080610e785760405162461bcd60e51b815260206004820152601b60248201527f6661696c656420746f2073656e6420657468657220746f20626f740000000000604482015260640161049f565b505050505050505050565b60006040516323b872dd60e01b81528460048201528360248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080610f065760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b604482015260640161049f565b5050505050565b6001600160a01b0381168114610f2257600080fd5b50565b600060208284031215610f3757600080fd5b8135610f4281610f0d565b9392505050565b80356001600160d81b0381168114610f6057600080fd5b919050565b803564ffffffffff81168114610f6057600080fd5b60008060008060008060c08789031215610f9357600080fd5b8635610f9e81610f0d565b95506020870135610fae81610f0d565b94506040870135610fbe81610f0d565b9350610fcc60608801610f49565b9250610fda60808801610f65565b9150610fe860a08801610f65565b90509295509295509295565b60006020828403121561100657600080fd5b5035919050565b60008083601f84011261101f57600080fd5b50813567ffffffffffffffff81111561103757600080fd5b6020830191508360208260051b850101111561105257600080fd5b9250929050565b6000806020838503121561106c57600080fd5b823567ffffffffffffffff81111561108357600080fd5b61108f8582860161100d565b90969095509350505050565b8015158114610f2257600080fd5b6000806000806000806000806000806101408b8d0312156110c957600080fd5b8a356110d481610f0d565b995060208b01356110e481610f0d565b985060408b01356110f481610f0d565b975060608b013561110481610f0d565b965061111260808c01610f49565b955061112060a08c01610f65565b945061112e60c08c01610f65565b935060e08b013592506101008b01356111468161109b565b91506101208b01356111578161109b565b809150509295989b9194979a5092959850565b60008060006040848603121561117f57600080fd5b833567ffffffffffffffff81111561119657600080fd5b6111a28682870161100d565b90945092505060208401356111b681610f0d565b809150509250925092565b6020808252600990820152686e6f74206c6c616d6160b81b604082015260600190565b6001600160a01b039889168152968816602088015294871660408701529290951660608501526001600160d81b0316608084015264ffffffffff93841660a084015290921660c082015260e08101919091526101000190565b6020808252600790820152661b9bdd08189bdd60ca1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261128b57600080fd5b83018035915067ffffffffffffffff8211156112a657600080fd5b60200191503681900382131561105257600080fd5b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b6000600182016112f3576112f36112cb565b5060010190565b6000806040838503121561130d57600080fd5b825161131881610f0d565b60208401519092506113298161109b565b809150509250929050565b6001600160a01b0393841681529190921660208201526001600160d81b03909116604082015260600190565b60008060006060848603121561137557600080fd5b8351925060208401519150604084015190509250925092565b808201808211156113a1576113a16112cb565b92915050565b818103818111156113a1576113a16112cb565b60008160001904831182151516156113d4576113d46112cb565b50029056fea26469706673582212209425bbcfd43ee23f3629d3270c2faa4a5f9b0987bfaef7ed18c6c50e79895c5a64736f6c63430008100033000000000000000000000000de1c04855c2828431ba637675b6929a684f84c7f000000000000000000000000a43bc77e5362a81b3ab7accd8b7812a981bda478000000000000000000000000ad730d8e730c99e205a371436ce2e5acfc38d7f9

Deployed Bytecode

0x6080604052600436106101355760003560e01c80639d97224a116100ab578063ddaea2fe1161006f578063ddaea2fe14610370578063ddc93f371461039f578063ddca3f43146103bf578063e6d8b7dc146103d5578063ea456e7c1461041f578063fb8ad6ff1461043f57600080fd5b80639d97224a146102be578063a01b5271146102de578063bc0d00f014610314578063c45a015514610334578063d0e30db01461036857600080fd5b80633e58e0a0116100fd5780633e58e0a014610214578063590e1ae314610229578063599360de1461023e5780636a1db1bf1461025e5780636e0462b11461027e578063856a65eb1461029e57600080fd5b806310814c371461013a5780631f25cfaf1461017757806327e235e314610199578063316ad930146101d4578063374d26d6146101f4575b600080fd5b34801561014657600080fd5b5060005461015a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561018357600080fd5b50610197610192366004610f25565b610475565b005b3480156101a557600080fd5b506101c66101b4366004610f25565b60046020526000908152604090205481565b60405190815260200161016e565b3480156101e057600080fd5b506101c66101ef366004610f7a565b6104ca565b34801561020057600080fd5b5061019761020f366004610f25565b6105a3565b34801561022057600080fd5b506101976105ef565b34801561023557600080fd5b5061019761065d565b34801561024a57600080fd5b506101c6610259366004610f7a565b610703565b34801561026a57600080fd5b50610197610279366004610ff4565b6107c2565b34801561028a57600080fd5b5060015461015a906001600160a01b031681565b3480156102aa57600080fd5b506101976102b9366004611059565b6107f1565b3480156102ca57600080fd5b5060025461015a906001600160a01b031681565b3480156102ea57600080fd5b5061015a6102f9366004610f25565b6006602052600090815260409020546001600160a01b031681565b34801561032057600080fd5b5061019761032f3660046110a9565b6108b4565b34801561034057600080fd5b5061015a7f000000000000000000000000de1c04855c2828431ba637675b6929a684f84c7f81565b610197610bad565b34801561037c57600080fd5b5061019733600090815260066020526040902080546001600160a01b0319169055565b3480156103ab57600080fd5b506101c66103ba366004610f7a565b610c22565b3480156103cb57600080fd5b506101c660035481565b3480156103e157600080fd5b506101976103f0366004610f25565b33600090815260066020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b34801561042b57600080fd5b5061019761043a36600461116a565b610caa565b34801561044b57600080fd5b5061015a61045a366004610ff4565b6005602052600090815260409020546001600160a01b031681565b6001546001600160a01b031633146104a85760405162461bcd60e51b815260040161049f906111c1565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006104da878787878787610c22565b6000818152600560205260409020549091506001600160a01b0316156105335760405162461bcd60e51b815260206004820152600e60248201526d616c72656164792065786973747360901b604482015260640161049f565b6000818152600560205260409081902080546001600160a01b0319163390811790915590517f2964df00d05d867fb39d81ec5ed1d5ab5125691de320bbc5cfc5faf7a550536991610591918a908a908a908a908a908a908a906111e4565b60405180910390a19695505050505050565b6001546001600160a01b031633146105cd5760405162461bcd60e51b815260040161049f906111c1565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146106395760405162461bcd60e51b815260206004820152600d60248201526c6e6f74206e6577206c6c616d6160981b604482015260640161049f565b600254600180546001600160a01b0319166001600160a01b03909216919091179055565b33600081815260046020526040808220805490839055905190929083908381818185875af1925050503d80600081146106b2576040519150601f19603f3d011682016040523d82523d6000602084013e6106b7565b606091505b50509050806106ff5760405162461bcd60e51b81526020600482015260146024820152733330b4b632b2103a379039b2b7321032ba3432b960611b604482015260640161049f565b5050565b6000610713878787878787610c22565b6000818152600560205260409020549091506001600160a01b031633146107685760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015260640161049f565b6000818152600560205260409081902080546001600160a01b0319169055517f2d7e851ad23abc91818637874db4164af53ae6d837db0c7d96f847a556ab2f69906105919033908a908a908a908a908a908a908a906111e4565b6001546001600160a01b031633146107ec5760405162461bcd60e51b815260040161049f906111c1565b600355565b6000546001600160a01b0316331461081b5760405162461bcd60e51b815260040161049f9061123d565b6000815b808210156108ae573084848481811061083a5761083a61125e565b905060200281019061084c9190611274565b60405161085a9291906112bb565b600060405180830381855af49150503d8060008114610895576040519150601f19603f3d011682016040523d82523d6000602084013e61089a565b606091505b505050816108a7906112e1565b915061081f565b50505050565b6000546001600160a01b031633146108de5760405162461bcd60e51b815260040161049f9061123d565b8115610b55576040516367420bf360e11b81526001600160a01b038a8116600483015260009182917f000000000000000000000000de1c04855c2828431ba637675b6929a684f84c7f169063ce8417e6906024016040805180830381865afa15801561094e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097291906112fa565b91509150806109c35760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964206c6c616d6170617920636f6e747261637400000000000000604482015260640161049f565b6001600160a01b038981166000908152600660205260409020541615610aef57604051633f053acd60e01b81526000906001600160a01b03841690633f053acd90610a16908e908e908e90600401611334565b606060405180830381865afa158015610a33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a579190611360565b50506040516305e959b960e21b81529091506001600160a01b038416906317a566e490610a8c908e908e908e90600401611334565b600060405180830381600087803b158015610aa657600080fd5b505af1158015610aba573d6000803e3d6000fd5b5050506001600160a01b03808c16600090815260066020526040902054610ae992508e8216918d911684610e83565b50610b52565b6040516305e959b960e21b81526001600160a01b038316906317a566e490610b1f908d908d908d90600401611334565b600060405180830381600087803b158015610b3957600080fd5b505af1158015610b4d573d6000803e3d6000fd5b505050505b50505b8015610ba1577ff02b6913a0661fd5a19a298c7bac40f63b16c538b8799cf36812e1224e2e9c608a8a8a8a8a8a8a8a604051610b989897969594939291906111e4565b60405180910390a15b50505050505050505050565b6000546001600160a01b03163303610bfc5760405162461bcd60e51b8152602060048201526012602482015271189bdd0818d85b9b9bdd0819195c1bdcda5d60721b604482015260640161049f565b3360009081526004602052604081208054349290610c1b90849061138e565b9091555050565b6040516bffffffffffffffffffffffff19606088811b8216602084015287811b8216603484015286901b16604882015264ffffffffff19602885901b16605c8201526001600160d81b031960d884811b8216607784015283901b16607c8201526000906081016040516020818303038152906040528051906020012090509695505050505050565b6000546001600160a01b03163314610cd45760405162461bcd60e51b815260040161049f9061123d565b600082815a9050600092505b81831015610d6f5730868685818110610cfb57610cfb61125e565b9050602002810190610d0d9190611274565b604051610d1b9291906112bb565b600060405180830381855af49150503d8060008114610d56576040519150601f19603f3d011682016040523d82523d6000602084013e610d5b565b606091505b50505082610d68906112e1565b9250610ce0565b60006003545a610d7f90846113a7565b610d8b9061520861138e565b610d95919061138e565b90506000610da33a836113ba565b6001600160a01b038716600090815260046020526040812080549293508392909190610dd09084906113a7565b9091555050600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610e22576040519150601f19603f3d011682016040523d82523d6000602084013e610e27565b606091505b5050905080610e785760405162461bcd60e51b815260206004820152601b60248201527f6661696c656420746f2073656e6420657468657220746f20626f740000000000604482015260640161049f565b505050505050505050565b60006040516323b872dd60e01b81528460048201528360248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080610f065760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b604482015260640161049f565b5050505050565b6001600160a01b0381168114610f2257600080fd5b50565b600060208284031215610f3757600080fd5b8135610f4281610f0d565b9392505050565b80356001600160d81b0381168114610f6057600080fd5b919050565b803564ffffffffff81168114610f6057600080fd5b60008060008060008060c08789031215610f9357600080fd5b8635610f9e81610f0d565b95506020870135610fae81610f0d565b94506040870135610fbe81610f0d565b9350610fcc60608801610f49565b9250610fda60808801610f65565b9150610fe860a08801610f65565b90509295509295509295565b60006020828403121561100657600080fd5b5035919050565b60008083601f84011261101f57600080fd5b50813567ffffffffffffffff81111561103757600080fd5b6020830191508360208260051b850101111561105257600080fd5b9250929050565b6000806020838503121561106c57600080fd5b823567ffffffffffffffff81111561108357600080fd5b61108f8582860161100d565b90969095509350505050565b8015158114610f2257600080fd5b6000806000806000806000806000806101408b8d0312156110c957600080fd5b8a356110d481610f0d565b995060208b01356110e481610f0d565b985060408b01356110f481610f0d565b975060608b013561110481610f0d565b965061111260808c01610f49565b955061112060a08c01610f65565b945061112e60c08c01610f65565b935060e08b013592506101008b01356111468161109b565b91506101208b01356111578161109b565b809150509295989b9194979a5092959850565b60008060006040848603121561117f57600080fd5b833567ffffffffffffffff81111561119657600080fd5b6111a28682870161100d565b90945092505060208401356111b681610f0d565b809150509250925092565b6020808252600990820152686e6f74206c6c616d6160b81b604082015260600190565b6001600160a01b039889168152968816602088015294871660408701529290951660608501526001600160d81b0316608084015264ffffffffff93841660a084015290921660c082015260e08101919091526101000190565b6020808252600790820152661b9bdd08189bdd60ca1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261128b57600080fd5b83018035915067ffffffffffffffff8211156112a657600080fd5b60200191503681900382131561105257600080fd5b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b6000600182016112f3576112f36112cb565b5060010190565b6000806040838503121561130d57600080fd5b825161131881610f0d565b60208401519092506113298161109b565b809150509250929050565b6001600160a01b0393841681529190921660208201526001600160d81b03909116604082015260600190565b60008060006060848603121561137557600080fd5b8351925060208401519150604084015190509250925092565b808201808211156113a1576113a16112cb565b92915050565b818103818111156113a1576113a16112cb565b60008160001904831182151516156113d4576113d46112cb565b50029056fea26469706673582212209425bbcfd43ee23f3629d3270c2faa4a5f9b0987bfaef7ed18c6c50e79895c5a64736f6c63430008100033

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

000000000000000000000000de1c04855c2828431ba637675b6929a684f84c7f000000000000000000000000a43bc77e5362a81b3ab7accd8b7812a981bda478000000000000000000000000ad730d8e730c99e205a371436ce2e5acfc38d7f9

-----Decoded View---------------
Arg [0] : _factory (address): 0xde1C04855c2828431ba637675B6929A684f84C7F
Arg [1] : _bot (address): 0xA43bC77e5362a81b3AB7acCD8B7812a981bdA478
Arg [2] : _llama (address): 0xad730D8e730c99E205A371436cE2e5aCFC38D7F9

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000de1c04855c2828431ba637675b6929a684f84c7f
Arg [1] : 000000000000000000000000a43bc77e5362a81b3ab7accd8b7812a981bda478
Arg [2] : 000000000000000000000000ad730d8e730c99e205a371436ce2e5acfc38d7f9


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.