TransactionSEALED
■◆▪●◆#■■□!▓%○╱╳~&#@&╳!^█▒▫%$□□█#◇%◆$╱?○^?@●$■╱╲■▓●!@%%**~■░!▪▒╱▪
Transaction ID
Execution Fee
0.00001192 FLOWTransaction Summary
Contract CallCalled FlowToken, FungibleToken, MetadataViews +7 more
Script Arguments
0listingResourceIDUInt64
112150187030083
1storefrontAddressAddress
2commissionRecipientAddress?
Cadence Script
1import FlowToken from 0x1654653399040a61
2import FungibleToken from 0xf233dcee88fe0abe
3import MetadataViews from 0x1d7e57aa55817448
4import NonFungibleToken from 0x1d7e57aa55817448
5import NFTStorefrontV2 from 0x4eb8a10cb9f87357
6
7 import HWGarageCard from 0xd0bcefdf1e67ea85
8 import HWGaragePack from 0xd0bcefdf1e67ea85
9 import HWGarageCardV2 from 0xd0bcefdf1e67ea85
10 import HWGaragePackV2 from 0xd0bcefdf1e67ea85
11 import HWGarageTokenV2 from 0xd0bcefdf1e67ea85
12
13
14
15transaction(listingResourceID: UInt64, storefrontAddress: Address, commissionRecipient: Address?) {
16 let paymentVault: @{FungibleToken.Vault}
17 let HWGarageCardV2Collection: &{NonFungibleToken.Receiver}
18 let storefront: &{NFTStorefrontV2.StorefrontPublic}
19 let listing: &{NFTStorefrontV2.ListingPublic}
20 var commissionRecipientCap: Capability<&{FungibleToken.Receiver}>?
21
22 prepare(acct: auth(BorrowValue, IssueStorageCapabilityController, PublishCapability, SaveValue, UnpublishCapability, Storage) &Account) {
23
24
25
26 // HWGaragePack
27 let packCollectionData: MetadataViews.NFTCollectionData = HWGaragePack.resolveContractView(resourceType: nil, viewType: Type<MetadataViews.NFTCollectionData>()) as! MetadataViews.NFTCollectionData?
28 ?? panic("ViewResolver does not resolve NFTCollectionData view")
29
30 // exit if packCollection exists
31 if acct.storage.borrow<&HWGaragePack.Collection>(from: packCollectionData.storagePath) == nil {
32 // create a new empty packCollection for HWGaragePack
33 let packCollection: @{NonFungibleToken.Collection} <- HWGaragePack.createEmptyCollection(nftType: Type<@HWGaragePack.NFT>())
34
35 // save HWGaragePack packCollection to the account
36 acct.storage.save(<-packCollection, to: packCollectionData.storagePath)
37
38 // create a public capability for the HWGaragePack packCollection
39 acct.capabilities.unpublish(packCollectionData.publicPath) // remove any current pubCap
40 let packCollectionCap: Capability<&HWGaragePack.Collection> = acct.capabilities.storage.issue<&HWGaragePack.Collection>(packCollectionData.storagePath)
41 acct.capabilities.publish(packCollectionCap, at: packCollectionData.publicPath)
42 }
43
44 // HWGarageCard
45 let cardCollectionData: MetadataViews.NFTCollectionData = HWGarageCard.resolveContractView(resourceType: nil, viewType: Type<MetadataViews.NFTCollectionData>()) as! MetadataViews.NFTCollectionData?
46 ?? panic("ViewResolver does not resolve NFTCollectionData view")
47
48 // exit if cardCollection exists
49 if acct.storage.borrow<&HWGarageCard.Collection>(from: cardCollectionData.storagePath) == nil {
50 // create a new empty cardCollection for HWGarageCard
51 let cardCollection: @{NonFungibleToken.Collection} <- HWGarageCard.createEmptyCollection(nftType: Type<@HWGarageCard.NFT>())
52
53 // save HWGarageCard cardCollection to the account
54 acct.storage.save(<-cardCollection, to: cardCollectionData.storagePath)
55
56 // create a public capability for the HWGarageCard cardCollection
57 acct.capabilities.unpublish(cardCollectionData.publicPath) // remove any current pubCap
58 let cardCollectionCap: Capability<&HWGarageCard.Collection> = acct.capabilities.storage.issue<&HWGarageCard.Collection>(cardCollectionData.storagePath)
59 acct.capabilities.publish(cardCollectionCap, at: cardCollectionData.publicPath)
60 }
61
62 // HWGarageTokenV2
63 let tokenCollectionDataV2: MetadataViews.NFTCollectionData = HWGarageTokenV2.resolveContractView(resourceType: nil, viewType: Type<MetadataViews.NFTCollectionData>()) as! MetadataViews.NFTCollectionData?
64 ?? panic("ViewResolver does not resolve NFTCollectionData view")
65
66 if acct.storage.borrow<&HWGarageTokenV2.Collection>(from: tokenCollectionDataV2.storagePath) == nil {
67 // create a new empty tokenCollection for HWGarageTokenV2
68 let tokenCollection: @{NonFungibleToken.Collection} <- HWGarageTokenV2.createEmptyCollection(nftType: Type<@HWGarageTokenV2.NFT>())
69
70 // save HWGarageTokenV2 tokenCollection to the account
71 acct.storage.save(<-tokenCollection, to: tokenCollectionDataV2.storagePath)
72
73 // create a public capability for the HWGarageTokenV2 tokenCollection
74 acct.capabilities.unpublish(tokenCollectionDataV2.publicPath) // remove any current pubCap
75 let tokenCollectionCap = acct.capabilities.storage.issue<&HWGarageTokenV2.Collection>(tokenCollectionDataV2.storagePath)
76 acct.capabilities.publish(tokenCollectionCap, at: tokenCollectionDataV2.publicPath)
77 }
78
79 // HWGarageCardV2
80 let cardCollectionDataV2: MetadataViews.NFTCollectionData = HWGarageCardV2.resolveContractView(resourceType: nil, viewType: Type<MetadataViews.NFTCollectionData>()) as! MetadataViews.NFTCollectionData?
81 ?? panic("ViewResolver does not resolve NFTCollectionData view")
82
83 // exit if cardCollection exists
84 if acct.storage.borrow<&HWGarageCardV2.Collection>(from: cardCollectionDataV2.storagePath) == nil {
85 // create a new empty cardCollection for HWGarageCardV2
86 let cardCollection: @{NonFungibleToken.Collection} <- HWGarageCardV2.createEmptyCollection(nftType: Type<@HWGarageCardV2.NFT>())
87
88 // save HWGarageCardV2 cardCollection to the account
89 acct.storage.save(<-cardCollection, to: cardCollectionDataV2.storagePath)
90
91 // create a public capability for the HWGarageCardV2 cardCollection
92 acct.capabilities.unpublish(cardCollectionDataV2.publicPath) // remove any current pubCap
93 let cardCollectionCap = acct.capabilities.storage.issue<&HWGarageCardV2.Collection>(cardCollectionDataV2.storagePath)
94 acct.capabilities.publish(cardCollectionCap, at: cardCollectionDataV2.publicPath)
95 }
96
97 // HWGaragePackV2
98 let garagePackCollectionDataV2: MetadataViews.NFTCollectionData = HWGaragePackV2.resolveContractView(resourceType: nil, viewType: Type<MetadataViews.NFTCollectionData>()) as! MetadataViews.NFTCollectionData?
99 ?? panic("ViewResolver does not resolve NFTCollectionData view")
100
101 // exit if packCollection exists
102 if acct.storage.borrow<&HWGaragePackV2.Collection>(from: garagePackCollectionDataV2.storagePath) == nil {
103 // create a new empty packCollection for HWGaragePackV2
104 let packCollection: @{NonFungibleToken.Collection} <- HWGaragePackV2.createEmptyCollection(nftType: Type<@HWGaragePackV2.NFT>())
105
106 // save HWGaragePackV2 packCollection to the account
107 acct.storage.save(<-packCollection, to: garagePackCollectionDataV2.storagePath)
108
109 // create a public capability for the HWGaragePackV2 packCollection
110 acct.capabilities.unpublish(garagePackCollectionDataV2.publicPath) // remove any current pubCap
111 let packCollectionCap = acct.capabilities.storage.issue<&HWGaragePackV2.Collection>(garagePackCollectionDataV2.storagePath)
112 acct.capabilities.publish(packCollectionCap, at: garagePackCollectionDataV2.publicPath)
113 }
114
115
116
117 if acct.storage.borrow<&NFTStorefrontV2.Storefront>(from: NFTStorefrontV2.StorefrontStoragePath) == nil {
118
119 // Create a new empty Storefront
120 let storefront <- NFTStorefrontV2.createStorefront() as! @NFTStorefrontV2.Storefront
121
122 // save it to the account
123 acct.storage.save(<-storefront, to: NFTStorefrontV2.StorefrontStoragePath)
124
125 // create a public capability for the Storefront
126 let storefrontPublicCap = acct.capabilities.storage.issue<&{NFTStorefrontV2.StorefrontPublic}>(
127 NFTStorefrontV2.StorefrontStoragePath
128 )
129 acct.capabilities.publish(storefrontPublicCap, at: NFTStorefrontV2.StorefrontPublicPath)
130 }
131
132
133
134 self.commissionRecipientCap = nil
135 self.storefront = getAccount(storefrontAddress).capabilities.borrow<&{NFTStorefrontV2.StorefrontPublic}>(
136 NFTStorefrontV2.StorefrontPublicPath
137 ) ?? panic("Could not borrow Storefront from provided address")
138
139 // Borrow the listing
140 self.listing = self.storefront.borrowListing(listingResourceID: listingResourceID)
141 ?? panic("No Offer with that ID in Storefront")
142 let price = self.listing.getDetails().salePrice
143
144 let mainFlowVault = acct.storage.borrow<auth(FungibleToken.Withdraw) &FlowToken.Vault>(from: /storage/flowTokenVault)
145 ?? panic("Cannot borrow FlowToken vault from acct storage")
146 // Access the vault of the buyer to pay the sale price of the listing.
147 self.paymentVault <- mainFlowVault.withdraw(amount: price)
148
149 let collectionData = HWGarageCardV2.resolveContractView(resourceType: nil, viewType: Type<MetadataViews.NFTCollectionData>()) as! MetadataViews.NFTCollectionData?
150 ?? panic("ViewResolver does not resolve NFTCollectionData view")
151
152 // Access the buyer's NFT collection to store the purchased NFT.
153 self.HWGarageCardV2Collection = acct.capabilities.borrow<&{NonFungibleToken.Receiver}>(collectionData.publicPath)
154 ?? panic("Cannot borrow buyers Pack collection receiver")
155
156 let commissionAmount = self.listing.getDetails().commissionAmount
157
158 if commissionRecipient != nil && commissionAmount != 0.0 {
159 let _commissionRecipientCap = getAccount(commissionRecipient!).capabilities.get<&{FungibleToken.Receiver}>(
160 /public/flowTokenReceiver
161 )
162 // Access the capability to receive the commission.
163 assert(_commissionRecipientCap.check(), message: "Commission Recipient doesn't have FT receiving capability")
164 self.commissionRecipientCap = _commissionRecipientCap
165 } else if commissionAmount == 0.0 {
166 self.commissionRecipientCap = nil
167 } else {
168 panic("Commission recipient can not be empty when commission amount is non zero")
169 }
170 }
171
172 execute {
173 // Purchase the NFT
174 let item <- self.listing.purchase(
175 payment: <-self.paymentVault,
176 commissionRecipient: self.commissionRecipientCap
177 )
178 // Deposit the NFT in the buyer's collection.
179 self.HWGarageCardV2Collection.deposit(token: <-item)
180 }
181}