Marketplace Setup
Open the starter code for this tutorial in the Flow Playground: https://play.onflow.org/46ad1d6d-3ee2-40d4-adef-bfbad33f9846
The tutorial will be asking you to take various actions to interact with this code.
If you have already completed the Marketplace tutorial, please move on to Composable Resources: Kitty Hats.
This guide will help you quickly get the playground to the state you need to complete the Marketplace tutorial. The marketplace tutorial uses the Fungible Token and Non-Fungible token contracts to allow users to buy and sell NFTs with fungible tokens.
The state of the accounts is the same as if you had completed the Fungible Token and Non-Fungible Token tutorials in the same playground session. Having your playground in this state is necessary to follow the Composable Smart Contracts: Marketplace tutorial.
- Open account
0x01
. Make sure the Fungible Token definitions inFungibleToken.cdc
from the fungible token tutorial are in this account. - Deploy the Fungible Token code to account
0x01
. - Switch to account
0x02
by selecting account0x02
from the account selection menu. - Make sure you have the NFT definitions in
NFTv2.cdc
from the Non-fungible token tutorial in account0x02
. - Deploy the NFT code to account
0x02
. - Run the transaction in Transaction 3. This is the
SetupAccount1Transaction.cdc
file. Use account0x01
as the only signer to set up account0x01
's account.
import FungibleToken from 0x01
import NonFungibleToken from 0x02
// This transaction sets up account 0x01 for the marketplace tutorial
// by publishing a Vault reference and creating an empty NFT Collection.
transaction {
prepare(acct: AuthAccount) {
// Create a public Receiver capability to the Vault
acct.link<&FungibleToken.Vault{FungibleToken.Receiver, FungibleToken.Balance}>
(/public/MainReceiver, target: /storage/MainVault)
log("Created Vault references")
// store an empty NFT Collection in account storage
acct.save<@NonFungibleToken.Collection>(<-NonFungibleToken.createEmptyCollection(), to: /storage/NFTCollection)
// publish a capability to the Collection in storage
acct.link<&{NonFungibleToken.NFTReceiver}>(/public/NFTReceiver, target: /storage/NFTCollection)
log("Created a new empty collection and published a reference")
}
}
- Run the transaction in Transaction 4. This is the
SetupAccount2Transaction.cdc
file. Use account0x02
as the only signer to set up account0x02
's account.
import FungibleToken from 0x01
import NonFungibleToken from 0x02
// This transaction adds an empty Vault to account 0x02
// and mints an NFT with id=1 that is deposited into
// the NFT collection on account 0x01.
transaction {
// Private reference to this account's minter resource
let minterRef: &NonFungibleToken.NFTMinter
prepare(acct: AuthAccount) {
// create a new vault instance with an initial balance of 0
let vaultA <- FungibleToken.createEmptyVault()
// Store the vault in the account storage
acct.save<@FungibleToken.Vault>(<-vaultA, to: /storage/MainVault)
// Create a public Receiver capability to the Vault
let ReceiverRef = acct.link<&FungibleToken.Vault{FungibleToken.Receiver, FungibleToken.Balance}>(/public/MainReceiver, target: /storage/MainVault)
log("Created a Vault and published a reference")
// Borrow a reference for the NFTMinter in storage
self.minterRef = acct.borrow<&NonFungibleToken.NFTMinter>(from: /storage/NFTMinter)
?? panic("Could not borrow an nft minter reference")
}
execute {
// Get the recipient's public account object
let recipient = getAccount(0x01)
// Get the Collection reference for the receiver
// getting the public capability and borrowing a reference from it
let receiverRef = recipient.getCapability<&{NonFungibleToken.NFTReceiver}>(/public/NFTReceiver)
.borrow()
?? panic("Could not borrow an nft receiver reference")
// Mint an NFT and deposit it into account 0x01's collection
self.minterRef.mintNFT(recipient: receiverRef)
log("New NFT minted for account 1")
}
}
- Run the transaction in Transaction 5. This is the
SetupAccount1TransactionMinting.cdc
file. Use account0x01
as the only signer to mint fungible tokens for account 1 and 2.
import FungibleToken from 0x01
import NonFungibleToken from 0x02
// This transaction mints tokens for both accounts using
// the minter stored on account 0x01.
transaction {
// Public Vault Receiver References for both accounts
let acct1Ref: &AnyResource{FungibleToken.Receiver}
let acct2Ref: &AnyResource{FungibleToken.Receiver}
// Private minter references for this account to mint tokens
let minterRef: &FungibleToken.VaultMinter
prepare(acct: AuthAccount) {
// Get the public object for account 0x02
let account2 = getAccount(0x02)
// Retrieve public Vault Receiver references for both accounts
self.acct1Ref = acct.getCapability<&FungibleToken.Vault{FungibleToken.Receiver}>(/public/MainReceiver)
.borrow()
?? panic("Could not borrow acct1 vault receiver reference")
self.acct2Ref = account2.getCapability<&FungibleToken.Vault{FungibleToken.Receiver}>(/public/MainReceiver)
.borrow()
?? panic("Could not borrow acct2 vault receiver reference")
// Get the stored Minter reference for account 0x01
self.minterRef = acct.borrow<&FungibleToken.VaultMinter>(from: /storage/MainMinter)
?? panic("Could not borrow vault minter reference")
}
execute {
// Mint tokens for both accounts
self.minterRef.mintTokens(amount: 20.0, recipient: self.acct2Ref)
self.minterRef.mintTokens(amount: 10.0, recipient: self.acct1Ref)
log("Minted new fungible tokens for account 1 and 2")
}
}
- Run the script
CheckSetupScript.cdc
file in Script 1 to ensure everything is set up.
import FungibleToken from 0x01
import NonFungibleToken from 0x02
// This script checks that the accounts are set up correctly for the marketplace tutorial.
//
// Account 0x01: Vault Balance = 40, NFT.id = 1
// Account 0x02: Vault Balance = 20, No NFTs
pub fun main() {
// Get the accounts' public account objects
let acct1 = getAccount(0x01)
let acct2 = getAccount(0x02)
// Get references to the account's receivers
// by getting their public capability
// and borrowing a reference from the capability
let acct1ReceiverRef = acct1.getCapability<&FungibleToken.Vault{FungibleToken.Balance}>(/public/MainReceiver)
.borrow<&FungibleToken.Vault{FungibleToken.Balance}>()
?? panic("Could not borrow acct1 vault receiver reference")
let acct2ReceiverRef = acct2.getCapability<&FungibleToken.Vault{FungibleToken.Balance}>(/public/MainReceiver)
.borrow()
?? panic("Could not borrow acct2 vault receiver reference")
// Log the Vault balance of both accounts and ensure they are
// the correct numbers.
// Account 0x01 should have 40.
// Account 0x02 should have 20.
log("Account 1 Balance")
log(acct1ReceiverRef.balance)
log("Account 2 Balance")
log(acct2ReceiverRef.balance)
// verify that the balances are correct
if acct1ReceiverRef.balance != 40.0 || acct2ReceiverRef.balance != 20.0 {
panic("Wrong balances!")
}
// Find the public Receiver capability for their Collections
let acct1Capability = acct1.getCapability<&{NonFungibleToken.NFTReceiver}>(/public/NFTReceiver)
let acct2Capability = acct2.getCapability<&{NonFungibleToken.NFTReceiver}>(/public/NFTReceiver)
// borrow references from the capabilities
let nft1Ref = acct1Capability.borrow()
?? panic("Could not borrow acct1 nft receiver reference")
let nft2Ref = acct2Capability.borrow()
?? panic("Could not borrow acct2 nft receiver reference")
// Print both collections as arrays of IDs
log("Account 1 NFTs")
log(nft1Ref.getIDs())
log("Account 2 NFTs")
log(nft2Ref.getIDs())
// verify that the collections are correct
if nft1Ref.getIDs()[0] != 1 as UInt64 || nft2Ref.getIDs().length != 0 {
panic("Wrong Collections!")
}
}
- The script should not panic and you should see something like this output
"Account 1 Vault Balance"
40
"Account 2 Vault Balance"
20
"Account 1 NFTs"
[1]
"Account 2 NFTs"
[]
With your playground now in the correct state, you're ready to continue with the next tutorial.
You do not need to open a new playground session for the marketplace tutorial. You can just continue using this one.