From d20ede8d4ef10df46bcadea8441c891e51edea3e Mon Sep 17 00:00:00 2001 From: EDUARDO MELO DE SIQUEIRA Date: Mon, 17 Jun 2024 14:14:16 -0300 Subject: [PATCH 1/7] fix: Create Offers reverts --- contracts/NftRentalMarketplace.sol | 17 ++++++++++-- test/NftRentalMarketplace.test.ts | 44 +++++++++++++++++++++++++++++- utils/constants.ts | 2 ++ 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/contracts/NftRentalMarketplace.sol b/contracts/NftRentalMarketplace.sol index 3662120..bea678c 100644 --- a/contracts/NftRentalMarketplace.sol +++ b/contracts/NftRentalMarketplace.sol @@ -106,6 +106,7 @@ contract NftRentalMarketplace is Initializable, OwnableUpgradeable, PausableUpgr * @dev To optimize for gas, only the offer hash is stored on-chain * @param _offer The rental offer struct. */ + function createRentalOffer(RentalOffer calldata _offer) external whenNotPaused { LibNftRentalMarketplace.validateCreateRentalOfferParams( oriumMarketplaceRoyalties, @@ -118,7 +119,7 @@ contract NftRentalMarketplace is Initializable, OwnableUpgradeable, PausableUpgr roleDeadline[_offer.roles[i]][_offer.tokenAddress][_offer.tokenId] < block.timestamp, 'NftRentalMarketplace: role still has an active offer' ); - roleDeadline[_offer.roles[i]][_offer.tokenAddress][_offer.tokenId] = _offer.deadline; + roleDeadline[_offer.roles[i]][_offer.tokenAddress][_offer.tokenId] = _offer.deadline - _offer.minDuration; } bytes32 _offerHash = LibNftRentalMarketplace.hashRentalOffer(_offer); @@ -149,7 +150,6 @@ contract NftRentalMarketplace is Initializable, OwnableUpgradeable, PausableUpgr function acceptRentalOffer(RentalOffer calldata _offer, uint64 _duration) external whenNotPaused { bytes32 _offerHash = LibNftRentalMarketplace.hashRentalOffer(_offer); uint64 _expirationDate = uint64(block.timestamp + _duration); - LibNftRentalMarketplace.validateAcceptRentalOfferParams( _offer.borrower, _offer.minDuration, @@ -180,6 +180,12 @@ contract NftRentalMarketplace is Initializable, OwnableUpgradeable, PausableUpgr _offer.rolesData ); + for (uint256 i = 0; i < _offer.roles.length; i++) { + if(_expirationDate > roleDeadline[_offer.roles[i]][_offer.tokenAddress][_offer.tokenId]) { + roleDeadline[_offer.roles[i]][_offer.tokenAddress][_offer.tokenId] = _expirationDate; + } + } + rentals[_offerHash] = Rental({ borrower: msg.sender, expirationDate: _expirationDate }); emit RentalStarted(_offer.lender, _offer.nonce, msg.sender, _expirationDate); @@ -282,7 +288,12 @@ contract NftRentalMarketplace is Initializable, OwnableUpgradeable, PausableUpgr nonceDeadline[msg.sender][_offer.nonce] = uint64(block.timestamp); for (uint256 i = 0; i < _offer.roles.length; i++) { - roleDeadline[_offer.roles[i]][_offer.tokenAddress][_offer.tokenId] = uint64(block.timestamp); + + if(rentals[_offerHash].expirationDate > uint64(block.timestamp)) { + roleDeadline[_offer.roles[i]][_offer.tokenAddress][_offer.tokenId] = rentals[_offerHash].expirationDate; + }else { + roleDeadline[_offer.roles[i]][_offer.tokenAddress][_offer.tokenId] = uint64(block.timestamp); + } } emit RentalOfferCancelled(_offer.lender, _offer.nonce); } diff --git a/test/NftRentalMarketplace.test.ts b/test/NftRentalMarketplace.test.ts index 7d948b8..8268666 100644 --- a/test/NftRentalMarketplace.test.ts +++ b/test/NftRentalMarketplace.test.ts @@ -4,7 +4,15 @@ import { loadFixture, time } from '@nomicfoundation/hardhat-network-helpers' import { expect } from 'chai' import { toWei } from '../utils/bignumber' import { GrantRoleParams, RentalOffer, RoyaltyInfo } from '../utils/types' -import { AddressZero, EMPTY_BYTES, ONE_DAY, ONE_HOUR, THREE_MONTHS } from '../utils/constants' +import { + AddressZero, + EMPTY_BYTES, + ONE_DAY, + ONE_HOUR, + THREE_MONTHS, + TWENTY_THREE_HOURS, + TEN_MINUTES, +} from '../utils/constants' import { randomBytes } from 'crypto' import { UNIQUE_ROLE, USER_ROLE } from '../utils/roles' import { @@ -163,6 +171,28 @@ describe('NftRentalMarketplace', () => { rentalOffer.rolesData, ) }) + it('Should create more than one rental offer for the same role, if the (Deadline - minduration) is reached ', async () => { + rentalOffer.minDuration = TWENTY_THREE_HOURS + await marketplace.connect(lender).createRentalOffer(rentalOffer) + await time.increase(ONE_HOUR) + rentalOffer.deadline = Number(await time.latest()) + ONE_DAY + rentalOffer.nonce = `0x${randomBytes(32).toString('hex')}` + await expect(marketplace.connect(lender).createRentalOffer(rentalOffer)) + .to.emit(marketplace, 'RentalOfferCreated') + .withArgs( + rentalOffer.nonce, + rentalOffer.tokenAddress, + rentalOffer.tokenId, + rentalOffer.lender, + rentalOffer.borrower, + rentalOffer.feeTokenAddress, + rentalOffer.feeAmountPerSecond, + rentalOffer.deadline, + rentalOffer.minDuration, + rentalOffer.roles, + rentalOffer.rolesData, + ) + }) it('Should create rental offer if token is already deposited in rolesRegistry', async function () { await mockERC721.connect(lender).approve(await rolesRegistry.getAddress(), tokenId) await rolesRegistry.connect(lender).grantRole({ @@ -191,6 +221,7 @@ describe('NftRentalMarketplace', () => { rentalOffer.rolesData, ) }) + it('Should NOT create a rental offer if contract is paused', async () => { await marketplace.connect(operator).pause() await expect(marketplace.connect(lender).createRentalOffer(rentalOffer)).to.be.revertedWith( @@ -272,6 +303,17 @@ describe('NftRentalMarketplace', () => { 'NftRentalMarketplace: role still has an active offer', ) }) + it('Should NOT create more than one rental when the (Deadline - minduration) is not be reached. ', async () => { + rentalOffer.nonce = `0x${randomBytes(32).toString('hex')}` + rentalOffer.minDuration = TWENTY_THREE_HOURS + await marketplace.connect(lender).createRentalOffer(rentalOffer) + await time.increase(TEN_MINUTES) + + rentalOffer.nonce = `0x${randomBytes(32).toString('hex')}` + await expect(marketplace.connect(lender).createRentalOffer(rentalOffer)).to.be.revertedWith( + 'NftRentalMarketplace: role still has an active offer', + ) + }) }) }) diff --git a/utils/constants.ts b/utils/constants.ts index 03ac99a..f6c0a66 100644 --- a/utils/constants.ts +++ b/utils/constants.ts @@ -1,8 +1,10 @@ import { ethers } from 'hardhat' export const RolesRegistryAddress = '0xB2aD616e84e1eF7A9ED0fA3169AAF31Ee51EA824' // RolesRegistry has the same address on all networks +export const TEN_MINUTES = 10 * 60 export const ONE_DAY = 60 * 60 * 24 export const ONE_HOUR = 60 * 60 +export const TWENTY_THREE_HOURS = 23 * 60 * 60 export const THREE_MONTHS = 60 * 60 * 24 * 30 * 3 export const EMPTY_BYTES = '0x' export const MAX_PERCENTAGE = ethers.parseEther('100') From cc423aeb3291e04ff8cde68bfe053c1adde21136 Mon Sep 17 00:00:00 2001 From: EDUARDO MELO DE SIQUEIRA Date: Mon, 17 Jun 2024 18:18:51 -0300 Subject: [PATCH 2/7] fix: Create Offers reverts tests cancel --- package-lock.json | 2 +- test/NftRentalMarketplace.test.ts | 84 ++++++++++++++++++++++++++++++- 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index f56782d..7202454 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "orium-rental-protocol", + "name": "orium-rental-marketplace-contracts", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/test/NftRentalMarketplace.test.ts b/test/NftRentalMarketplace.test.ts index 8268666..89fe35c 100644 --- a/test/NftRentalMarketplace.test.ts +++ b/test/NftRentalMarketplace.test.ts @@ -171,7 +171,7 @@ describe('NftRentalMarketplace', () => { rentalOffer.rolesData, ) }) - it('Should create more than one rental offer for the same role, if the (Deadline - minduration) is reached ', async () => { + it('Should create a rental offer for the same role, if the (Deadline - minduration) is reached ', async () => { rentalOffer.minDuration = TWENTY_THREE_HOURS await marketplace.connect(lender).createRentalOffer(rentalOffer) await time.increase(ONE_HOUR) @@ -557,6 +557,88 @@ describe('NftRentalMarketplace', () => { .cancelRentalOffer({ ...rentalOffer, nonce: `0x${randomBytes(32).toString('hex')}` }), ).to.be.revertedWith('NftRentalMarketplace: Offer not created') }) + it('Should cancel a rental offer with an active role', async () => { + await time.increase(ONE_DAY) + rentalOffer.borrower = borrower.address + rentalOffer.nonce = `0x${randomBytes(32).toString('hex')}` + rentalOffer.deadline = Number(await time.latest()) + ONE_DAY + rentalOffer.feeAmountPerSecond = toWei('0') + await marketplace.connect(lender).createRentalOffer(rentalOffer) + + const blockTimestamp = await time.latest() + const expirationDate = Number(blockTimestamp) + duration + + await expect(marketplace.connect(borrower).acceptRentalOffer(rentalOffer, duration - 1)) + .to.emit(marketplace, 'RentalStarted') + .withArgs(rentalOffer.lender, rentalOffer.nonce, borrower.address, expirationDate) + + await expect(marketplace.connect(lender).cancelRentalOffer(rentalOffer)) + .to.emit(marketplace, 'RentalOfferCancelled') + .withArgs(rentalOffer.lender, rentalOffer.nonce) + }) + it('Should cancel a rental offer with an active role And DO NOT let create another rental offer', async () => { + await time.increase(ONE_DAY) + rentalOffer.borrower = borrower.address + rentalOffer.nonce = `0x${randomBytes(32).toString('hex')}` + rentalOffer.deadline = Number(await time.latest()) + ONE_DAY + rentalOffer.feeAmountPerSecond = toWei('0') + await marketplace.connect(lender).createRentalOffer(rentalOffer) + + const blockTimestamp = await time.latest() + const expirationDate = Number(blockTimestamp) + duration + + await expect(marketplace.connect(borrower).acceptRentalOffer(rentalOffer, duration - 1)) + .to.emit(marketplace, 'RentalStarted') + .withArgs(rentalOffer.lender, rentalOffer.nonce, borrower.address, expirationDate) + + await expect(marketplace.connect(lender).cancelRentalOffer(rentalOffer)) + .to.emit(marketplace, 'RentalOfferCancelled') + .withArgs(rentalOffer.lender, rentalOffer.nonce) + + rentalOffer.nonce = `0x${randomBytes(32).toString('hex')}` + await expect(marketplace.connect(lender).createRentalOffer(rentalOffer)).to.be.revertedWith( + 'NftRentalMarketplace: role still has an active offer', + ) + }) + + it('Should cancel a rental offer with an active role And LET create another rental offer when expiration date is reached', async () => { + await time.increase(ONE_DAY) + rentalOffer.borrower = borrower.address + rentalOffer.nonce = `0x${randomBytes(32).toString('hex')}` + rentalOffer.deadline = Number(await time.latest()) + ONE_DAY + rentalOffer.feeAmountPerSecond = toWei('0') + await marketplace.connect(lender).createRentalOffer(rentalOffer) + + const blockTimestamp = await time.latest() + const expirationDate = Number(blockTimestamp) + duration + + await expect(marketplace.connect(borrower).acceptRentalOffer(rentalOffer, duration - 1)) + .to.emit(marketplace, 'RentalStarted') + .withArgs(rentalOffer.lender, rentalOffer.nonce, borrower.address, expirationDate) + + await expect(marketplace.connect(lender).cancelRentalOffer(rentalOffer)) + .to.emit(marketplace, 'RentalOfferCancelled') + .withArgs(rentalOffer.lender, rentalOffer.nonce) + + await time.increase(ONE_HOUR * 2) + + rentalOffer.nonce = `0x${randomBytes(32).toString('hex')}` + await expect(marketplace.connect(lender).createRentalOffer(rentalOffer)) + .to.emit(marketplace, 'RentalOfferCreated') + .withArgs( + rentalOffer.nonce, + rentalOffer.tokenAddress, + rentalOffer.tokenId, + rentalOffer.lender, + rentalOffer.borrower, + rentalOffer.feeTokenAddress, + rentalOffer.feeAmountPerSecond, + rentalOffer.deadline, + rentalOffer.minDuration, + rentalOffer.roles, + rentalOffer.rolesData, + ) + }) }) describe('When Rental Offer is accepted', async () => { From b263e4be7634918ea41e9a1513da649c9be32ef9 Mon Sep 17 00:00:00 2001 From: EDUARDO MELO DE SIQUEIRA Date: Tue, 18 Jun 2024 01:43:54 -0300 Subject: [PATCH 3/7] fix: resolve comments --- contracts/NftRentalMarketplace.sol | 5 ++--- test/NftRentalMarketplace.test.ts | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/contracts/NftRentalMarketplace.sol b/contracts/NftRentalMarketplace.sol index bea678c..2341e9c 100644 --- a/contracts/NftRentalMarketplace.sol +++ b/contracts/NftRentalMarketplace.sol @@ -106,7 +106,6 @@ contract NftRentalMarketplace is Initializable, OwnableUpgradeable, PausableUpgr * @dev To optimize for gas, only the offer hash is stored on-chain * @param _offer The rental offer struct. */ - function createRentalOffer(RentalOffer calldata _offer) external whenNotPaused { LibNftRentalMarketplace.validateCreateRentalOfferParams( oriumMarketplaceRoyalties, @@ -289,9 +288,9 @@ contract NftRentalMarketplace is Initializable, OwnableUpgradeable, PausableUpgr nonceDeadline[msg.sender][_offer.nonce] = uint64(block.timestamp); for (uint256 i = 0; i < _offer.roles.length; i++) { - if(rentals[_offerHash].expirationDate > uint64(block.timestamp)) { + if (rentals[_offerHash].expirationDate > uint64(block.timestamp)) { roleDeadline[_offer.roles[i]][_offer.tokenAddress][_offer.tokenId] = rentals[_offerHash].expirationDate; - }else { + } else { roleDeadline[_offer.roles[i]][_offer.tokenAddress][_offer.tokenId] = uint64(block.timestamp); } } diff --git a/test/NftRentalMarketplace.test.ts b/test/NftRentalMarketplace.test.ts index 89fe35c..3615e35 100644 --- a/test/NftRentalMarketplace.test.ts +++ b/test/NftRentalMarketplace.test.ts @@ -597,7 +597,7 @@ describe('NftRentalMarketplace', () => { rentalOffer.nonce = `0x${randomBytes(32).toString('hex')}` await expect(marketplace.connect(lender).createRentalOffer(rentalOffer)).to.be.revertedWith( - 'NftRentalMarketplace: role still has an active offer', + 'NftRentalMarketplace: role still has an active offer or rental', ) }) From d18de091c1cb3e703ca2f0aba3e9170b252a0e84 Mon Sep 17 00:00:00 2001 From: EDUARDO MELO DE SIQUEIRA Date: Tue, 18 Jun 2024 01:54:14 -0300 Subject: [PATCH 4/7] fix: resolve comments --- contracts/NftRentalMarketplace.sol | 2 +- test/NftRentalMarketplace.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/NftRentalMarketplace.sol b/contracts/NftRentalMarketplace.sol index 2341e9c..cfd06bd 100644 --- a/contracts/NftRentalMarketplace.sol +++ b/contracts/NftRentalMarketplace.sol @@ -116,7 +116,7 @@ contract NftRentalMarketplace is Initializable, OwnableUpgradeable, PausableUpgr for (uint256 i = 0; i < _offer.roles.length; i++) { require( roleDeadline[_offer.roles[i]][_offer.tokenAddress][_offer.tokenId] < block.timestamp, - 'NftRentalMarketplace: role still has an active offer' + 'NftRentalMarketplace: role still has an active offer or rental' ); roleDeadline[_offer.roles[i]][_offer.tokenAddress][_offer.tokenId] = _offer.deadline - _offer.minDuration; } diff --git a/test/NftRentalMarketplace.test.ts b/test/NftRentalMarketplace.test.ts index 3615e35..57a1d7d 100644 --- a/test/NftRentalMarketplace.test.ts +++ b/test/NftRentalMarketplace.test.ts @@ -300,7 +300,7 @@ describe('NftRentalMarketplace', () => { await marketplace.connect(lender).createRentalOffer(rentalOffer) rentalOffer.nonce = `0x${randomBytes(32).toString('hex')}` await expect(marketplace.connect(lender).createRentalOffer(rentalOffer)).to.be.revertedWith( - 'NftRentalMarketplace: role still has an active offer', + 'NftRentalMarketplace: role still has an active offer or rental', ) }) it('Should NOT create more than one rental when the (Deadline - minduration) is not be reached. ', async () => { @@ -311,7 +311,7 @@ describe('NftRentalMarketplace', () => { rentalOffer.nonce = `0x${randomBytes(32).toString('hex')}` await expect(marketplace.connect(lender).createRentalOffer(rentalOffer)).to.be.revertedWith( - 'NftRentalMarketplace: role still has an active offer', + 'NftRentalMarketplace: role still has an active offer or rental', ) }) }) From 79730b0fccd0f6c76a6fb7f2518d499a7f5d40cc Mon Sep 17 00:00:00 2001 From: EDUARDO MELO DE SIQUEIRA Date: Tue, 18 Jun 2024 11:54:17 -0300 Subject: [PATCH 5/7] fix: coverage 100% --- test/NftRentalMarketplace.test.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/NftRentalMarketplace.test.ts b/test/NftRentalMarketplace.test.ts index 57a1d7d..d0bdccb 100644 --- a/test/NftRentalMarketplace.test.ts +++ b/test/NftRentalMarketplace.test.ts @@ -398,6 +398,26 @@ describe('NftRentalMarketplace', () => { 'RentalStarted', ) }) + it('Should DEADLINE UPDATED', async () => { + await time.increase(ONE_DAY) + rentalOffer.minDuration = duration / 2 + rentalOffer.nonce = `0x${randomBytes(32).toString('hex')}` + rentalOffer.deadline = Number(await time.latest()) + ONE_HOUR + TEN_MINUTES + const blockTimestamp = Number(await time.latest()) + console.log('blockTimestamp:', blockTimestamp.toString()) + const newExpirationDate = blockTimestamp + duration - 1 + console.log('newExpirationDate', newExpirationDate.toString()) + await marketplace.connect(lender).createRentalOffer(rentalOffer) + const updatedRoleDeadline = await marketplace.roleDeadline( + USER_ROLE, + await mockERC721.getAddress(), + tokenId, + ) + console.log('Updated Role Deadline:', updatedRoleDeadline.toString()) + await marketplace.connect(borrower).acceptRentalOffer(rentalOffer, duration) + + expect(newExpirationDate).to.be.greaterThan(updatedRoleDeadline) + }) it('Should accept rental offer if marketplace fee is zero', async () => { await marketplaceRoyalties .connect(operator) From 2cd3cfa14be9ae51709f7a730f95b0b4eef76ca8 Mon Sep 17 00:00:00 2001 From: EDUARDO MELO DE SIQUEIRA Date: Tue, 18 Jun 2024 12:49:39 -0300 Subject: [PATCH 6/7] fix: test description --- test/NftRentalMarketplace.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/NftRentalMarketplace.test.ts b/test/NftRentalMarketplace.test.ts index d0bdccb..2cd87ae 100644 --- a/test/NftRentalMarketplace.test.ts +++ b/test/NftRentalMarketplace.test.ts @@ -398,7 +398,7 @@ describe('NftRentalMarketplace', () => { 'RentalStarted', ) }) - it('Should DEADLINE UPDATED', async () => { + it('Should Accept a rental offer and update roleDeadLine if expiration date is greater than storage info.', async () => { await time.increase(ONE_DAY) rentalOffer.minDuration = duration / 2 rentalOffer.nonce = `0x${randomBytes(32).toString('hex')}` From cf7cb6fe122b4f995034e56b09ebce4c65c47129 Mon Sep 17 00:00:00 2001 From: EDUARDO MELO DE SIQUEIRA Date: Tue, 18 Jun 2024 13:35:20 -0300 Subject: [PATCH 7/7] index.json and unknown files --- .openzeppelin/unknown-1284.json | 179 ++++++++++++++++++++++++++++++++ addresses/moonbeam/index.json | 84 +++++++-------- 2 files changed, 222 insertions(+), 41 deletions(-) diff --git a/.openzeppelin/unknown-1284.json b/.openzeppelin/unknown-1284.json index ca209b4..0d243c5 100644 --- a/.openzeppelin/unknown-1284.json +++ b/.openzeppelin/unknown-1284.json @@ -753,6 +753,185 @@ }, "namespaces": {} } + }, + "78fdef84715c5d8c81d1fc2cc5d9adef7189b0d6a569c70639538d0c56b35a1a": { + "address": "0xA4c07bCF0ACE9e85Ce59BDD8eC7590a1d946216d", + "txHash": "0xc86a1c8baf7449787b18778506318c95d722735fb603e00b7981bb25c366baf9", + "layout": { + "solcVersion": "0.8.9", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "_owner", + "offset": 0, + "slot": "51", + "type": "t_address", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage", + "contract": "OwnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94" + }, + { + "label": "_paused", + "offset": 0, + "slot": "101", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "oriumMarketplaceRoyalties", + "offset": 0, + "slot": "151", + "type": "t_address", + "contract": "NftRentalMarketplace", + "src": "contracts/NftRentalMarketplace.sol:23" + }, + { + "label": "isCreated", + "offset": 0, + "slot": "152", + "type": "t_mapping(t_bytes32,t_bool)", + "contract": "NftRentalMarketplace", + "src": "contracts/NftRentalMarketplace.sol:26" + }, + { + "label": "nonceDeadline", + "offset": 0, + "slot": "153", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint64))", + "contract": "NftRentalMarketplace", + "src": "contracts/NftRentalMarketplace.sol:29" + }, + { + "label": "roleDeadline", + "offset": 0, + "slot": "154", + "type": "t_mapping(t_bytes32,t_mapping(t_address,t_mapping(t_uint256,t_uint64)))", + "contract": "NftRentalMarketplace", + "src": "contracts/NftRentalMarketplace.sol:32" + }, + { + "label": "rentals", + "offset": 0, + "slot": "155", + "type": "t_mapping(t_bytes32,t_struct(Rental)8694_storage)", + "contract": "NftRentalMarketplace", + "src": "contracts/NftRentalMarketplace.sol:35" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint64))": { + "label": "mapping(address => mapping(uint256 => uint64))", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_mapping(t_address,t_mapping(t_uint256,t_uint64)))": { + "label": "mapping(bytes32 => mapping(address => mapping(uint256 => uint64)))", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(Rental)8694_storage)": { + "label": "mapping(bytes32 => struct Rental)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint64)": { + "label": "mapping(uint256 => uint64)", + "numberOfBytes": "32" + }, + "t_struct(Rental)8694_storage": { + "label": "struct Rental", + "members": [ + { + "label": "borrower", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "expirationDate", + "type": "t_uint64", + "offset": 20, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + }, + "namespaces": {} + } } } } diff --git a/addresses/moonbeam/index.json b/addresses/moonbeam/index.json index 44aad17..fa81a50 100644 --- a/addresses/moonbeam/index.json +++ b/addresses/moonbeam/index.json @@ -1,42 +1,44 @@ { - "Multisig": { - "address": "" - }, - "RolesRegistry": { - "address": "" - }, - "SftRolesRegistrySingleRole": { - "address": "" - }, - "KMSDeployer": { - "address": "0x04c8c6c56dab836f8bd62cb6884371507e706806" - }, - "ImmutableOwnerCreate2Factory": { - "address": "" - }, - "OriumMarketplaceRoyalties": { - "address": "0x1FdB03ee7e0A861D0495075C1459ef87bC4de54c", - "operator": "0x04c8c6c56dab836f8bd62cb6884371507e706806", - "implementation": "0xeE485138ae7b0A50F2342c67675c6D0a3bd1d3ea", - "proxyAdmin": "0xbee720D292d591cc94f522050cc2069070e3a15C" - }, - "OriumSftMarketplace": { - "address": "", - "operator": "", - "implementation": "", - "proxyAdmin": "", - "libraries": [""] - }, - "ERC7432WrapperForERC4907": { - "address": "0xc3154ccac181eb9d71ccd53f29f425bddd52d983" - }, - "NftRentalMarketplace": { - "address": "0x201E1636BB21Dfd51F93815BCD008EAe2Fa29bD9", - "operator": "0x04c8c6c56dab836f8bd62cb6884371507e706806", - "implementation": "0xc4951f62E4f1df9fC411C6a9b752154FE6Bd0e0f", - "proxyAdmin": "0x668e73cF24361cfE13801681d8885e6632A7Eaa6", - "libraries": { - "LibNftRentalMarketplace": "0xD2f6956889241597b536C2E1Ae8d2E1052d17178" - } - } -} + "Multisig": { + "address": "" + }, + "RolesRegistry": { + "address": "" + }, + "SftRolesRegistrySingleRole": { + "address": "" + }, + "KMSDeployer": { + "address": "0x04c8c6c56dab836f8bd62cb6884371507e706806" + }, + "ImmutableOwnerCreate2Factory": { + "address": "" + }, + "OriumMarketplaceRoyalties": { + "address": "0x1FdB03ee7e0A861D0495075C1459ef87bC4de54c", + "operator": "0x04c8c6c56dab836f8bd62cb6884371507e706806", + "implementation": "0xeE485138ae7b0A50F2342c67675c6D0a3bd1d3ea", + "proxyAdmin": "0xbee720D292d591cc94f522050cc2069070e3a15C" + }, + "OriumSftMarketplace": { + "address": "", + "operator": "", + "implementation": "", + "proxyAdmin": "", + "libraries": [ + "" + ] + }, + "ERC7432WrapperForERC4907": { + "address": "0xc3154ccac181eb9d71ccd53f29f425bddd52d983" + }, + "NftRentalMarketplace": { + "address": "0x201E1636BB21Dfd51F93815BCD008EAe2Fa29bD9", + "operator": "0x04c8c6c56dab836f8bd62cb6884371507e706806", + "implementation": "0xA4c07bCF0ACE9e85Ce59BDD8eC7590a1d946216d", + "proxyAdmin": "0x668e73cF24361cfE13801681d8885e6632A7Eaa6", + "libraries": { + "LibNftRentalMarketplace": "0x3c24b00dC7Cae303eF84560A9848f9775890D2d8" + } + } +} \ No newline at end of file