Marketplace acceptance criteria
The page outlines the essential features that a marketplace must possess for Immutable to recommended to Game Studio and ecosystem partners. Additionally, it presents a comprehensive set of test cases necessary to assess the marketplace's readiness for deployment on the mainnet.
Marketplace Feature Requirements
Mandatory (Required to be an Immutable marketplace)
- Utilise Immutable's settlement contract for secure transactions:
- Testnet:
0x6c12aD6F0bD274191075Eb2E78D7dA5ba6453424
- Mainnet:
0x7d117aA8BD6D31c4fa91722f246388f38ab1942c
- Testnet:
- Integrate seamlessly with Immutable's global order book, ensuring unified liquidity and preventing bifurcation. All orders must be listed and executed through Immutable's global order book.
- Support Immutable's metadata refresh workflows, automatically updating assets when notified by Immutable's Blockchain Data API, eliminating the need for manual metadata refresh by each trader before each purchase.
- Support for Passport.
Should Have (Required to be an Immutable recommended marketplace)
- Implement Passport authentication for user access control and security.
- Enable trading in IMX, ETH, and USDC tokens to provide users with diverse trading options.
- Facilitate token swaps between ERC20 currencies within the marketplace, enhancing flexibility for traders buying assets in multiple currencies. (Immutable's Smart Checkout product supports this feature)
- Allow traders to bridge tokens to Immutable's L2 zkEVM for improved scalability and security. (Immutable's Smart Checkout product supports this feature)
- Provide visibility of ERC20 token balances within the marketplace. (Immutable's Smart Checkout product supports this feature)
- If soft cancels are implemented, including race condition warnings that accurately reflect execution risk for traders if cancellation is performed whilst there is an outstanding trade signature.
- Enable users to view NFTs in their wallet for comprehensive asset management.
- Stay up to date with the latest versions of Immutable's products and widgets within a reasonable timeframe.
Best Practice (The best Immutable marketplaces have the following)
- Support Smart Checkout or similar features for enhanced user experience:
- Enable purchasing assets in alternative currencies to the original listing, with token swapping as part of the transaction.
- Allow purchasing ERC20 tokens using fiat currencies.
- Provide the option to purchase NFTs directly using fiat.
- Group game collections together to signify their association, enhancing user navigation and understanding.
- Implement asset stacking to group assets with shared metadata, creating a separate order books within the marketplace for all like assets. This allows buyers to find desired assets at the best prices in one spot.
- Support trading in bespoke games ERC20 tokens, preferably limiting them to specific games for relevance and integrity within the gaming ecosystem.
- Offer game studio self-service capabilities to control the representation of their games and collections on the marketplace, empowering studios to customise their presence.
Mainnet Collections for Testing
Immutable has launched a suite of test collections on Mainnet to help marketplaces verify their platforms.
If you need assets from the collections below, please reach out to your Immutable representative for free mints to test with.
Contract Type | Collection Name | Collection Address | Collection Details | NFT Details |
---|---|---|---|---|
ERC721 | Super Pets | 0xB2155A27832Ae6d61e6041e13E8C7421aE025d64 | Blockchain Data API - Collection | Blockchain Data API - ListNFTs |
ERC721 | 3D Shapes | 0x6B9259AA44F42AbC99699aDA46cb0083cb2647fF | Blockchain Data API - Collection | Blockchain Data API - ListNFTs |
ERC1155 | Wooden Planks | 0xd6eBeec5B52c4A237A4c64c6D3171E78b57A40f7 | Blockchain Data API - Collection | Blockchain Data API - ListNFTs |
Marketplace Bulk Action Limits
A single transaction has specific limits. If a request exceeds these limits, Immutable recommends breaking the requests into batches.
Bulk Action | Limit Per Transaction |
---|---|
Create Listings | 20 |
Fill Listing | 50 |
Soft Cancel | 20 |
Test Cases
The following test cases must be successfully completed before launching on Mainnet. While this list is not exhaustive, it outlines the user experience traders expect when utilizing Immutable's order book.
Key Definitions
- Marketplace A: The marketplace you are testing
- Marketplace A: An alternative marketplace such as Token Trove
- Wallet X: A wallet you own
- Wallet Y: A second wallet you own
- Wallet Z: A third wallet you own
Listings
These steps should be repeated with both Passport and another EOA wallet (e.g. Metamask).
For Passport users, no gas should be charged in any Passport signed transaction during Immutable's Gas Free for Gamers promotional period.
Products: Orderbook - Listings; Transfers
View locally placed listing:
- Actions:
- Wallet X lists an asset through Marketplace A to Immutable's global orderbook.
- Wallet Y views the listing through Marketplace A.
- Results:
- The listing should appear almost immediately on Wallet Y through Marketplace A.
- Actions:
View local listing on foreign marketplace:
- Actions:
- Wallet X lists an asset through Marketplace A on Immutable's global orderbook.
- Wallet Y views the listing on Marketplace B.
- Results:
- The listing should appear within 3 minutes on Marketplace B.
- Actions:
View foreign listing on local marketplace:
- Actions:
- Wallet X lists an asset on Marketplace B.
- Wallet Y views the listing on Marketplace A.
- Results:
- The asset should appear within 3 minutes on Marketplace A.
- Actions:
Local listing suspended/reactivated by foreign transfer:
- Actions:
- Wallet X lists an asset on Marketplace A.
- Wallet X transfers listed asset to Wallet Y on Marketplace B.
- Wallet Y transfers the asset back to Wallet X on Marketplace B.
- Results:
- After the initial transfer the listing on Marketplace A and B should be removed.
- After the second (and last transfer) the initial listing of Wallet X should be reactivated on Marketplace A and B.
- Actions:
Trades
These steps should be done with Passport and another EOA wallet (e.g. Metamask)
For Passport no gas should be charged in any transaction during Immutable's Gas Free for Gamers promotional period.
Products: Orderbook - Listings; Orderbook - Fill Order
Local execution, foreign listing:
- Actions:
- Wallet X lists the asset on Marketplace B.
- Wallet Y executes the listing on Marketplace A.
- Results:
- The execution should occur, and the listing should be removed from both Marketplace A & B.
- If there is an Activity Feed, the trade should be recorded.
- Actions:
Foreign execution, local listing:
- Actions:
- Wallet X lists the asset on Marketplace A.
- Wallet Y executes the listing on Marketplace B.
- Results:
- The execution should occur, and the listing should be removed from both Marketplace A & B.
- If there is an Activity Feed, the trade should be recorded.
- Actions:
Local execution, local listing:
- Actions:
- Wallet X lists the asset on Marketplace A.
- Wallet Y executes the listing on Marketplace A.
- Results:
- The execution should occur, and the listing should be removed from both Marketplace A and B.
- The asset will be visible in Wallet Y's Marketplace A wallet view.
- The asset will not be visible in Wallet X's Marketplace A wallet view.
- If there is an Activity Feed, the trade should be recorded.
- Actions:
Foreign execution, foreign listing:
- Actions:
- Wallet X lists the asset on Marketplace B.
- Wallet Y executes the listing on Marketplace B.
- Results:
- The execution should occur, and the listing should be removed from both Marketplace A and B.
- If there is an Activity Feed on Marketplace A, the trade should be recorded, even though the order did not list or execute on Marketplace A.
- Actions:
Visibility
These steps should be done with Passport and another EOA wallet (e.g. Metamask)
For Passport no gas should be charged in any transaction during Immutable's Gas Free for Gamers promotional period.
Products: Orderbook - Listings; Orderbook - Fill Order; Transfers
Local asset purchase visible in buyer's wallet on foreign marketplace:
- Actions:
- Wallet X lists the asset on Marketplace A.
- Wallet Y executes the listing on Marketplace A.
- Wallet Y & X log in to Marketplace B.
- Results:
- The asset will be visible in Wallet Y's Marketplace B wallet view.
- The asset will not be visible in Wallet X's Marketplace B wallet view.
- Actions:
Foreign asset purchase visible in buyer's wallet on local marketplace:
- Actions:
- Wallet X lists the asset on Marketplace B.
- Wallet Y executes the listing on Marketplace B.
- Wallet Y & X log in to Marketplace A.
- Results:
- The asset will be visible in Wallet Y's Marketplace A wallet view.
- The asset will not be visible in Wallet X's Marketplace A wallet view.
- Actions:
Foreign asset transfer, local asset visibility:
- Actions:
- Wallet X transfers an asset to Wallet Y on Marketplace B.
- Wallet Y & X log in to Marketplace A.
- Results:
- The asset will be visible in Wallet Y's Marketplace A wallet view.
- The asset will not be visible in Wallet X's Marketplace A wallet view.
- Actions:
Local asset transfer, foreign asset visibility:
- Actions:
- Wallet X transfers an asset to Wallet Y on Marketplace A (if supported).
- Wallet Y & X log in to Marketplace B.
- Results:
- The asset will be visible in Wallet Y's Marketplace B wallet view.
- The asset will not be visible in Wallet X's Marketplace B wallet view.
- Actions:
Bulk Buy (If Supported)
These steps should be done with Passport and another EOA wallet (e.g. Metamask)
For Passport no gas should be charged in any transaction during Immutable's Gas Free for Gamers promotional period.
Your marketplace does not need to support all these workflows.
Products: Orderbook - Listings; Orderbook - Bulk Fill Order
Bulk Buy of the same asset:
- Actions:
- Wallet X lists an asset on Marketplace A.
- Wallet Y lists an identical asset on Marketplace A (excluding Token ID).
- Wallet Z buys 2 of these assets in a single transaction.
- Results:
- Wallet Z acquires both assets with only signing a single transaction, requiring only a single signature from Wallet Z.
- If there is an Activity Feed, the trades should be recorded. The trades should be displayed as 2 separate transactions, but can be displayed as 1 provided it is clear what transpired.
- Actions:
Bulk Buy from multiple collections:
- Actions:
- Wallet X lists an asset from one collection on Marketplace A.
- Wallet Y lists a different asset from a different collection on Marketplace A.
- Wallet Z buys 2 of these assets in a single transaction.
- Results:
- Wallet Z acquires both assets with only signing a single transaction, requiring only a single signature from Wallet Z.
- If there is an Activity Feed, the trades should be recorded. The trades should be displayed as 2 separate transactions, but can be displayed as 1 provided it is clear what transpired.
- Actions:
Bulk Buy, incomplete fill:
- Actions:
- Wallet X lists an asset from one collection on Marketplace A.
- Wallet Y lists a different asset from a different collection on Marketplace A.
- Wallet Z requests to buy 2 of these assets but doesn't sign the transaction.
- Wallet Y buys Wallet X's asset and signs the transaction.
- Results:
- The transaction will be processed despite Wallet X's listing already being fulfilled. Wallet Z will acquire Wallet Y's assets.
- If there is an Activity Feed, the trades should be recorded. The trades should be displayed as 2 separate transactions, but can be displayed as 1 provided it is clear what transpired.
- Actions:
Cancels
Marketplace A must support either Hard or Soft or Both Cancels
Products: Orderbook - Listings; Orderbook - Fill Order; Orderbook - Hard Cancel
Hard Cancels
Standard cancel:
- Actions:
- Wallet X lists an asset on Marketplace A.
- Wallet X cancels the asset on Marketplace A.
- Wallet Y requests to buy the asset immediately after Wallet X cancels without refreshing the page, so the listing is still visible.
- Results:
- The transaction will not occur as it has been canceled. An error message describing this will be shown.
- Actions:
Failed cancel, race condition:
- Actions:
- Wallet X lists an asset on Marketplace A.
- Wallet X requests to cancel the asset on Marketplace A without signing the transaction.
- Wallet Y executes Wallet X's asset and signs the transaction immediately.
- Wallet X signs the cancel transaction.
- Results:
- The transaction will occur, and Wallet Y will own the asset post-trade.
- An appropriate error message will be sent to Wallet X informing them they were too late.
- Actions:
Failed trade, race condition:
- Actions:
- Wallet X lists an asset on Marketplace A.
- Wallet Y requests to execute Wallet X's asset but does not sign the transaction.
- Wallet X requests to cancel the asset on Marketplace A and signs the transaction.
- Wallet Y signs the trade transaction.
- Results:
- The transaction will not occur. An appropriate error message will be sent to Wallet Y informing them they were too late.
- Actions:
Soft Cancels
Products: Orderbook - Listings; Orderbook - Fill Order; Orderbook - Soft Cancel
Standard cancel:
- Actions:
- Wallet X lists an asset on Marketplace A.
- Wallet X cancels the asset on Marketplace A.
- Wallet Y requests to buy the asset immediately after Wallet X cancels without refreshing the page so the listing is still visible.
- Results:
- The transaction will not occur as it has been canceled. An error message describing this will be shown.
- Actions:
Failed cancel, race condition:
- Actions:
- Wallet X lists an asset on Marketplace A.
- Wallet X requests to cancel the asset on Marketplace A without signing the transaction.
- Wallet Y executes Wallet X's asset and signs the transaction immediately.
- Wallet X signs the cancel transaction.
- Results:
- The transaction will occur, and Wallet Y will own the asset post trade.
- An appropriate error message will be sent to Wallet X informing them they were too late.
- Actions:
Failed soft cancel, pending trade signature:
- Actions:
- Wallet X lists an asset on Marketplace A.
- Wallet Y requests to execute Wallet X's asset but does not sign the transaction.
- Wallet X requests to cancel the asset on Marketplace A and signs the transaction.
- Wallet Y signs the trade transaction.
- Results:
- The transaction will occur.
- An appropriate error message will be sent to Wallet X informing them they may still be exposed for 90 seconds after the cancel was accepted.
- Actions:
Failed trade, signature timeout:
- Actions:
- Wallet X lists an asset on Marketplace A.
- Wallet Y requests to execute Wallet X's asset but does not sign the transaction.
- Wallet X requests to cancel the asset on Marketplace A and signs the transaction.
- Wallet Y waits 90 seconds from when the request to buy listing was made and then signs the trade transaction.
- Results:
- The transaction will not occur.
- An appropriate error message will be sent to Wallet Y informing them they were too late.
- Actions:
Metadata
Products: Orderbook - Listings; Orderbook - Fill Order; Orderbook - Soft Cancel
View metadata:
- Actions:
- Wallet X views a listing on Marketplace A that has metadata.
- Results:
- The asset's metadata will be visible when viewing the asset. This will usually be on the single asset page, not the page which shows all assets.
- Actions:
Metadata refresh, asset collection view:
- Actions:
- Wallet X views an asset without a listing on the marketplace (if marketplace shows all assets of a collection, even if no listing is present).
- Perform metadata refresh on asset.
- Results:
- The asset should change on the marketplace. This should happen within 30 minutes of metadata refresh and should not require the trader to refresh the asset manually.
- Actions:
Metadata refresh, wallet view:
- Actions:
- Wallet X views an asset in their wallet on Marketplace A. There should not be a listing for this asset.
- Perform metadata refresh on the asset.
- Results:
- The asset should change on the marketplace. This should happen within 60 seconds of metadata refresh and should not require the trader to refresh the asset manually.
- Actions:
Metadata refresh, listing and execution view:
- Actions:
- Wallet X lists an asset on Marketplace A.
- Perform metadata refresh on the asset.
- Wallet Y executes the listing on Marketplace A.
- Results:
- From Wallet Y's login, the asset should change on Marketplace A's listing. This should happen within 30 seconds of metadata refresh and should not require the trader to refresh the asset manually.
- Wallet Y should view the changed asset in their wallet view.
- Actions:
Collection metadata refresh:
- Actions:
- Create a new contract.json file for the collection with a new collection name or description.
- Perform metadata refresh on the collection. This can be done directly in Hub by pointing the linked collection to a the new
Contract Metadata URI
file in the step above.
- Results:
- The collection details will be updated on your marketplace.
- Actions:
Minting
Products: Orderbook - Listings; Metadata Refresh
Mint asset - collection view:
- Actions:
- Mint an asset with Metadata to Wallet Z.
- Wallet Y finds the asset in the total collection view.
- Results:
- The asset should be visible in the total collection view within 5 minutes of minting.
- Actions:
Mint asset - wallet view:
- Actions:
- Mint an asset with Metadata to Wallet Z.
- Wallet Z finds the asset in their wallet.
- Results:
- The asset should be visible in the wallet view within 3 minutes of minting.
- Actions:
Mint asset without Metadata - collection view:
- Actions:
- Mint an asset without Metadata to Wallet Z.
- Wallet Y finds the asset in the total collection view.
- Results:
- The asset could be visible or not visible yet, depending on your setup.
- Actions:
Mint asset without Metadata, then perform a refresh - wallet view:
- Actions:
- Mint an asset without Metadata to Wallet Z.
- Wallet Z tries to find the asset in their wallet.
- Wait 5 minutes then perform a Metadata refresh.
- Wallet Z finds the asset in their wallet.
- Results:
- The asset should not be visible initially on Marketplace A or appear broken as it has no metadata. Once the metadata refresh is performed, the asset should be visible.
- Actions:
Mint asset without Metadata, then prepare metadata - wallet view:
- Actions:
- Mint an asset without Metadata to Wallet Z.
- Wallet Z tries to find the asset in their wallet.
- Wait 5 minutes, then prepare Metadata and upload the file to the source directory.
- Wait 20 minutes.
- Results:
- The asset should not be visible initially on Marketplace A or appear broken as it has no metadata. The marketplace should be checking regularly if assets with missing metadata have had their metadata field created post mint. After 20 minutes, Marketplace A should have rechecked the broken asset and displayed its metadata.
- Actions:
Checkout
Products: Connect Widget; Balance Widget; Swap Widget; Bridge Widget; Onramp Widget
Connect Wallet and View Balances (Desktop & Mobile):
- Actions:
- On Marketplace A, select wallet connection tab to open the Connect Widget
- Connect Widget displays list of Immutable zkEVM compatible wallet
- Select Wallet X on the list
- View currency balances on Immutable zkEVM in Wallet X
- Results:
- Trader should be able to connect Passport (or other Immutable zkEVM compatible wallets) and see their currency balances on Immutable zkEVM. Given that the Connect Widget supports wallet connect, this flow is mobile compatible as well.
- Actions:
Swap coins between available ERC20 balances:
- Actions:
- On Marketplace A, select swap tab to open the Swap Widget
- Input “from” coin and quantity
- Select “to” coin and quantity will be automatically populated
- View fees breakdown
- Selecting swap will initiate swap
- Results:
- Trader should be able to swap available balance to any other currencies that have an existing liquidity pool on Quickswap.
- Actions:
Swaps are geoblocked in US & AU
- Actions:
- On Marketplace A, select swap tab to open the Swap Widget
- See geoblock error message and prompt to use Quickswap
- Results:
- Traders in US & AU will be geoblocked from using the Swap Widget and prompted to use Quickswap.
- Actions:
Bridge coins between Immutable zkEVM and Ethereum Mainnet
- Actions:
- On Marketplace A, select swap tab to open the Bridge Widget
- Select source Wallet X
- Select source network
- Select destination Wallet X or Wallet Y
- Select destination network
- Select coin and input quantity
- View bridge transaction summary before confirmation
- Results:
- Trader should be able to bridge to and from Immutable zkEVM and Ethereum Mainnet
Onramp funds to Immutable zkEVM with Credit/Debit Card:
- Actions:
- On Marketplace A, select onramp tab to open the Bridge Widget
- Select fiat currency
- Select crypto currency
- Select buy now to review transaction summary
- Results:
- Trader should be able to onramp ETH, USDC, IMX to Immutable zkEVM via Debit Card, Credit Card, Apple Pay and Google Pay.
- Actions:
Insufficient funds - Swap, Bridge or Onramp
- Actions:
- On Marketplace A, attempts to make transaction with insufficient funds
- Prompted with a list of funding methods (Swap, Onramp, Bridge)
- Select either method and go through identical flow as above
- Results:
- Trader should be asked to fund their wallet with a Swap, Onramp or Bridge via the widgets.
- Actions: