MarketplaceSEALED
╲░▒█?▒▪^&○▪*╲%@%%▪!!@#^╲^◆%~╲#◇%╲**&▪○╲#&▪?■□▓■@#@~◇▪$▓~$&░■$▪&○
Transaction ID
Execution Fee
0.00017469 FLOWTransaction Summary
MarketplaceCalled FungibleToken, NonFungibleToken, DapperUtilityCoin +7 more
Script Arguments
0itemNftIDUInt64
4812721
1itemSalePriceUFix64
0.10000000
2customIDString?
MKT-
3expiryUInt64
1771896830
Cadence Script
1import FungibleToken from 0xf233dcee88fe0abe
2import NonFungibleToken from 0x1d7e57aa55817448
3import DapperUtilityCoin from 0xead892083b3e2c6c
4import NFTStorefrontV2 from 0x4eb8a10cb9f87357
5import MetadataViews from 0x1d7e57aa55817448
6import TokenForwarding from 0xe544175ee0461c4b
7import FungibleTokenMetadataViews from 0xf233dcee88fe0abe
8import TiblesApp from 0x5cdeb067561defcb
9import TiblesNFT from 0x5cdeb067561defcb
10import Seussibles from 0x321d8fcde05f6e8c
11
12transaction(itemNftID: UInt64, itemSalePrice: UFix64, customID: String?, expiry: UInt64) {
13 let nftProvider: Capability<auth(NonFungibleToken.Withdraw) &{NonFungibleToken.Collection}>
14 let storefront: auth(NFTStorefrontV2.CreateListing) &NFTStorefrontV2.Storefront
15 let saleCuts: [NFTStorefrontV2.SaleCut]
16
17 prepare(
18 tiblesAcct: &Account,
19 seller: auth(BorrowValue, IssueStorageCapabilityController, PublishCapability, SaveValue, StorageCapabilities) &Account
20 ) {
21 assert(tiblesAcct.address == 0x61bce270cd80a7c2, message: "Listing requires authorizing signature")
22
23 // If the account doesn't already have a storefront, create one and add it to the account
24 if seller.storage.borrow<&NFTStorefrontV2.Storefront>(from: NFTStorefrontV2.StorefrontStoragePath) == nil {
25 let storefront <- NFTStorefrontV2.createStorefront() as! @NFTStorefrontV2.Storefront
26 seller.storage.save(<-storefront, to: NFTStorefrontV2.StorefrontStoragePath)
27 let cap = seller.capabilities.storage.issue<&{NFTStorefrontV2.StorefrontPublic}>(NFTStorefrontV2.StorefrontStoragePath)
28 seller.capabilities.publish(cap, at: NFTStorefrontV2.StorefrontPublicPath)
29 }
30
31 let ducVaultData = DapperUtilityCoin.resolveContractView(resourceType: nil, viewType: Type<FungibleTokenMetadataViews.FTVaultData>()) as! FungibleTokenMetadataViews.FTVaultData?
32 ?? panic("Could not get vault data view for the contract")
33
34 let sellerAccount = getAccount(seller.address)
35 let sellerDucReceiver = sellerAccount.capabilities.get<&{FungibleToken.Receiver}>(ducVaultData.receiverPath)
36 assert(sellerDucReceiver.borrow() != nil, message: "Missing or mis-typed DUC receiver")
37
38 let marketAccount = getAccount(0x1f590411eaca135f)
39 let marketDucReceiver = marketAccount.capabilities.get<&{FungibleToken.Receiver}>(ducVaultData.receiverPath)
40 assert(marketDucReceiver.borrow() != nil, message: "Missing or mis-typed DUC receiver")
41
42 let marketFee: UFix64 = getMarketFee(itemSalePrice: itemSalePrice)
43
44 self.saleCuts = []
45 self.saleCuts.append(NFTStorefrontV2.SaleCut(
46 receiver: marketDucReceiver,
47 amount: marketFee
48 ))
49
50 let sellerCut = itemSalePrice - marketFee
51
52 self.saleCuts.append(NFTStorefrontV2.SaleCut(
53 receiver: sellerDucReceiver,
54 amount: sellerCut
55 ))
56
57 let collectionData = Seussibles.resolveContractView(resourceType: nil, viewType: Type<MetadataViews.NFTCollectionData>()) as! MetadataViews.NFTCollectionData?
58 ?? panic("ViewResolver does not resolve NFTCollectionData view")
59
60
61 var nftProviderCap: Capability<auth(NonFungibleToken.Withdraw) &{NonFungibleToken.Collection}>? = nil
62 let nftCollectionControllers = seller.capabilities.storage.getControllers(forPath: collectionData.storagePath)
63 for controller in nftCollectionControllers {
64 if let maybeProviderCap = controller.capability as? Capability<auth(NonFungibleToken.Withdraw) &{NonFungibleToken.Collection}>? {
65 nftProviderCap = maybeProviderCap
66 break
67 }
68 }
69 if nftProviderCap == nil || nftProviderCap?.check() ?? false {
70 nftProviderCap = seller.capabilities.storage.issue<auth(NonFungibleToken.Withdraw) &{NonFungibleToken.Collection}>(collectionData.storagePath)
71 }
72 assert(nftProviderCap?.check() ?? false, message: "Could not assign Provider Capability")
73 self.nftProvider = nftProviderCap!
74
75 // self.nftProvider = seller.capabilities.storage.issue<auth(NonFungibleToken.Withdraw) &{NonFungibleToken.Collection}>(collectionData.storagePath)
76 // assert(self.nftProvider.check() != nil, message: "Missing or mis-typed Seussibles.Collection provider")
77
78 self.storefront = seller.storage.borrow<auth(NFTStorefrontV2.CreateListing) &NFTStorefrontV2.Storefront>(from: NFTStorefrontV2.StorefrontStoragePath)
79 ?? panic("Missing or mis-typed NFTStorefront Storefront")
80 }
81
82 execute {
83 var sumOfSaleCuts = 0.0 as UFix64
84 for listing in self.saleCuts {
85 sumOfSaleCuts = sumOfSaleCuts + listing.amount
86 }
87 assert(
88 sumOfSaleCuts == itemSalePrice,
89 message: "Sum of sale cuts: "
90 .concat(sumOfSaleCuts.toString())
91 .concat(", must be equal to item sale price: ")
92 .concat(itemSalePrice.toString())
93 )
94
95 self.storefront.createListing(
96 nftProviderCapability: self.nftProvider,
97 nftType: Type<@Seussibles.NFT>(),
98 nftID: itemNftID,
99 salePaymentVaultType: Type<@DapperUtilityCoin.Vault>(),
100 saleCuts: self.saleCuts,
101 marketplacesCapability: nil,
102 customID: customID,
103 commissionAmount: 0.0,
104 expiry: expiry
105 )
106 }
107}
108
109access(all) fun getMarketFee(itemSalePrice: UFix64): UFix64 {
110 return itemSalePrice * 0.025
111}