TransactionSEALED

▒■$▫╲◇*●%▓^□▓*■□#■$╳▒#▒▪●^$$●▫█◆▓~■╲@□▒&^@□$◇╲&○╲~^░■●○!■*!╳*╳^▓

Transaction ID

Timestamp

Sep 03, 2024, 04:14:47 PM UTC
1y ago

Block Height

85,924,706

Computation

0

Transaction Summary

Contract Call

Called 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}