TransactionSEALED
▒▫╲?*□░&■□■##□○@▫^!░□░▫●▫?█?█!▒╲*$●^▪◆$^◇░○█~█▫▪■╲●▫▪@▒◇!█?%*█○░
Transaction ID
Execution Fee
0.00001824 FLOWTransaction Summary
Contract Call
Called NonFungibleToken, MetadataViews, ViewResolver +2 more
Script Arguments
Copy:
0tokenIDUInt64
38
1toAddress
2nftProviderAddressAddress
3nftProviderControllerIDUInt64
0
4typeIdentifierString
Cadence Script
1import NonFungibleToken from 0x1d7e57aa55817448
2import MetadataViews from 0x1d7e57aa55817448
3import ViewResolver from 0x1d7e57aa55817448
4import HybridCustody from 0xd8a7e05a7ac670c0
5import AddressUtils from 0xa340dc0a4ec828ab
6
7/*
8Flowty - NFT Transfer - No Catalog
9Transfer an NFT from the nftProvider (childAccount) to a specified recipient.
10 */
11
12transaction(
13 tokenID: UInt64,
14 to: Address,
15 nftProviderAddress: Address,
16 nftProviderControllerID: UInt64,
17 typeIdentifier: String
18) {
19 let nftProvider: auth(NonFungibleToken.Withdraw) &{NonFungibleToken.Provider, NonFungibleToken.CollectionPublic}
20 prepare(signer: auth(Capabilities, Storage) &Account) {
21 let nftType = CompositeType(typeIdentifier) ?? panic("invalid type identifier")
22 let contractAddress = AddressUtils.parseAddress(nftType)!
23 let contractName = typeIdentifier.split(separator: ".")[2]
24
25 let c = getAccount(contractAddress).contracts.borrow<&{ViewResolver}>(name: contractName) ?? panic ("Specified contract address and name is not found or does not implement ViewResolver contract.")
26 let md = c.resolveContractView(resourceType: nftType, viewType: Type<MetadataViews.NFTCollectionData>()) ?? panic("NFTCollectionData view not found on the contract.")
27 let collectionData = md as! MetadataViews.NFTCollectionData
28
29 if nftProviderAddress == signer.address {
30 self.nftProvider = signer.storage.borrow<auth(NonFungibleToken.Withdraw) &{NonFungibleToken.Provider, NonFungibleToken.CollectionPublic}>(from: collectionData.storagePath)
31 ?? panic("could not find sender collection")
32 } else {
33 let manager = signer.storage.borrow<auth(HybridCustody.Manage) &HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath)
34 ?? panic("manager does not exist")
35 let childAcct = manager.borrowAccount(addr: nftProviderAddress) ?? panic("nftProvider account not found")
36
37 let providerCap = childAcct.getCapability(controllerID: nftProviderControllerID, type: Type<auth(NonFungibleToken.Withdraw) &{NonFungibleToken.Provider, NonFungibleToken.CollectionPublic}>()) ?? panic("no cap found")
38 let nftProviderCap = providerCap as! Capability<auth(NonFungibleToken.Withdraw) &{NonFungibleToken.Provider, NonFungibleToken.CollectionPublic}>
39 self.nftProvider = nftProviderCap.borrow() ?? panic("unable to borrow child account collection provider")
40 }
41
42 let recipient = getAccount(to).capabilities.get<&{NonFungibleToken.CollectionPublic}>(collectionData.publicPath).borrow() ?? panic("invalid receiver collection")
43 let nft <- self.nftProvider.withdraw(withdrawID: tokenID)
44 recipient.deposit(token: <-nft)
45 }
46}