NFTimeshares is a protocol for sharing ownership of an NFT via a Timeshare. You can deposit an ERC721 NFT, and get back 12 NFTs in return – one for each month of the year. Each month is a normal ERC721 that can be bought, sold, and traded. You can redeem the underlying "original" NFT if you give back all 12 Timeshares.
There are two smart contracts: NFTimeshare
, which is 1:1 with the input NFT
and acts as a "parent token" to the second contract, NFTimeshareMonth
,
which is an ERC721 Token representing ownership of a single month of a given asset.
From a NFTimeshareMonth
token: If you own an NFTimeshareMonth
, you can see which month is associated with it by
- Calling
month(tokenId)
, which returns a number between 0 (Jan) and 11 (Dec) - Accessing the metadata
tokenURI(tokenId)
, which returns the same metadata as the underlying NFT with two addedattributes
fields:{trait_type: "Month", value:"January"}
and{trait_type: "Parent Timeshare Id", value: "..."}
From an NFTimeshare
parent object: With an NFTimeshare tokenId, calling ownerOf(tokenId)
will return the address of whomever owns the NFTimeshareMonth
for whatever month it is now, according to the blockchain.
From the underlying NFT: If you only know the info about the underlying timeshared asset (for example, maybe you're a video game and looking for the current owner of
an in-game power-up), you can use getter method getTokenIdForUnderlyingNFT(your_nft_contract_address, your_nft_token_id)
. Then use the above :)
// For parent Timeshare asset wrapper
GET 'http://www.nftimeshares.fun/timeshare/tokenId'
//eg http://www.nftimeshares.fun/timeshare/42
=>
{
image: "http:// underlying asset.png" // pulled from underlying asset
... // everything from underlying asset
attributes:[
{
trait_type :"Ownership",
value :"Timeshared"
},
{
trait_type:"Timeshare Months",
value:"493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504" // 12 tokenIDs of TimeshareMonths
},
... // whatever other attributes were in the underlying token
]
}
// For TimeshareMonths
GET 'http://www.nftimeshares.fun/timesharemonth/tokenId'
//eg http://www.nftimeshares.fun/timesharemonth/493
=>
{
image: "http:// underlying asset.png" // pulled from same underlying asset
... // everything from underlying asset
attributes:[
{
trait_type:"Month",
value:"January" // tokenId 493 corresponds to the January month for
},
{
trait_type:"Parent Timeshare TokenId",
value:"42" // reference to parent Timeshare
},
... // whatever other attributes were in the underlying token
]
}
On Rinkeby:
- NFTimeshare address:
0xe4aA8DE6adea71Aab6db1dEB2a34afDCc19ce295
- NFTimeshareMonth address:
0x1909E978C0d4BC90D93bbD1CC367297d2bea1b2F
On Mainnet:
- tk :)
Want to make a timeshare? It's as easy as getting your NFT ready, and:
NFTimeshare.deposit(NFTContractAddress, NFTTokenId, OwnerAddress, RecipientAddress);
// NFTimeshare is now wrapping the input NFT that used to
// belong to OwnerAddress, and Recipient owns 12 NFTimeshareMonths
Most of the time probably the Recipient
will just be the same as Owner
, but
it's provided as an option for flexibility.
Do you own the whole year's worth of NFTimeshareMonths
for an asset? You can
get back the original asset by simply:
NFTimeshare.redeem(tokenId, RecipientAddress)
The smart contracts are not audited, and this project doesn't make money.
Please disclose bugs and vulnerabilities. Pull requests will be reviewed an ad-hoc
basis. Donations for server costs and LaCroixs are accepted at 0x3871A56C08fB2B2820449De602C6d0b0075bcE5D
You can build this project with git clone
, npm install
.
For contracts /contracts
:
npx hardhat compile
npx hardhat test
npx hardhat run scripts/deploy.js // or scripts/deployUpgrades.js
For the dapp, from two different terminal windows
npm run server # from terminal window 1
npm run client # from terminal window 2
The metadata server (which is used by opensea and others) is in /metadata-api-nodejs
and the frontend is in /dapp