TransactionSEALED

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

Transaction ID

Timestamp

Sep 03, 2024, 11:20:27 AM UTC
1y ago

Block Height

85,910,609

Computation

0

Transaction Summary

Contract Call

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