123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- const { ethers } = require('hardhat');
- const { expect } = require('chai');
- const { shouldSupportInterfaces } = require('../../utils/introspection/SupportsInterface.behavior');
- function shouldBehaveLikeERC2981() {
- const royaltyFraction = 10n;
- shouldSupportInterfaces(['ERC2981']);
- describe('default royalty', function () {
- beforeEach(async function () {
- await this.token.$_setDefaultRoyalty(this.account1, royaltyFraction);
- });
- it('checks royalty is set', async function () {
- expect(await this.token.royaltyInfo(this.tokenId1, this.salePrice)).to.deep.equal([
- this.account1.address,
- (this.salePrice * royaltyFraction) / 10_000n,
- ]);
- });
- it('updates royalty amount', async function () {
- const newFraction = 25n;
- await this.token.$_setDefaultRoyalty(this.account1, newFraction);
- expect(await this.token.royaltyInfo(this.tokenId1, this.salePrice)).to.deep.equal([
- this.account1.address,
- (this.salePrice * newFraction) / 10_000n,
- ]);
- });
- it('holds same royalty value for different tokens', async function () {
- const newFraction = 20n;
- await this.token.$_setDefaultRoyalty(this.account1, newFraction);
- expect(await this.token.royaltyInfo(this.tokenId1, this.salePrice)).to.deep.equal(
- await this.token.royaltyInfo(this.tokenId2, this.salePrice),
- );
- });
- it('Remove royalty information', async function () {
- const newValue = 0n;
- await this.token.$_deleteDefaultRoyalty();
- expect(await this.token.royaltyInfo(this.tokenId1, this.salePrice)).to.deep.equal([ethers.ZeroAddress, newValue]);
- expect(await this.token.royaltyInfo(this.tokenId2, this.salePrice)).to.deep.equal([ethers.ZeroAddress, newValue]);
- });
- it('reverts if invalid parameters', async function () {
- const royaltyDenominator = await this.token.$_feeDenominator();
- await expect(this.token.$_setDefaultRoyalty(ethers.ZeroAddress, royaltyFraction))
- .to.be.revertedWithCustomError(this.token, 'ERC2981InvalidDefaultRoyaltyReceiver')
- .withArgs(ethers.ZeroAddress);
- const anotherRoyaltyFraction = 11000n;
- await expect(this.token.$_setDefaultRoyalty(this.account1, anotherRoyaltyFraction))
- .to.be.revertedWithCustomError(this.token, 'ERC2981InvalidDefaultRoyalty')
- .withArgs(anotherRoyaltyFraction, royaltyDenominator);
- });
- });
- describe('token based royalty', function () {
- beforeEach(async function () {
- await this.token.$_setTokenRoyalty(this.tokenId1, this.account1, royaltyFraction);
- });
- it('updates royalty amount', async function () {
- const newFraction = 25n;
- expect(await this.token.royaltyInfo(this.tokenId1, this.salePrice)).to.deep.equal([
- this.account1.address,
- (this.salePrice * royaltyFraction) / 10_000n,
- ]);
- await this.token.$_setTokenRoyalty(this.tokenId1, this.account1, newFraction);
- expect(await this.token.royaltyInfo(this.tokenId1, this.salePrice)).to.deep.equal([
- this.account1.address,
- (this.salePrice * newFraction) / 10_000n,
- ]);
- });
- it('holds different values for different tokens', async function () {
- const newFraction = 20n;
- await this.token.$_setTokenRoyalty(this.tokenId2, this.account1, newFraction);
- expect(await this.token.royaltyInfo(this.tokenId1, this.salePrice)).to.not.deep.equal(
- await this.token.royaltyInfo(this.tokenId2, this.salePrice),
- );
- });
- it('reverts if invalid parameters', async function () {
- const royaltyDenominator = await this.token.$_feeDenominator();
- await expect(this.token.$_setTokenRoyalty(this.tokenId1, ethers.ZeroAddress, royaltyFraction))
- .to.be.revertedWithCustomError(this.token, 'ERC2981InvalidTokenRoyaltyReceiver')
- .withArgs(this.tokenId1, ethers.ZeroAddress);
- const anotherRoyaltyFraction = 11000n;
- await expect(this.token.$_setTokenRoyalty(this.tokenId1, this.account1, anotherRoyaltyFraction))
- .to.be.revertedWithCustomError(this.token, 'ERC2981InvalidTokenRoyalty')
- .withArgs(this.tokenId1, anotherRoyaltyFraction, royaltyDenominator);
- });
- it('can reset token after setting royalty', async function () {
- const newFraction = 30n;
- await this.token.$_setTokenRoyalty(this.tokenId1, this.account2, newFraction);
- // Tokens must have own information
- expect(await this.token.royaltyInfo(this.tokenId1, this.salePrice)).to.deep.equal([
- this.account2.address,
- (this.salePrice * newFraction) / 10_000n,
- ]);
- await this.token.$_setTokenRoyalty(this.tokenId2, this.account1, 0n);
- // Token must not share default information
- expect(await this.token.royaltyInfo(this.tokenId2, this.salePrice)).to.deep.equal([this.account1.address, 0n]);
- });
- it('can hold default and token royalty information', async function () {
- const newFraction = 30n;
- await this.token.$_setTokenRoyalty(this.tokenId2, this.account2, newFraction);
- // Tokens must not have same values
- expect(await this.token.royaltyInfo(this.tokenId1, this.salePrice)).to.not.deep.equal([
- this.account2.address,
- (this.salePrice * newFraction) / 10_000n,
- ]);
- // Updated token must have new values
- expect(await this.token.royaltyInfo(this.tokenId2, this.salePrice)).to.deep.equal([
- this.account2.address,
- (this.salePrice * newFraction) / 10_000n,
- ]);
- });
- });
- }
- module.exports = {
- shouldBehaveLikeERC2981,
- };
|