erc-payable-token

ERC-1363 Payable Token Implementation

Usage no npm install needed!

<script type="module">
  import ercPayableToken from 'https://cdn.skypack.dev/erc-payable-token';
</script>

README

ERC-1363 Payable Token

NPM Package CI Coverage Status MIT licensed

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.

Abstract

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.

Install

npm install erc-payable-token

Usage

pragma 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
}

Code

This repo contains:

IERC1363

IERC1363.sol

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);
}

ERC1363

ERC1363.sol

Implementation of an IERC1363 interface.

IERC1363Receiver

IERC1363Receiver.sol

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);
}

IERC1363Spender

IERC1363Spender.sol

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);
}

ERC1363Payable

ERC1363Payable.sol

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.

ERC1363PayableCrowdsale

ERC1363PayableCrowdsale.sol

As example: an Implementation of a classic token Crowdsale, but paid with ERC1363 tokens instead of ETH.

Development

Install dependencies

npm install

Linter

Use Solhint

npm run lint:sol

Use ESLint

npm run lint:js

Use Eslint and fix

npm run lint:fix

Usage (using Truffle)

Open the Truffle console

npm run truffle:console

Compile

npm run truffle:compile

Test

npm run truffle:test

Usage (using Hardhat)

Open the Hardhat console

npm run hardhat:console

Compile

npm run hardhat:compile

Test

npm run hardhat:test

Code Coverage

npm run hardhat:coverage

License

Code released under the MIT License.