TransactionSEALED
▒■$▫╲◇*●%▓^□▓*■□#■$╳▒#▒▪●^$$●▫█◆▓~■╲@□▒&^@□$◇╲&○╲~^░■●○!■*!╳*╳^▓
Transaction ID
Payer
Proposerseq:0 key:0
Authorizers
2Transaction Summary
Contract CallCalled OffersV2, DapperOffersV2, TopShot +4 more
Script Arguments
0amountUFix64
65.00000000
1royalties{Address
{
"0xfaf0cc52c6e3acaf": "3.25000000"
}2offerParamsString{String
{
"resolver": "1",
"setId": "53",
"playId": "2334",
"setUuid": "ddfe1fcb-c3f5-449f-b645-5fc4d308cc64",
"playUuid": "451e5da0-fd8d-400f-a965-e67681ed6dc8"
}Cadence Script
1import OffersV2 from 0xb8ea91944fd51c43
2import DapperOffersV2 from 0xb8ea91944fd51c43
3import TopShot from 0x0b2a3299cc857e29
4import NonFungibleToken from 0x1d7e57aa55817448
5import FungibleToken from 0xf233dcee88fe0abe
6import DapperUtilityCoin from 0xead892083b3e2c6c
7import Resolver from 0xb8ea91944fd51c43
8transaction(amount: UFix64, royalties: {Address:UFix64}, offerParamsString: {String:String}) {
9 var nftReceiver: Capability<&{NonFungibleToken.CollectionPublic}>
10 let dapperOffer: &DapperOffersV2.DapperOffer
11 let ducVaultRef: Capability<&DapperUtilityCoin.Vault{FungibleToken.Provider, FungibleToken.Balance}>
12 let resolverCapability: Capability<&{Resolver.ResolverPublic}>
13 var ROYALITY_ADDRESS: Address
14 var ROYALITY_PERCENT: UFix64
15 prepare(signer: AuthAccount, dapper: AuthAccount) {
16 // Link the NFT collection
17 if signer.borrow<&TopShot.Collection>(from: /storage/MomentCollection) == nil {
18 let collection <- TopShot.createEmptyCollection()
19 signer.save(<-collection, to: /storage/MomentCollection)
20 signer.link<&TopShot.Collection{TopShot.MomentCollectionPublic, NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic}>(/public/MomentCollection, target: /storage/MomentCollection)
21 }
22 self.nftReceiver = signer.getCapability<&{NonFungibleToken.CollectionPublic}>(/public/MomentCollection)!
23 if !self.nftReceiver.check() {
24 signer.unlink(/public/MomentCollection)
25 signer.link<&TopShot.Collection{TopShot.MomentCollectionPublic, NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic}>(/public/MomentCollection, target: /storage/MomentCollection)
26 self.nftReceiver = signer.getCapability<&{NonFungibleToken.CollectionPublic}>(/public/MomentCollection)!
27 }
28 // Link the DapperOffer resource
29 if signer.borrow<&DapperOffersV2.DapperOffer>(from: DapperOffersV2.DapperOffersStoragePath) == nil {
30 let dapperOffer <- DapperOffersV2.createDapperOffer() as! @DapperOffersV2.DapperOffer
31 signer.save(<-dapperOffer, to: DapperOffersV2.DapperOffersStoragePath)
32 signer.link<&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferPublic}>(DapperOffersV2.DapperOffersPublicPath, target: DapperOffersV2.DapperOffersStoragePath)
33 signer.link<&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferManager}>(/private/DapperOffersV2, target: DapperOffersV2.DapperOffersStoragePath)
34 }
35 // DapperOfferProxyManager Setup
36 var tokenAdminCollection = signer.getCapability<&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferProxyManager}>(
37 /private/DapperOffersV2
38 )!
39 if !tokenAdminCollection.check() {
40 signer.unlink(/private/DapperOffersV2)
41 signer.link<&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferManager, DapperOffersV2.DapperOfferProxyManager}>(/private/DapperOffersV2, target: DapperOffersV2.DapperOffersStoragePath)
42 }
43 if dapper.borrow<&DapperOffersV2.DapperOffer>(from: DapperOffersV2.DapperOffersStoragePath) == nil {
44 let dapperOffer <- DapperOffersV2.createDapperOffer() as! @DapperOffersV2.DapperOffer
45 dapper.save(<-dapperOffer, to: DapperOffersV2.DapperOffersStoragePath)
46 dapper.link<&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferPublic}>(DapperOffersV2.DapperOffersPublicPath, target: DapperOffersV2.DapperOffersStoragePath)
47 dapper.link<&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferManager, DapperOffersV2.DapperOfferProxyManager}>(/private/DapperOffersV2, target: DapperOffersV2.DapperOffersStoragePath)
48 }
49 // Setup Proxy Cancel for Dapper
50 let capabilityReceiver = dapper.getCapability
51 <&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferPublic}>
52 (/public/DapperOffersV2)!
53 .borrow() ?? panic("Could not borrow capability receiver reference")
54 capabilityReceiver.addProxyCapability(account: signer.address, cap: tokenAdminCollection)
55 // Setup Proxy Cancel for Collection Minter
56 let minter = getAccount(0xe1f2a091f7bb5245)
57 let capabilityReceiverCollectionMinter = minter.getCapability
58 <&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferPublic}>
59 (/public/DapperOffersV2)!
60 .borrow() ?? panic("Could not borrow capability receiver reference")
61 capabilityReceiverCollectionMinter.addProxyCapability(account: signer.address, cap: tokenAdminCollection)
62 // Get the capability to the offer creators NFT collection
63 self.nftReceiver = signer.getCapability<&{NonFungibleToken.CollectionPublic}>(/public/MomentCollection)!
64 assert(self.nftReceiver.check(), message: "Missing or mis-typed MomentCollection receiver")
65 self.dapperOffer = signer.borrow<&DapperOffersV2.DapperOffer>(from: DapperOffersV2.DapperOffersStoragePath)
66 ?? panic("Missing or mis-typed DapperOffersV2.DapperOffer")
67 // Get the capability to the DUC vault
68 self.ducVaultRef = dapper.getCapability<&DapperUtilityCoin.Vault{FungibleToken.Provider, FungibleToken.Balance}>(/private/dapperUtilityCoinVault)!
69 assert(self.ducVaultRef.check() != nil, message: "Missing or mis-typed DapperUtilityCoin provider")
70 // Validate marketplace royalties
71 self.ROYALITY_ADDRESS = 0xfaf0cc52c6e3acaf
72 self.ROYALITY_PERCENT = 0.05000000
73 assert(royalties[self.ROYALITY_ADDRESS] == self.ROYALITY_PERCENT * amount, message: "Missing or mis-typed royalty information for marketplace")
74 assert(royalties.keys.length == 1, message: "please provide only one royalty address")
75 // Validate offerParamsString and resolver for type TopShotEdition
76 assert(offerParamsString.containsKey("playId"), message: "playId missing from offerParamsString")
77 assert(offerParamsString.containsKey("setId"), message: "setId missing from offerParamsString")
78 assert(offerParamsString.containsKey("resolver"), message: "resolver missing from offerParamsString")
79 assert(offerParamsString["resolver"] == Resolver.ResolverType.TopShotEdition.rawValue.toString(), message: "Invalid resolver")
80 // Setup and link offer Resolver
81 if signer.borrow<&Resolver.OfferResolver>(from: /storage/OfferResolver) == nil {
82 let resolver <- Resolver.createResolver()
83 signer.save(<-resolver, to: /storage/OfferResolver)
84 signer.link<&Resolver.OfferResolver{Resolver.ResolverPublic}>(/public/OfferResolver, target: /storage/OfferResolver)
85 }
86 self.resolverCapability = signer.getCapability<&{Resolver.ResolverPublic}>(/public/OfferResolver)!
87 }
88 execute {
89 var royaltysList: [OffersV2.Royalty] = []
90 let keys = royalties.keys
91 for key in keys {
92 royaltysList.append(OffersV2.Royalty(
93 receiver: getAccount(key).getCapability<&{FungibleToken.Receiver}>(/public/dapperUtilityCoinReceiver),
94 amount: royalties[key]!
95 ))
96 }
97 offerParamsString.insert(key: "typeId", "Type<@TopShot.NFT>()")
98 offerParamsString.insert(key: "_type", "TopShotEdition")
99 self.dapperOffer.createOffer(
100 vaultRefCapability: self.ducVaultRef,
101 nftReceiverCapability: self.nftReceiver,
102 nftType: Type<@TopShot.NFT>(),
103 amount: amount,
104 royalties: royaltysList,
105 offerParamsString: offerParamsString,
106 offerParamsUFix64: {},
107 offerParamsUInt64: {},
108 resolverCapability: self.resolverCapability
109 )
110 }
111}