TransactionSEALED

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

Transaction ID

Timestamp

Jun 03, 2025, 11:14:31 PM UTC
9mo ago

Block Height

115,247,204

Computation

0

Execution Fee

0.00001224 FLOW

Transaction Summary

Contract Call

Called NonFungibleToken, MetadataViews, ViewResolver +2 more

Script Arguments

Copy:
0tokenIDUInt64
2
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}