Skip to content

Commit

Permalink
feat: add ERCTokenCallbacks Extension
Browse files Browse the repository at this point in the history
  • Loading branch information
YamenMerhi committed Aug 28, 2024
1 parent 516e98f commit e8c35ca
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 0 deletions.
62 changes: 62 additions & 0 deletions packages/lsp17-contracts/contracts/ERCTokenCallbacks.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.4;

import {
ERC721Holder,
IERC721Receiver
} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";

import {
ERC1155Holder,
ERC1155Receiver
} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";

import {
IERC777Recipient
} from "@openzeppelin/contracts/token/ERC777/IERC777Recipient.sol";

import {
LSP17Extension
} from "@lukso/lsp17contractextension-contracts/contracts/LSP17Extension.sol";

/**
* @dev LSP17 Extension that can be attached to a LSP17Extendable contract
* to allow it to receive ERC721 tokens via `safeTransferFrom`.
*/
// solhint-disable-next-line no-empty-blocks
contract ERCTokenCallbacks is
ERC721Holder,
ERC1155Holder,
IERC777Recipient,
LSP17Extension
{
function tokensReceived(
address operator,
address from,
address to,
uint256 amount,
bytes calldata userData,
bytes calldata operatorData
) external override {
// solhint-disable-previous-line no-empty-blocks
}

/**
* @notice Implements ERC165 interface support for ERC1155TokenReceiver, ERC721TokenReceiver and IERC165.
* @param interfaceId Id of the interface.
* @return if the interface is supported.
*/
function supportsInterface(
bytes4 interfaceId
)
public
view
virtual
override(ERC1155Receiver, LSP17Extension)
returns (bool)
{
return
interfaceId == type(IERC721Receiver).interfaceId ||
super.supportsInterface(interfaceId);
}
}
31 changes: 31 additions & 0 deletions packages/lsp17-contracts/tests/ERCTokenCallbacks.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { expect } from 'chai';
import { ethers } from 'hardhat';
import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers';
import { ERCTokenCallbacks, ERCTokenCallbacks__factory } from '../types';
import { INTERFACE_ID_LSP17Extension } from '../constants.ts';

describe('testing `ERCTokenCallbacks`', () => {
let context: {
tokenCallbacks: ERCTokenCallbacks;
owner: SignerWithAddress;
};

before(async () => {
const [owner] = await ethers.getSigners();
const tokenCallbacks = await new ERCTokenCallbacks__factory(owner).deploy();

context = {
tokenCallbacks,
owner,
};
});

describe('testing `supportsInterface`', () => {
it('should return true for supported interface IDs', async () => {
expect(await context.tokenCallbacks.supportsInterface(INTERFACE_ID_LSP17Extension)).to.be
.true; // LSP17Extension interface ID
expect(await context.tokenCallbacks.supportsInterface('0x01ffc9a7')).to.be.true; // ERC721Holder interface ID
expect(await context.tokenCallbacks.supportsInterface('0x4e2312e0')).to.be.true; // ERC1155Holder interface ID
});
});
});

0 comments on commit e8c35ca

Please sign in to comment.