Marketplace App

Deploying an NFT Marketplace App

If unfamiliar with the steps of deploying an app, go back to the first example where we explain in detail all the different parts of deploying an App.

Defining our App

You can also use CW20 tokens as the purchasing tokens for the NFTs in the marketplace.

For this App, we will be selling NFTs using the Marketplace ADO for native tokens. The steps that will be performed:

  • Mint NFTs

  • Setup the marketplace

  • Send the NFTs to the marketplace to be sold

  • Buy the NFTs

Defining the Messages

The components/ADOs we would need:

Let us first start by representing the instantiation message for each of our ADOs:

CW721

{
"name":"MarketplaceNFTs",
"symbol":"MNFT",
"minter":"<your-address>",
"kernel_address":"andr14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9shptkql"
}

As base64:

eyJuYW1lIjoiTWFya2V0cGxhY2VORlRzIiwic3ltYm9sIjoiTU5GVCIsIm1pbnRlciI6ImFuZHIxZ2Z6c3UwdmVmcnYydjlnNWdrdm1oazNjZWd1MjA4cGV2dXQ2dWgiLCJrZXJuZWxfYWRkcmVzcyI6ImFuZHIxNGhqMnRhdnE4ZnBlc2R3eHhjdTQ0cnR5M2hoOTB2aHVqcnZjbXN0bDR6cjN0eG1mdnc5c2hwdGtxbCJ9

Marketplace

You can specify the authorized CW20 addresses here if you plan to use CW20 tokens to purchase the NFTs. In our cases we are using native so we only have to specify the kernel address.

{
"kernel_address":"andr14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9shptkql"
}

As base64:

eyJrZXJuZWxfYWRkcmVzcyI6ImFuZHIxNGhqMnRhdnE4ZnBlc2R3eHhjdTQ0cnR5M2hoOTB2aHVqcnZjbXN0bDR6cjN0eG1mdnc5c2hwdGtxbCJ9

App

{
  "name": "Marketplace App",
  "app_components": [
    {
      "name": "NFTs",
      "ado_type": "cw721",
      "component_type":{
      "new":"eyJuYW1lIjoiTWFya2V0cGxhY2VORlRzIiwic3ltYm9sIjoiTU5GVCIsIm1pbnRlciI6ImFuZHIxZ2Z6c3UwdmVmcnYydjlnNWdrdm1oazNjZWd1MjA4cGV2dXQ2dWgiLCJrZXJuZWxfYWRkcmVzcyI6ImFuZHIxNGhqMnRhdnE4ZnBlc2R3eHhjdTQ0cnR5M2hoOTB2aHVqcnZjbXN0bDR6cjN0eG1mdnc5c2hwdGtxbCJ9"
       }
     },
    {
      "name": "marketplace",
      "ado_type": "marketplace",
      "component_type":{ 
      "new":"eyJrZXJuZWxfYWRkcmVzcyI6ImFuZHIxNGhqMnRhdnE4ZnBlc2R3eHhjdTQ0cnR5M2hoOTB2aHVqcnZjbXN0bDR6cjN0eG1mdnc5c2hwdGtxbCJ9"
        }
    }
  ],
  "kernel_address":"andr14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9shptkql"
  }

There are several components found here. A simple name for the app, the components of the app itself and a reference to the “Kernel”. Each component of the app provides two values: a name used for referencing for other components within the app, and the base64 encoded instantiation message.

Instantiating the App

If you do not have the CLI downloaded, go to the Introduction to Apps section to get the latest version.

First, let us open the CLI by running andr in our terminal. We then need to choose the chain we want to deploy on. Run "chain use" in the CLI and select the testnet that you want to deploy on. For this example I will be using the Andromeda test-net Galileo-3.

We have already uploaded the App ADO to the Andromeda testnet. A simple way to check the latest code id for the App ADO is to query it from the ADODB using the chain you want to use.

In the CLI, while connected to the chain of choice, run:

os adodb getcodeid app-contract

The code Id to use will be returned.

Now we can instantiate our App. We will be using our wasm command to instantiate our app:

wasm instantiate <app-code-id> '{"name": "Marketplace App","app_components": [{"name": "NFTs","ado_type": "cw721","component_type":{"new":"eyJuYW1lIjoiTWFya2V0cGxhY2VORlRzIiwic3ltYm9sIjoiTU5GVCIsIm1pbnRlciI6ImFuZHIxZ2Z6c3UwdmVmcnYydjlnNWdrdm1oazNjZWd1MjA4cGV2dXQ2dWgiLCJrZXJuZWxfYWRkcmVzcyI6ImFuZHIxNGhqMnRhdnE4ZnBlc2R3eHhjdTQ0cnR5M2hoOTB2aHVqcnZjbXN0bDR6cjN0eG1mdnc5c2hwdGtxbCJ9"}},{"name": "marketplace","ado_type": "marketplace","component_type":{ "new":"eyJrZXJuZWxfYWRkcmVzcyI6ImFuZHIxNGhqMnRhdnE4ZnBlc2R3eHhjdTQ0cnR5M2hoOTB2aHVqcnZjbXN0bDR6cjN0eG1mdnc5c2hwdGtxbCJ9"}}],"kernel_address":"andr14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9shptkql"}'

Interacting with the App

Mint NFTs

Now we need to mint an NFT to send to the marketplace.

{
"mint": {
            "token_id":"1",
            "owner":"<your-address>",
            "token_uri":"https://gateway.pinata.cloud/ipfs...",
            "extension": {
                "publisher": "Andromeda"
              }            
        }
}
wasm execute <cw721-contract-address> '{"mint": {"token_id":"1","owner":"andr1gfzsu0vefrv2v9g5gkvmhk3cegu208pevut6uh","token_uri":"https://gateway.pinata.cloud/ipfs...","extension": {"publisher": "Andromeda"}}}'

Transaction

Send NFT to Marketplace to be Sold

In order to start a sale on the NFT, we need to send it to the marketplace ADO.

The token Id is 1 here since that is what we had assigned to our NFT when minting.

{
    "send_nft": {
        "contract": "<marketplace-contract-address>",
        "token_id": "1",
        "msg": "eyJzdGFydF9zYWxlIjogeyJwcmljZSI6IjEwMDAwIiwiY29pbl9kZW5vbSI6ICJ1YW5kciIsInVzZXNfY3cyMCI6IGZhbHNlfX0="
    }
}

The attached message is a start_sale message to start the auction when the NFT is sent.

You can add a start time, end time, and a recipient to receive the funds of the sale. By ommitting them, we are specifying that the sale should start immediately, does not expire unless we decide to cancel it, and that the funds from the sale should go to the sender ie. our address.

{
"start_sale":{
    "price": "10000",
    "coin_denom":"uandr",
    "uses_cw20": false
    }
}
wasm execute <cw721-contract-address> '{"send_nft": {"contract": "andr18dacalhasfqs45dz5tmsa38278svz5elvys83rfas9tz7n9eh5vs8gx6cp","token_id": "1","msg": "eyJzdGFydF9zYWxlIjogeyJwcmljZSI6IjEwMDAwIiwiY29pbl9kZW5vbSI6ICJ1YW5kciIsInVzZXNfY3cyMCI6IGZhbHNlfX0="}}'

Start Sale

Buy the NFT

Now let us buy the NFT. On the CLI:

wallet use <wallet-name>
{
"buy":{
    "token_id":"1",
    "token_address":"<cw721-contract-address>"
    }
}
wasm execute <marketplace-contract-address> '{"buy":{"token_id":"1","token_address":"<cw721-contract-address>"}}' 

Buy the NFT

Conclusion

We have seen in this example how we can easily sell NFTs using our marketplace ADO. You can customize this application as you see fit. Some possible modifications you can make for this application:

  • Add start and end times for the NFT sale.

  • Use a CW20 token as the purchasing token for the NFTs.

  • Add a splitter recipient to the start sale message to directly split all the funds made from the NFT sales to any amount of addresses. You can even have the splitter send some of the tokens to another ADO and execute some message there.

Was this helpful?