TransactionSEALED
~!╳●◆!!*~&!▓□&#■?&▓!╳&█◆╳╲@?█▪◆□?░~◇◇▫╳!╱█□~*▫@░&~╱@?▓~□&^■%╲%$●
Transaction ID
Payer
Proposerseq:0 key:0
Authorizers
2Transaction Summary
Contract CallCalled OffersV2, DapperOffersV2, TopShot +4 more
Script Arguments
0amountUFix64
5.00000000
1royalties{Address
{
"0xfaf0cc52c6e3acaf": "0.25000000"
}2offerParamsString{String
{
"resolver": "0",
"nftId": "17384695"
}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
8
9transaction(amount: UFix64, royalties: {Address:UFix64}, offerParamsString: {String:String}) {
10 var nftReceiver: Capability<&{NonFungibleToken.CollectionPublic}>
11 let dapperOffer: &DapperOffersV2.DapperOffer
12 let ducVaultRef: Capability<&DapperUtilityCoin.Vault{FungibleToken.Provider, FungibleToken.Balance}>
13 let resolverCapability: Capability<&{Resolver.ResolverPublic}>
14 var ROYALITY_ADDRESS: Address
15 var ROYALITY_PERCENT: UFix64
16 prepare(signer: AuthAccount, dapper: AuthAccount) {
17 // Link the NFT collection
18 if signer.borrow<&TopShot.Collection>(from: /storage/MomentCollection) == nil {
19 let collection <- TopShot.createEmptyCollection()
20 signer.save(<-collection, to: /storage/MomentCollection)
21 signer.link<&TopShot.Collection{TopShot.MomentCollectionPublic, NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic}>(/public/MomentCollection, target: /storage/MomentCollection)
22 }
23 self.nftReceiver = signer.getCapability<&{NonFungibleToken.CollectionPublic}>(/public/MomentCollection)!
24 if !self.nftReceiver.check() {
25 signer.unlink(/public/MomentCollection)
26 signer.link<&TopShot.Collection{TopShot.MomentCollectionPublic, NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic}>(/public/MomentCollection, target: /storage/MomentCollection)
27 self.nftReceiver = signer.getCapability<&{NonFungibleToken.CollectionPublic}>(/public/MomentCollection)!
28 }
29 // Link the DapperOffer resource
30 if signer.borrow<&DapperOffersV2.DapperOffer>(from: DapperOffersV2.DapperOffersStoragePath) == nil {
31 let dapperOffer <- DapperOffersV2.createDapperOffer() as! @DapperOffersV2.DapperOffer
32 signer.save(<-dapperOffer, to: DapperOffersV2.DapperOffersStoragePath)
33 signer.link<&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferPublic}>(DapperOffersV2.DapperOffersPublicPath, target: DapperOffersV2.DapperOffersStoragePath)
34 signer.link<&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferManager}>(/private/DapperOffersV2, target: DapperOffersV2.DapperOffersStoragePath)
35 }
36 // DapperOfferProxyManager Setup
37 var tokenAdminCollection = signer.getCapability<&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferProxyManager}>(
38 /private/DapperOffersV2
39 )!
40 if !tokenAdminCollection.check() {
41 signer.unlink(/private/DapperOffersV2)
42 signer.link<&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferManager, DapperOffersV2.DapperOfferProxyManager}>(/private/DapperOffersV2, target: DapperOffersV2.DapperOffersStoragePath)
43 }
44 if dapper.borrow<&DapperOffersV2.DapperOffer>(from: DapperOffersV2.DapperOffersStoragePath) == nil {
45 let dapperOffer <- DapperOffersV2.createDapperOffer() as! @DapperOffersV2.DapperOffer
46 dapper.save(<-dapperOffer, to: DapperOffersV2.DapperOffersStoragePath)
47 dapper.link<&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferPublic}>(DapperOffersV2.DapperOffersPublicPath, target: DapperOffersV2.DapperOffersStoragePath)
48 dapper.link<&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferManager, DapperOffersV2.DapperOfferProxyManager}>(/private/DapperOffersV2, target: DapperOffersV2.DapperOffersStoragePath)
49 }
50 // Setup Proxy Cancel for Dapper
51 let capabilityReceiver = dapper.getCapability
52 <&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferPublic}>
53 (/public/DapperOffersV2)!
54 .borrow() ?? panic("Could not borrow capability receiver reference")
55 capabilityReceiver.addProxyCapability(account: signer.address, cap: tokenAdminCollection)
56 // Setup Proxy Cancel for Collection Minter
57 let minter = getAccount(0xe1f2a091f7bb5245)
58 let capabilityReceiverCollectionMinter = minter.getCapability
59 <&DapperOffersV2.DapperOffer{DapperOffersV2.DapperOfferPublic}>
60 (/public/DapperOffersV2)!
61 .borrow() ?? panic("Could not borrow capability receiver reference")
62 capabilityReceiverCollectionMinter.addProxyCapability(account: signer.address, cap: tokenAdminCollection)
63 // Get the capability to the offer creators NFT collection
64 self.nftReceiver = signer.getCapability<&{NonFungibleToken.CollectionPublic}>(/public/MomentCollection)!
65 assert(self.nftReceiver.check(), message: "Missing or mis-typed MomentCollection receiver")
66 self.dapperOffer = signer.borrow<&DapperOffersV2.DapperOffer>(from: DapperOffersV2.DapperOffersStoragePath)
67 ?? panic("Missing or mis-typed DapperOffersV2.DapperOffer")
68 // Get the capability to the DUC vault
69 self.ducVaultRef = dapper.getCapability<&DapperUtilityCoin.Vault{FungibleToken.Provider, FungibleToken.Balance}>(/private/dapperUtilityCoinVault)!
70 assert(self.ducVaultRef.check() != nil, message: "Missing or mis-typed DapperUtilityCoin provider")
71 // Validate marketplace royalties
72 self.ROYALITY_ADDRESS = 0xfaf0cc52c6e3acaf
73 self.ROYALITY_PERCENT = 0.05000000
74 assert(royalties[self.ROYALITY_ADDRESS] == self.ROYALITY_PERCENT * amount, message: "Missing or mis-typed royalty information for marketplace")
75 assert(royalties.keys.length == 1, message: "please provide only one royalty address")
76 // Validate offerParamsString and resolver for type NFT
77 assert(offerParamsString.containsKey("nftId"), message: "nftId missing from offerParamsString")
78 assert(offerParamsString.containsKey("resolver"), message: "resolver missing from offerParamsString")
79 assert(offerParamsString["resolver"] == Resolver.ResolverType.NFT.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", "NFT")
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}