|
| 1 | +import "FungibleToken" |
| 2 | +import "FungibleTokenMetadataViews" |
| 3 | +import "ViewResolver" |
| 4 | + |
| 5 | +/// Returns the Cadence FungibleToken balance for the given account, resolving the |
| 6 | +/// vault's public metadata path dynamically via the FTVaultData metadata view. |
| 7 | +/// |
| 8 | +/// Useful for checking balances of VM-bridged ERC-20 tokens without hard-coding public paths. |
| 9 | +/// |
| 10 | +/// @param address: The account address to check |
| 11 | +/// @param vaultIdentifier: The Cadence type identifier (e.g. "A.1e4aa0b87d10b141.EVMVMBridgedToken_...Vault") |
| 12 | +/// @return UFix64?: The vault balance, or nil if the vault is not set up for this account |
| 13 | +/// |
| 14 | +access(all) fun main(address: Address, vaultIdentifier: String): UFix64? { |
| 15 | + let vaultType = CompositeType(vaultIdentifier) |
| 16 | + if vaultType == nil { return nil } |
| 17 | + |
| 18 | + let contractAddr = vaultType!.address |
| 19 | + if contractAddr == nil { return nil } |
| 20 | + let contractName = vaultType!.contractName |
| 21 | + if contractName == nil { return nil } |
| 22 | + |
| 23 | + let viewResolver = getAccount(contractAddr!).contracts.borrow<&{ViewResolver}>(name: contractName!) |
| 24 | + if viewResolver == nil { return nil } |
| 25 | + |
| 26 | + let vaultData = viewResolver!.resolveContractView( |
| 27 | + resourceType: vaultType!, |
| 28 | + viewType: Type<FungibleTokenMetadataViews.FTVaultData>() |
| 29 | + ) as? FungibleTokenMetadataViews.FTVaultData |
| 30 | + if vaultData == nil { return nil } |
| 31 | + |
| 32 | + return getAccount(address).capabilities.borrow<&{FungibleToken.Vault}>(vaultData!.metadataPath)?.balance |
| 33 | +} |
0 commit comments