TransactionSEALED
▒&~◇╲%$~▓%◆●%╳▫!╱▪!□■◇▫●#■^$╳~○$%╱~╳*█!*&╱╲□╲▓*◆●◆╱▪●*!□█■╳%@░#?
Transaction ID
Execution Fee
0.0001 FLOWExecution Error
Error Code: 1101
authorizer count mismatch for transaction: expected 3, got 2
Raw Error
[Error Code: 1101] error caused by: 1 error occurred: * transaction preprocess failed: [Error Code: 1101] cadence runtime error: Execution failed: error: authorizer count mismatch for transaction: expected 3, got 2 --> d56b12c43228930559bc675768dd90923c170814215c995496373cd1d3fee608 Was this error unhelpful? Consider suggesting an improvement here: https://github.com/onflow/cadence/issues.
Transaction Summary
Contract CallCalled CricketMoments, FungibleToken, NonFungibleToken +2 more
Script Arguments
0amountsFromBuyerToMinter[UFix64]
[]
1amountsFromMinterToBuyer[UFix64]
[]
2saleItemIDUInt64
106415834
3priceUFix64
20.00000000
4beneficiaryAddressAddress
Cadence Script
1import CricketMoments from 0x4eded0de73020ca5
2import FungibleToken from 0xf233dcee88fe0abe
3import NonFungibleToken from 0x1d7e57aa55817448
4import FazeUtilityCoin from 0x4eded0de73020ca5
5import NFTStorefront from 0x4eb8a10cb9f87357
6
7transaction(amountsFromBuyerToMinter: [UFix64], amountsFromMinterToBuyer: [UFix64], saleItemID: UInt64, price: UFix64, beneficiaryAddress: Address) {
8
9 let paymentVault: @{FungibleToken.Vault}
10 let CricketMomentsCollection: &CricketMoments.Collection
11 let storefront: auth(NFTStorefront.CreateListing) &NFTStorefront.Storefront
12 let listing: &{NFTStorefront.ListingPublic}
13 let tokenAdmin: &FazeUtilityCoin.Administrator
14 let buyerFTTokenReceiver: &{FungibleToken.Receiver}
15 let buyerFTVaultRef: auth(FungibleToken.Withdraw) &FazeUtilityCoin.Vault
16 let buyerNFTAddress: Address
17 let buyerFTAddress: Address
18 let minterAddress: Address
19 let beneficiaryFazeUtilityCoinReceiver: Capability<&FazeUtilityCoin.Vault>
20 let cricketMomentsProvider: Capability<auth(NonFungibleToken.Withdraw) &CricketMoments.Collection>
21 let saleOfferResourceID:UInt64
22 let vaultRef: auth(FungibleToken.Withdraw) &FazeUtilityCoin.Vault
23
24 prepare(buyerFT: auth(BorrowValue, Capabilities, SaveValue) &Account,
25 buyerNFT: auth(BorrowValue, Capabilities, SaveValue) &Account,
26 minter: auth(BorrowValue, Capabilities, SaveValue) &Account) {
27 self.buyerNFTAddress = buyerNFT.address
28 self.buyerFTAddress = buyerFT.address
29 self.minterAddress = minter.address
30 self.vaultRef = minter.storage.borrow<auth(FungibleToken.Withdraw) &FazeUtilityCoin.Vault>(from: FazeUtilityCoin.VaultStoragePath)
31 ?? panic("Could not borrow reference to the owner's Vault!")
32
33 // 0 - Storefront create a listing for the item
34 self.beneficiaryFazeUtilityCoinReceiver = getAccount(self.minterAddress).capabilities.get<&FazeUtilityCoin.Vault>(FazeUtilityCoin.ReceiverPublicPath)
35
36 assert(self.beneficiaryFazeUtilityCoinReceiver.borrow() != nil, message: "Missing or mis-typed beneficiary FazeUtilityCoin receiver")
37
38 self.cricketMomentsProvider = minter.capabilities.storage.issue<auth(NonFungibleToken.Withdraw) &CricketMoments.Collection>(CricketMoments.CollectionStoragePath)
39 assert(self.cricketMomentsProvider.borrow() != nil, message: "Missing or mis-typed CricketMoments.Collection provider")
40
41 self.storefront = minter.storage.borrow<auth(NFTStorefront.CreateListing) &NFTStorefront.Storefront>(from: NFTStorefront.StorefrontStoragePath)
42 ?? panic("Missing or mis-typed NFTStorefront Storefront")
43
44 let beneficiarySaleCut = NFTStorefront.SaleCut(
45 receiver: self.beneficiaryFazeUtilityCoinReceiver,
46 amount: price
47 )
48
49 self.saleOfferResourceID = self.storefront.createListing(
50 nftProviderCapability: self.cricketMomentsProvider,
51 nftType: Type<@CricketMoments.NFT>(),
52 nftID: saleItemID,
53 salePaymentVaultType: Type<@FazeUtilityCoin.Vault>(),
54 saleCuts: [beneficiarySaleCut]
55 )
56
57 self.listing = self.storefront.borrowListing(listingResourceID: self.saleOfferResourceID)
58 ?? panic("No offer with that ID in Storefront")
59
60 // 1 - Admin mints tokens to Buyer - Deposits
61 self.tokenAdmin = minter.storage
62 .borrow<&FazeUtilityCoin.Administrator>(from: FazeUtilityCoin.AdminStoragePath)
63 ?? panic("minter is not the token admin")
64 self.buyerFTTokenReceiver = getAccount(self.buyerFTAddress)
65 .capabilities
66 .borrow<&{FungibleToken.Receiver}>(FazeUtilityCoin.ReceiverPublicPath)
67 ?? panic("Unable to borrow receiver reference")
68
69 // 2 - Withdraw tokens from buyer's vault to send to Minter - Withdrawals
70 self.buyerFTVaultRef = buyerFT.storage.borrow<auth(FungibleToken.Withdraw) &FazeUtilityCoin.Vault>(from: FazeUtilityCoin.VaultStoragePath)
71 ?? panic("Could not borrow reference to the owner's Vault!")
72
73 // 4 - Withdraw payment from buyer
74 // withdraw the payment to complete the listing
75 let mainFazeUtilityCoinVault = buyerFT.storage.borrow<auth(FungibleToken.Withdraw) &FazeUtilityCoin.Vault>(from: FazeUtilityCoin.VaultStoragePath)
76 ?? panic("Cannot borrow FazeUtilityCoin vault from account storage")
77 self.paymentVault <- mainFazeUtilityCoinVault.withdraw(amount: price)
78 // get the CricketMoments collection for depositing
79 self.CricketMomentsCollection = buyerNFT.storage.borrow<&CricketMoments.Collection>(
80 from: CricketMoments.CollectionStoragePath
81 ) ?? panic("Cannot borrow CricketMoments collection receiver from account")
82
83 }
84
85 execute {
86
87 // 1 - NFTStorefront sales
88 let item <- self.listing.purchase(
89 payment: <-self.paymentVault
90 )
91 self.CricketMomentsCollection.deposit(token: <-item)
92 self.storefront.cleanup(listingResourceID: self.saleOfferResourceID)
93
94
95 // 2 - Admin mints tokens to buyer - Deposits
96 var totalAmountFromMinterToBuyer = 0.0
97 for amountFromMinterToBuyer in amountsFromMinterToBuyer {
98 totalAmountFromMinterToBuyer = totalAmountFromMinterToBuyer + amountFromMinterToBuyer
99 }
100 let minter <- self.tokenAdmin.createNewMinter(allowedAmount: totalAmountFromMinterToBuyer)
101 for amountFromMinterToBuyer in amountsFromMinterToBuyer {
102 if self.vaultRef.balance < amountFromMinterToBuyer {
103 let mintedVault <- minter.mintTokens(amount: amountFromMinterToBuyer)
104 self.buyerFTTokenReceiver.deposit(from: <-mintedVault)
105 } else {
106 let sentVault <- self.vaultRef.withdraw(amount: amountFromMinterToBuyer)
107 self.buyerFTTokenReceiver.deposit(from: <-sentVault)
108 }
109 }
110 destroy minter
111
112 // 3 - Withdraw FUCs from buyer's vault to send to Minter - Withdrawals
113 let minterAccount = getAccount(self.minterAddress)
114 let minterReceiverRef = minterAccount.capabilities
115 .borrow<&{FungibleToken.Receiver}>(FazeUtilityCoin.ReceiverPublicPath)
116 ?? panic("Could not borrow receiver reference to the recipient's Vault")
117 for amountFromBuyerToMinter in amountsFromBuyerToMinter {
118 let sentVault <- self.buyerFTVaultRef.withdraw(amount: amountFromBuyerToMinter)
119 minterReceiverRef.deposit(from: <-sentVault)
120 }
121
122 }
123}