ERC-1363 allows to implement an ERC-20 token that can be used for payments.
This is an implementation of the ERC-1363 Payable Token that defines a token interface for ERC-20 tokens that supports executing recipient code after transfer or transferFrom, or spender code after approve.
There is no way to execute code after an ERC-20 transfer or approval (i.e. making a payment), so to make an action it is required to send another transaction and pay GAS twice. ERC-1363 makes token payments easier and working without the use of any other listener. It allows to make a callback after a transfer or approval in a single transaction.
There are many proposed uses of Ethereum smart contracts that can accept ERC-20 payments.
Examples could be:
- to create a token payable crowdsale
- selling services for tokens
- paying invoices
- making subscriptions
For these reasons it was named as "Payable Token".
Anyway you can use it for specific utilities or for any other purposes who require the execution of a callback after a transfer or approval received.
npm install erc-payable-tokenpragma solidity ^0.8.0;
import "erc-payable-token/contracts/token/ERC1363/ERC1363.sol";
contract MyToken is ERC1363 {
constructor (
string memory name,
string memory symbol
) ERC20(name, symbol) {
// your stuff
}
// your stuff
}This repo contains:
Interface for a Payable Token contract as defined in ERC-1363 Payable Token.
interface IERC1363 is IERC20, IERC165 {
function transferAndCall(address recipient, uint256 amount) external returns (bool);
function transferAndCall(address recipient, uint256 amount, bytes calldata data) external returns (bool);
function transferFromAndCall(address sender, address recipient, uint256 amount) external returns (bool);
function transferFromAndCall(address sender, address recipient, uint256 amount, bytes calldata data) external returns (bool);
function approveAndCall(address spender, uint256 amount) external returns (bool);
function approveAndCall(address spender, uint256 amount, bytes calldata data) external returns (bool);
}Implementation of an IERC1363 interface.
Interface for any contract that wants to support transferAndCall or transferFromAndCall from ERC1363 token contracts.
interface IERC1363Receiver {
function onTransferReceived(address operator, address sender, uint256 amount, bytes calldata data) external returns (bytes4);
}Interface for any contract that wants to support approveAndCall from ERC1363 token contracts.
interface IERC1363Spender {
function onApprovalReceived(address sender, uint256 amount, bytes calldata data) external returns (bytes4);
}Implementation proposal of a contract that wants to accept ERC1363 payments. It intercepts what is the ERC1363 token desired for payments and throws if another is sent.
It emits a TokensReceived event to notify the transfer received by the contract.
It also implements a transferReceived function that can be overridden to make your stuffs within your contract after a onTransferReceived.
It emits a TokensApproved event to notify the approval received by the contract.
It also implements a approvalReceived function that can be overridden to make your stuffs within your contract after a onApprovalReceived.
As example: an Implementation of a classic token Crowdsale, but paid with ERC1363 tokens instead of ETH.
npm installUse Solhint
npm run lint:solUse ESLint
npm run lint:jsUse Eslint and fix
npm run lint:fixOpen the Truffle console
npm run truffle:consolenpm run truffle:compilenpm run truffle:testOpen the Hardhat console
npm run hardhat:consolenpm run hardhat:compilenpm run hardhat:testnpm run hardhat:coverageCode released under the MIT License.