mirror of
https://github.com/autistic-symposium/web3-starter-sol.git
synced 2025-07-22 06:38:57 -04:00
65 lines
1.7 KiB
Solidity
65 lines
1.7 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.18;
|
|
|
|
// gaslless erc20 token transfer with meta transaction
|
|
|
|
interface IERC20Permit {
|
|
function totalSupply() external view returns (uint256);
|
|
|
|
function balanceOf(address account) external view returns (uint256);
|
|
|
|
function transfer(address recipient, uint256 amount) external returns (bool);
|
|
|
|
function allowance(address owner, address spender) external view returns (uint256);
|
|
|
|
function approve(address spender, uint256 amount) external returns (bool);
|
|
|
|
function transferFrom(
|
|
address sender,
|
|
address recipient,
|
|
uint256 amount
|
|
) external returns (bool);
|
|
|
|
function permit(
|
|
address owner,
|
|
address spender,
|
|
uint256 value,
|
|
uint256 deadline,
|
|
uint8 v,
|
|
bytes32 r,
|
|
bytes32 s
|
|
) external;
|
|
|
|
event Transfer(address indexed from, address indexed to, uint256 value);
|
|
event Approval(address indexed owner, address indexed spender, uint256 value);
|
|
}
|
|
|
|
contract GaslessTokenTransfer {
|
|
function send(
|
|
address token,
|
|
address sender,
|
|
address receiver,
|
|
uint256 amount,
|
|
uint256 fee,
|
|
uint256 deadline,
|
|
// Permit signature
|
|
uint8 v,
|
|
bytes32 r,
|
|
bytes32 s
|
|
) external {
|
|
// Permit
|
|
IERC20Permit(token).permit(
|
|
sender,
|
|
address(this),
|
|
amount + fee,
|
|
deadline,
|
|
v,
|
|
r,
|
|
s
|
|
);
|
|
// Send amount to receiver
|
|
IERC20Permit(token).transferFrom(sender, receiver, amount);
|
|
// Take fee - send fee to msg.sender
|
|
IERC20Permit(token).transferFrom(sender, msg.sender, fee);
|
|
}
|
|
}
|