All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Added
Quorum
as an abstraction for managin Administrative object - Added
AccessPolicy
to manage granular mutable access to NFTs in theKiosk
- Added
Launchpad
V2 with the plans of deprecating Launchpad V1 running up to mainnet - Added
MutLock
,ReturnPromise
andReturnFieldPromise
for controlling the flow of borrowing an NFT from the Kiosk for mutation - Added
CapAggregator
for grouping Capability objects of the same concern.
- Protocol Type Freedom: The wrapper
Nft<T>
is now optional - Kiosk integration:
Safe
has been deprecated in favor ofKiosk
- Upgraded to Sui 0.29.0
BidCreated
renamed toBidCreatedEvent
, generic removed and new fields added. The generic is problematic for the client as it can then query only for event type knowing the fungible token in advance.BidClosed
event renamed toBidClosedEvent
, again generic removed and new fields added. Additionally, this event is now used only for cancelling a bid.- Renamed
template::Template
tometadata::Metadata
andtemplates::TemplatesDomain
tometadata_bag::MetadataBagDomain
OrderbookCreatedEvent
propertyfungible_token_type
renamed toft_type
to be consistent with other events.BidCreatedEvent
,BidClosedEvent
andBidMatchedEvent
propertyft
renamed toft_type
to be consistent with other events.BidMatchedEvent
now contains propertynft_type
.MintNftEvent
propertyobject_type
of typeTypeName
changed tonft_type
of typeString
.
BidMatchedEvent
emitted when an NFT is sold.NftSoldEvent
emitted fromlimited_fixed_price
launchpad market module. It contains among others propertiesnft_type
andft_type
.NftSoldEvent
emitted fromfixed_price
launchpad market module. It contains among others propertiesnft_type
andft_type
.ChangeLogicalOwnerEvent
emitted when logical owner of an NFT is changed. It contains old and new logical owner, NFT ID and NFT collection type.MintNftEvent
now containslogical_owner
field.- Composable standard with domains
nft_bag::NftBagDomain
andsvg::ComposableSvgDomain
- All orderbook events now export
ft_type
andnft_type
fields. - Added
total_deposited
field toWarehouse
- Exposed mutable endpoint for
AttributesDomain
- Randomized NFT withdrawal with added functions
listing::buy_pseudorandom_nft
,listing::buy_random_nft
,inventory::redeem_random_nft
,inventory::redeem_pseudorandom_nft
OrderbookCreatedEvent
exported collection type instead of FT type.
- Helper endpoints in orderbook which allow marketplaces to perform actions in a single tx.
The marketplaces can now
edit_bid
create_safe_and_bid
create_safe_and_bid_with_commission
list_multiple_nfts
list_multiple_nfts_with_commission
- Helper endpoints in launchpad which allow marketplaces to perform actions in a single tx.
The marketplaces can now
create_safe_and_buy_whitelisted_nft
create_safe_and_buy_nft
buy_nft_into_safe
buy_whitelisted_nft_into_safe
- Wrong
seller
field inTradeFilledEvent
when calling thebuy_nft
endpoint
- Moved errors from
err
module intoorderbook
module where they are expressed as constants.
- Updated to Devnet 0.27.0
- Updated to Devnet 0.26.1
TransferAllowlistDomain
which keeps track of shared object IDs of typeAllowlist
.- Helper endpoints in orderbook which allow marketplaces to perform actions in a single tx.
The marketplaces can now
deposit_and_list_nft
(and with commission)create_safe_and_deposit_and_list_nft
(and with commission)create_safe_and_buy_nft
create_safe_and_buy_generic_nft
cancel_ask_and_discard_transfer_cap
edit_ask
- Added static
name
andurl
fields toNft
for better integration with explorer. - Added
LimitedFixedPriceMarket
orderbook::list_nft
andorderbook::list_nft_with_commission
endpoints. These allow the client to skip the creation of transfer caps and instead provideOwnerCap
toSafe
directly to the orderbook contract.
- Updated to Devnet 0.26.0
transfer_allowlist::remove_itself
is now an entry function.- Revamped NFT domain permissions and control over them
Collection
andNft
were reverted to use dynamic fields instead of dynamic object fields.- Migrated all domains not requiring
key
property after looseningkey
requirement onNft
andCollection
domains.
- Orderbook recipient was wrong when trading in orderbook.
- Introduced
DelegatedWitness
pattern - Refactored
CreatorsDomain
to supportDelegatedWitness
and introducedPluginDomain
- Renamed
CollectionMintEvent
toMintCollectionEvent
to be consistent withMintNftEvent
. TagsDomain
now uses dynamic fields instead ofBag
.RoyaltyDomain
now uses dynamic fields instead ofBag
.- Renamed
flyweight
standards toloose
standards.archetype::Archetype
is notemplate::Template
andregistry::RegistryDomain
is nowtemplates::TemplatesDomain
- Renamed orderbook module
nft_protocol::ob
tonft_protocol::orderbook
- Updated Sui dep to
0.24.0
- Orderbook's
CreateAskEvent
andCreateBidEvent
now contain safe ID. - Emitting event
OrderbookCreatedEvent
when an orderbook is created.
- Orderbook's
TradeFilledEvent
now contains orderbook ID.
- In orderbook, it was possible to create an ask or a bid which would require
that the
finish_trade
function be called with buyer and seller safe as the same object. This is not possible anymore as such tx would result in an error.
DelegatedWitness
generated byPluginDomain
andCreatorsDomain
to authorize mutable operations on OriginByte domains.PluginDomain
which collects type names of witness structs. These then serve to authorize a function in a "base" contract (the one that is deployed with the one-time-witness type.) The function returns the original witness type (of the same module as the OTW) in exchange for a witness of another smart contract (a plugin) if that plugin's witness is present in thePluginDomain
.Multisig
is a utility struct which enables smart contracts to authorize actions signed by predefined set of accounts.
CreatorsDomain
refactored to supportDelegatedWitness
The same reference was required in theadd_creator
function.- Renamed
Inventory
toWarehouse
- Orderbook event
AskCreatedEvent
/BidCreatedEvent
are emitted when creating a new position in orderbook. - Orderbook event
AskClosedEvent
/BidClosedEvent
are emitted when closing a position in orderbook. - Orderbook event
TradeFilledEvent
is emitted when a trade is filled. That is, either oncreate_bid
/create_ask
when the trade is immediately filled, or onbuy_nft
/buy_generic_nft
. - Royalties event when
TradePayment
is created.
- Updated Sui dep to
0.23.0
- Renamed
Inventory
toWarehouse
- When creating a bid higher than the lowest ask, the bid is now filled with the lowest ask price. Before, it was filled with the bid price.
- Updated Sui dep to
0.22.1
- Updated Sui dep to
0.22.0
CreatorsDomain
no longer hasis_frozen
flag as it needs to be reconstructed when edited, and it can be dropped when no longer needed.
- Orderbook and bidding liquidity layer contracts now support 3rd party
collections, ie. those which are not build with
nft-protocol
primitives. These collections must implement their own royalty enforcement policies if they wish so. TransferCap
exposes information about whether an NFT is a generic or native to our protocol.safe::deposit_generic_nft_privileged
- Refactored RoyaltyDomain and CreatorsDomain to split royalty share and authorization logic.
- Added entry function redeem_nft_transfer thus allowing creators to retrieve NFTs from private
Inventory
. - Updated Sui dep to
0.21.0
- Updated Sui dep to
0.20.0
- Renaming
whitelist
toallowlist
in relation to transferring NFTs. - We maintain our own version of
movemate
dependency calledoriginmate
. - Markets (
FixedPriceMarket
,DutchAuctionMarket
) are now registered onInventory
rather than theSlot
. - Live and whitelisted status of markets is now tracked on
Inventory
. - Market access permissions rearranged to use more direct
inventory_internal_mut
. - Renamed
Launchpad
toMarketplace
andSlot
toListing
Listing
s can not be create independent ofMarketplace
. They can operate independently or be attached to aMarketplace
subsequent to its creation- Renamed
AttributionDomain
toCreatorsDomain
- Creating an ask with commission in the orderbook returns an error if the commission is greater equal to the ask price.
Safe
can now be used to transfer NFTs to aSafe
which are not wrapped in thenft_protocol::nft::Nft
type. These NFTs have lower guarantees when it comes to transfers. Enables us to integrate other standards.- NFT minting can now be done privately to an
Inventory
object and only after transfered to a launchpadSlot
- Renamed some arguments in the orderbook to be more descriptive.
- Some protected actions were entry methods. This did not make sense because
witness shouldn't have the
key
ability and therefore cannot be an entry function argument.
- New version of the protocol
- The core
Nft
type now has the fieldsbag
andlogical_owner
where bag is used to add any domain to the NFT - Changed Launchpad design to fit the business model of Marketplaces, where marketplaces and dApps can now deploy a Launchpad and NFT creators can launch their collections on such Launchpads by creating a Launchpad Slot.
- Launchpad Admin can define the
default_fee
on a launchpad sale - If
launchpad.is_permissioned == true
, then onlylaunchpad.admin
can addslots
, otherwise anyone can addslots
- Launchpad admins can attach custom fee policies to each Slot
- Proceeds coming from launchpad sales are collected in the struct
Proceeds
, and to unwrap the funds off this struct we guarantee fee collection enforcement. - Name of the
deposit_nft_priviledged
was changed todeposit_nft_privileged
.
- Domain standards for NFT Collections to use, such as
display
,attribution
,tags
,royalties
andflyweight
Safe
module that holds NFTs on behalf of the owner and can delegate transferability viaTransferCap
andExclusiveTransferCap
- Trading primitives modules such as
bidding
contract andorderbook
contract
- Removed
unique_nft
,collectible
andc_nft
modules as configurability now occurs on the type-exporting NFT collection module
- Updated Sui dep to
0.19.0
- Updated Sui dep to
0.18.0
- Updated Sui dep to
0.17.0
- Updated Sui dep to
0.16.0
- Updated Sui dep to
0.15.2
- Added
dutch_auction
market primitive to the launchpad
- Updated Sui dep to
0.15.0
- Updated Sui dep to
0.14.0
- Since
transfer_to_object
was deprecated, we now usedynamic_object_field
with slingshot to associate embedded NFTs.
- Gutenberg: A rust templating engine to write Move NFT collection specific modules that top into our protocol.
- Togling sale status permission via
fixed_price::sale_on
andfized_price::sale_off
is now a permissioned action, that can only be done by the admin - Simplified
supply
module by removing changing fieldmax
fromOption<u64>
tou64
- Renamed
collectibles
module tocollectible
- Functions
compose_data_objects
in modulecollectible
andc_nft
are now entry functions - Fixed
slingshot::claim_nft_loose
and it now accepts nft_data as generic&D
instead ofD
- Updated
Sui
to version0.12.1
- Moved the supply mint policy responsibility off the
Collection
object to a separate objectMintAuthority
Slingshot
has now witness patternSlingshot<phantom T, M>
whereT
represents the exported NFT type andM
the market typeSlingshot
module has entrypointsclaim_nft_embedded
andclaim_nt_loose
std_collection::mint_and_transfer
function now expectedu64
for fieldmax_supply
instead ofOption<u64>
to facilitate function call on the client side
supply_policy
module with objectSupplyPolicy
to regulate NFT Collection supply- Error handling via
err
module
cap
module with objectsLimited
andUnlimited
that regulate the supply of NFT collections- Removed field
cap
fromCollection
object, removing the supply mint policy responsibility off theCollection
object - Removed field
index
fromunique_nft::Unique
,collectibles::Collectible
andc_nft::Data
- Reimplemented
nft
module withnft::Nft
object and removedNftOwned
- Reimplemented
collection
module withcollection::Collection
object - Collection data fields now belong to
collection::Collection
std_collection::StdMeta
now only has json field- Reimplemented
slingshot
module withslingshot::Slingshot
object - NFT IDs for primary release are now stored in
sale::Sale
objects, accessible to the slingshot launchpad via the fieldsales
- Launchpads can now have
create_single_market
andcreate_multi_market
sales configuration. The modules that implement the market type decide if the slinshot they initiate is single or multi market. In this current version,fixed_price
is the only market immplementation. - NFT Collections can now only be created via witness type
unique_nft
module andunique_nft:Unique
object serving as domain-specific embedded NFT implementationcollectibles
module andcollectibles:Collectible
object serving as domain-specific loose NFT implementationc_nft
module andc_nft:Composable
object serving as domain-specific loose NFT implementationsale
module to be able to perform multiple sales per slingshot launchpadwhitelist
module to be able to perform whitelisted salescap
module with objectsLimited
andUnlimited
that regulate the supply of NFT collectionssupply
module with objectSupply
that controls and manages the supply of a given object
std_nft
module andstd_nft::StdNft
object
- Renamed move package from
nftProtocol
toNftProtocol
. - Renamed field
uri
tourl
forstd_nft::NftMeta
- Changed parameter
collection
fromID
to&Collection<T, Meta>
infixed_price::create
- Renamed field
uri
tourl
forstd_nft::NftMeta
- Changed parameter
collection
fromID
to&Collection<T, Meta>
infixed_price::create
- The following objects with
key
,store
abilities:slingshot::Slingshot
as generic launchpadfixed_price::LaunchpadConfig
as fixed price launchpad configurationfixed_price::NftCertificate
as certificate to redeem NFT
- The following structs to be used as witnesses:
fixed_price::FixedPriceSale
- Method
std_nft::mint_to_launchpad
to mint an NFT an transfer it to a launchpad
- Bumped Sui version to
devnet-0.9.0
- The following structs with
key
,store
abilities:collection::Collection
as generic Collectionstd_collection::CollectionMeta
as collection metadatanft::NftOwned
as generic NFTstd_nft::NftMeta
as NFT metadata
- The following structs to be used as witnesses:
std_nft::StdNft
std_collection::StdCollection
- The object type
tags::Tags
withcopy
,drop
,store