abel-ghost-sdk 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import { getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56';
2
2
  import { AppClient as _AppClient, } from '@algorandfoundation/algokit-utils/types/app-client';
3
3
  import { AppFactory as _AppFactory } from '@algorandfoundation/algokit-utils/types/app-factory';
4
- export const APP_SPEC = { "name": "AbelReader", "structs": { "AssetTinyLabels": [{ "name": "name", "type": "string" }, { "name": "unitName", "type": "string" }, { "name": "decimals", "type": "uint8" }, { "name": "labels", "type": "string[]" }] }, "methods": [{ "name": "getAssetsTiny", "args": [{ "type": "uint64[]", "name": "assetIds" }, { "type": "uint64", "name": "abelAppId" }], "returns": { "type": "(string,string,uint8,string[])", "struct": "AssetTinyLabels" }, "actions": { "create": ["NoOp"], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "get_asset_labels", "args": [{ "type": "asset", "name": "assetId" }], "returns": { "type": "string[]" }, "actions": { "create": ["NoOp"], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": ["DeleteApplication", "UpdateApplication"] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [212], "errorMessage": "Bytes has valid prefix" }, { "pc": [8], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [41], "errorMessage": "OnCompletion must be one of UpdateApplication, DeleteApplication && can only call when not creating" }, { "pc": [227, 234, 237], "errorMessage": "asset exists" }, { "pc": [116], "errorMessage": "index access is out of bounds" }, { "pc": [75], "errorMessage": "invalid array length header" }, { "pc": [87], "errorMessage": "invalid number of bytes for arc4.dynamic_array<asset>" }, { "pc": [95, 217], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [365], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [243], "errorMessage": "overflow" }], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwIDggVE1QTF9VUERBVEFCTEUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjEyCiAgICAvLyBleHBvcnQgY2xhc3MgQWJlbFJlYWRlciBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FkbWluT25seUA5CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgcHVzaGJ5dGVzcyAweGQ1YWIzMzY2IDB4YzJlZDc0M2YgLy8gbWV0aG9kICJnZXRBc3NldHNUaW55KHVpbnQ2NFtdLHVpbnQ2NCkoc3RyaW5nLHN0cmluZyx1aW50OCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldF9sYWJlbHMoYXNzZXQpc3RyaW5nW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBnZXRBc3NldHNUaW55IGdldEFzc2V0TGFiZWxzCiAgICBlcnIKCm1haW5fYWRtaW5Pbmx5QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czoxMwogICAgLy8gQGJhcmVtZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsiVXBkYXRlQXBwbGljYXRpb24iLCAiRGVsZXRlQXBwbGljYXRpb24iXSB9KQogICAgaW50Y18wIC8vIDEKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHNobAogICAgcHVzaGludCA0OCAvLyA0OAogICAgJgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgb25lIG9mIFVwZGF0ZUFwcGxpY2F0aW9uLCBEZWxldGVBcHBsaWNhdGlvbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czoxNQogICAgLy8gbG9nKCIxIikKICAgIHB1c2hieXRlcyAiMSIKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MTYKICAgIC8vIGFzc2VydChUZW1wbGF0ZVZhcjx1aW50NjQ+KCJVUERBVEFCTEUiKSA9PT0gMSAmJiBUeG4uc2VuZGVyID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MpOwogICAgaW50Y18zIC8vIFRNUExfVVBEQVRBQkxFCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IG1haW5fYm9vbF9mYWxzZUAxMwogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYnogbWFpbl9ib29sX2ZhbHNlQDEzCiAgICBpbnRjXzAgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MTMKICAgIC8vIEBiYXJlbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbIlVwZGF0ZUFwcGxpY2F0aW9uIiwgIkRlbGV0ZUFwcGxpY2F0aW9uIl0gfSkKICAgIHJldHVybgoKbWFpbl9ib29sX2ZhbHNlQDEzOgogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjEzCiAgICAvLyBAYmFyZW1ldGhvZCh7IGFsbG93QWN0aW9uczogWyJVcGRhdGVBcHBsaWNhdGlvbiIsICJEZWxldGVBcHBsaWNhdGlvbiJdIH0pCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo6QWJlbFJlYWRlci5nZXRBc3NldHNUaW55W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0QXNzZXRzVGlueToKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDMKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MTkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSwgb25DcmVhdGU6ICJhbGxvdyIgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhc3NldD4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjIxCiAgICAvLyBmb3IgKGxldCBpZHg6IHVpbnQ2NCA9IDA7IGlkeCA8IGFzc2V0SWRzLmxlbmd0aDsgaWR4KyspIHsKICAgIGludGNfMSAvLyAwCgpnZXRBc3NldHNUaW55X3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MjEKICAgIC8vIGZvciAobGV0IGlkeDogdWludDY0ID0gMDsgaWR4IDwgYXNzZXRJZHMubGVuZ3RoOyBpZHgrKykgewogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogZ2V0QXNzZXRzVGlueV9hZnRlcl93aGlsZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MjIKICAgIC8vIGNvbnN0IGFzc2V0ID0gYXNzZXRJZHNbaWR4XTsKICAgIGRpZyAzCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBkdXAyCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidXJ5IDExCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjIzCiAgICAvLyBjb25zdCBbXywgZXhpc3RzXSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0Q3JlYXRvcihhc3NldC5pZCk7CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czoyNAogICAgLy8gaWYgKCFleGlzdHMpIHsKICAgIGJueiBnZXRBc3NldHNUaW55X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo0Ny01MgogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgbmFtZTogIiIsCiAgICAvLyAgIHVuaXRfbmFtZTogIiIsCiAgICAvLyAgIGRlY2ltYWxzOiBuZXcgVWludDgoMCksCiAgICAvLyAgIGxhYmVsczogW10sCiAgICAvLyB9OwogICAgcHVzaGJ5dGVzIDB4MDAwNzAwMDkwMDAwMGIwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjI1CiAgICAvLyBsb2coZW5jb2RlQXJjNCh0aGlzLmdldEVtcHR5QXNzZXRUaW55TGFiZWxzKCkpKTsKICAgIGxvZwoKZ2V0QXNzZXRzVGlueV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MjEKICAgIC8vIGZvciAobGV0IGlkeDogdWludDY0ID0gMDsgaWR4IDwgYXNzZXRJZHMubGVuZ3RoOyBpZHgrKykgewogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGdldEFzc2V0c1Rpbnlfd2hpbGVfdG9wQDIKCmdldEFzc2V0c1RpbnlfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czoyNwogICAgLy8gY29uc3QgcHY6IHVpbnQ2NCA9IGFiZWxBcHBJZCAhPT0gMCA/IGNvbXBpbGVBcmM0KEFiZWxTdHViKS5jYWxsLmhhc19hc3NldF9sYWJlbCh7IGFwcElkOiBhYmVsQXBwSWQsIGFyZ3M6IFthc3NldC5pZCwgInB2Il0gfSkucmV0dXJuVmFsdWUgOiAwCiAgICBkaWcgMQogICAgYnogZ2V0QXNzZXRzVGlueV90ZXJuYXJ5X2ZhbHNlQDgKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hieXRlcyAweDk3ZjQwYThhIC8vIG1ldGhvZCAiaGFzX2Fzc2V0X2xhYmVsKHVpbnQ2NCxzdHJpbmcpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA4CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwMjcwNzYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCgpnZXRBc3NldHNUaW55X3Rlcm5hcnlfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjI5CiAgICAvLyBuYW1lOiBhc3NldC5uYW1lLnRvU3RyaW5nKCksCiAgICBkaWcgNQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MzAKICAgIC8vIHVuaXRfbmFtZTogYXNzZXQudW5pdE5hbWUudG9TdHJpbmcoKSwKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBzd2FwCiAgICBidXJ5IDkKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjMxCiAgICAvLyBkZWNpbWFsczogbmV3IFVpbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czozMgogICAgLy8gbGFiZWxzOiBwdiA9PT0gMCA/IFtdIGFzIHN0cmluZ1tdIDogWyJwdiJdLAogICAgYm56IGdldEFzc2V0c1RpbnlfdGVybmFyeV9mYWxzZUAxMQogICAgcHVzaGJ5dGVzIDB4MDAwMAoKZ2V0QXNzZXRzVGlueV90ZXJuYXJ5X21lcmdlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MjgtMzMKICAgIC8vIGNvbnN0IGFzc2V0SW5mbzogQXNzZXRUaW55TGFiZWxzID0gewogICAgLy8gICBuYW1lOiBhc3NldC5uYW1lLnRvU3RyaW5nKCksCiAgICAvLyAgIHVuaXRfbmFtZTogYXNzZXQudW5pdE5hbWUudG9TdHJpbmcoKSwKICAgIC8vICAgZGVjaW1hbHM6IG5ldyBVaW50OChhc3NldC5kZWNpbWFscyksCiAgICAvLyAgIGxhYmVsczogcHYgPT09IDAgPyBbXSBhcyBzdHJpbmdbXSA6IFsicHYiXSwKICAgIC8vIH07CiAgICBkaWcgNwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDcgLy8gNwogICAgKwogICAgZGlnIDgKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDcKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICArCiAgICBzd2FwCiAgICBkaWcgMTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czozNAogICAgLy8gbG9nKGVuY29kZUFyYzQoYXNzZXRJbmZvKSk7CiAgICBsb2cKICAgIGIgZ2V0QXNzZXRzVGlueV9hZnRlcl9pZl9lbHNlQDEzCgpnZXRBc3NldHNUaW55X3Rlcm5hcnlfZmFsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czozMgogICAgLy8gbGFiZWxzOiBwdiA9PT0gMCA/IFtdIGFzIHN0cmluZ1tdIDogWyJwdiJdLAogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDIwMDAyNzA3NgogICAgYiBnZXRBc3NldHNUaW55X3Rlcm5hcnlfbWVyZ2VAMTIKCmdldEFzc2V0c1RpbnlfdGVybmFyeV9mYWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MjcKICAgIC8vIGNvbnN0IHB2OiB1aW50NjQgPSBhYmVsQXBwSWQgIT09IDAgPyBjb21waWxlQXJjNChBYmVsU3R1YikuY2FsbC5oYXNfYXNzZXRfbGFiZWwoeyBhcHBJZDogYWJlbEFwcElkLCBhcmdzOiBbYXNzZXQuaWQsICJwdiJdIH0pLnJldHVyblZhbHVlIDogMAogICAgaW50Y18xIC8vIDAKICAgIGIgZ2V0QXNzZXRzVGlueV90ZXJuYXJ5X21lcmdlQDkKCmdldEFzc2V0c1RpbnlfYWZ0ZXJfd2hpbGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czoxOQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlLCBvbkNyZWF0ZTogImFsbG93IiB9KQogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDA3MDAwOTAwMDAwYjAwMDAwMDAwMDAwMAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6OkFiZWxSZWFkZXIuZ2V0QXNzZXRMYWJlbHNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRBc3NldExhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjQwCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUsIG9uQ3JlYXRlOiAiYWxsb3ciICwgbmFtZTogImdldF9hc3NldF9sYWJlbHMiLCByZXNvdXJjZUVuY29kaW5nOiAiaW5kZXgiIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTAwMDAKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAEAQAIADEbQQAaMRkURIICBNWrM2YEwu10PzYaAI4CACIBSQAiMRmQgTAaMRgQRIABMbAlIhJBAAoxADIJEkEAAiJDI0MjRwOAADYaAUcCI1lJTgIkC4ECCEwVEkQ2GgJJFSQSRBcjSUsDDEEA6EsDVwIASwEkC0okWEULW0lFBnELRQFAABiADQAHAAkAAAsAAAAAAACwSSIIRQFC/8hLAUEArrGABJf0CoqyGksIshqABAACcHayGiOyGUsBshiBBrIQI7IBs7Q+SVcEAExXAASABBUffHUSREkVJBJEF0sFSXEETEUKRElxA0xFCURxAUQWSZMkDkRXBwFFCUAARIACAABLB0kVFlcGAkxQSRWBBwhLCEkVFlcGAkxQSwEWVwYCgAIAB0xQSwEVTwMITEsMUEwWVwYCUE8CUExQTFCwQv9SgAgAAQACAAJwdkL/syNC/4qAERUffHUABwAJAAALAAAAAAAAsCJDNhoBFSISRIAGFR98dQAAsCJD", "clear": "C4EBQw==" }, "events": [], "templateVariables": { "UPDATABLE": { "type": "AVMUint64" } } };
4
+ export const APP_SPEC = { "name": "AbelReader", "structs": { "AssetTinyLabels": [{ "name": "name", "type": "string" }, { "name": "unitName", "type": "string" }, { "name": "decimals", "type": "uint8" }, { "name": "labels", "type": "string[]" }], "BalanceInfo": [{ "name": "balance", "type": "uint64" }, { "name": "minBalance", "type": "uint64" }], "BlockTimeAndTc": [{ "name": "ts", "type": "uint32" }, { "name": "tc", "type": "uint64" }] }, "methods": [{ "name": "getBalanceInfo", "args": [{ "type": "address[]", "name": "accounts" }], "returns": { "type": "(uint64,uint64)", "struct": "BalanceInfo" }, "actions": { "create": ["NoOp"], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getAssetsTiny", "args": [{ "type": "uint64[]", "name": "assetIds" }, { "type": "uint64", "name": "abelAppId" }], "returns": { "type": "(string,string,uint8,string[])", "struct": "AssetTinyLabels" }, "actions": { "create": ["NoOp"], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "get_asset_labels", "args": [{ "type": "asset", "name": "assetId" }], "returns": { "type": "string[]" }, "actions": { "create": ["NoOp"], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getBlockTimesAndTc", "args": [{ "type": "uint64", "name": "firstRound" }, { "type": "uint64", "name": "lastRound" }], "returns": { "type": "(uint32,uint64)", "struct": "BlockTimeAndTc" }, "actions": { "create": ["NoOp"], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": ["DeleteApplication", "UpdateApplication"] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [339], "errorMessage": "Bytes has valid prefix" }, { "pc": [8], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [55], "errorMessage": "OnCompletion must be one of UpdateApplication, DeleteApplication && can only call when not creating" }, { "pc": [354, 361, 364], "errorMessage": "asset exists" }, { "pc": [115, 243], "errorMessage": "index access is out of bounds" }, { "pc": [84, 202], "errorMessage": "invalid array length header" }, { "pc": [96], "errorMessage": "invalid number of bytes for arc4.dynamic_array<account>" }, { "pc": [214], "errorMessage": "invalid number of bytes for arc4.dynamic_array<asset>" }, { "pc": [222, 344, 511, 520], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [492], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [370, 539], "errorMessage": "overflow" }], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwIDggMzIgVE1QTF9VUERBVEFCTEUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjM1CiAgICAvLyBleHBvcnQgY2xhc3MgQWJlbFJlYWRlciBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FkbWluT25seUAxMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHB1c2hieXRlc3MgMHg0ODc3YTk2NyAweGQ1YWIzMzY2IDB4YzJlZDc0M2YgMHhhNzBlNjJhMCAvLyBtZXRob2QgImdldEJhbGFuY2VJbmZvKGFkZHJlc3NbXSkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldEFzc2V0c1RpbnkodWludDY0W10sdWludDY0KShzdHJpbmcsc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0QmxvY2tUaW1lc0FuZFRjKHVpbnQ2NCx1aW50NjQpKHVpbnQzMix1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZ2V0QmFsYW5jZUluZm8gZ2V0QXNzZXRzVGlueSBnZXRBc3NldExhYmVscyBnZXRCbG9ja1RpbWVzQW5kVGMKICAgIGVycgoKbWFpbl9hZG1pbk9ubHlAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czozNgogICAgLy8gQGJhcmVtZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsiVXBkYXRlQXBwbGljYXRpb24iLCAiRGVsZXRlQXBwbGljYXRpb24iXSB9KQogICAgaW50Y18wIC8vIDEKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHNobAogICAgcHVzaGludCA0OCAvLyA0OAogICAgJgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgb25lIG9mIFVwZGF0ZUFwcGxpY2F0aW9uLCBEZWxldGVBcHBsaWNhdGlvbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czozOAogICAgLy8gYXNzZXJ0KFRlbXBsYXRlVmFyPHVpbnQ2ND4oIlVQREFUQUJMRSIpID09PSAxICYmIFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcyk7CiAgICBpbnRjIDQgLy8gVE1QTF9VUERBVEFCTEUKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogbWFpbl9ib29sX2ZhbHNlQDE1CiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBieiBtYWluX2Jvb2xfZmFsc2VAMTUKICAgIGludGNfMCAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czozNgogICAgLy8gQGJhcmVtZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsiVXBkYXRlQXBwbGljYXRpb24iLCAiRGVsZXRlQXBwbGljYXRpb24iXSB9KQogICAgcmV0dXJuCgptYWluX2Jvb2xfZmFsc2VAMTU6CiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MzYKICAgIC8vIEBiYXJlbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbIlVwZGF0ZUFwcGxpY2F0aW9uIiwgIkRlbGV0ZUFwcGxpY2F0aW9uIl0gfSkKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjpBYmVsUmVhZGVyLmdldEJhbGFuY2VJbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0QmFsYW5jZUluZm86CiAgICBpbnRjXzEgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo0MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlLCBvbkNyZWF0ZTogImFsbG93IiB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhY2NvdW50PgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDMKICAgIC8vIGZvciAobGV0IGlkeDogdWludDY0ID0gMDsgaWR4IDwgYWNjb3VudHMubGVuZ3RoOyBpZHgrKykgewogICAgaW50Y18xIC8vIDAKCmdldEJhbGFuY2VJbmZvX3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDMKICAgIC8vIGZvciAobGV0IGlkeDogdWludDY0ID0gMDsgaWR4IDwgYWNjb3VudHMubGVuZ3RoOyBpZHgrKykgewogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogZ2V0QmFsYW5jZUluZm9fYWZ0ZXJfd2hpbGVANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIGNvbnN0IGFjY291bnQgPSBhY2NvdW50c1tpZHhdOwogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjQ1CiAgICAvLyBjb25zdCBiYWxhbmNlID0gb3AuYmFsYW5jZShhY2NvdW50KTsKICAgIGJhbGFuY2UKICAgIGR1cAogICAgYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo0NgogICAgLy8gaWYgKGJhbGFuY2UgPiAwKSB7CiAgICBieiBnZXRCYWxhbmNlSW5mb19lbHNlX2JvZHlANQogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDcKICAgIC8vIGNvbnN0IG1pbkJhbGFuY2UgPSBvcC5taW5CYWxhbmNlKGFjY291bnQpOwogICAgZGlnIDQKICAgIG1pbl9iYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo0OAogICAgLy8gY29uc3QgYmFsYW5jZUluZm86IEJhbGFuY2VJbmZvID0geyBiYWxhbmNlLCBtaW5CYWxhbmNlIH07CiAgICBkaWcgNAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo0OQogICAgLy8gbG9nKGVuY29kZUFyYzQoYmFsYW5jZUluZm8pKTsKICAgIGxvZwoKZ2V0QmFsYW5jZUluZm9fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDMKICAgIC8vIGZvciAobGV0IGlkeDogdWludDY0ID0gMDsgaWR4IDwgYWNjb3VudHMubGVuZ3RoOyBpZHgrKykgewogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGdldEJhbGFuY2VJbmZvX3doaWxlX3RvcEAyCgpnZXRCYWxhbmNlSW5mb19lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjU4CiAgICAvLyByZXR1cm4geyBiYWxhbmNlOiAwLCBtaW5CYWxhbmNlOiAwIH07CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIGxvZyhlbmNvZGVBcmM0KHRoaXMuZ2V0RW1wdHlCYWxhbmNlSW5mbygpKSk7CiAgICBsb2cKICAgIGIgZ2V0QmFsYW5jZUluZm9fYWZ0ZXJfaWZfZWxzZUA2CgpnZXRCYWxhbmNlSW5mb19hZnRlcl93aGlsZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSwgb25DcmVhdGU6ICJhbGxvdyIgfSkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjpBYmVsUmVhZGVyLmdldEFzc2V0c1Rpbnlbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRBc3NldHNUaW55OgogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gMwogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo2MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlLCBvbkNyZWF0ZTogImFsbG93IiB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFzc2V0PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIGZvciAobGV0IGlkeDogdWludDY0ID0gMDsgaWR4IDwgYXNzZXRJZHMubGVuZ3RoOyBpZHgrKykgewogICAgaW50Y18xIC8vIDAKCmdldEFzc2V0c1Rpbnlfd2hpbGVfdG9wQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo2MwogICAgLy8gZm9yIChsZXQgaWR4OiB1aW50NjQgPSAwOyBpZHggPCBhc3NldElkcy5sZW5ndGg7IGlkeCsrKSB7CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiBnZXRBc3NldHNUaW55X2FmdGVyX3doaWxlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo2NAogICAgLy8gY29uc3QgYXNzZXQgPSBhc3NldElkc1tpZHhdOwogICAgZGlnIDMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGR1cDIKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ1cnkgMTEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIGNvbnN0IFtfLCBleGlzdHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRDcmVhdG9yKGFzc2V0LmlkKTsKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjY2CiAgICAvLyBpZiAoIWV4aXN0cykgewogICAgYm56IGdldEFzc2V0c1RpbnlfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjkwLTk1CiAgICAvLyByZXR1cm4gewogICAgLy8gICBuYW1lOiAiIiwKICAgIC8vICAgdW5pdF9uYW1lOiAiIiwKICAgIC8vICAgZGVjaW1hbHM6IG5ldyBVaW50OCgwKSwKICAgIC8vICAgbGFiZWxzOiBbXSwKICAgIC8vIH07CiAgICBwdXNoYnl0ZXMgMHgwMDA3MDAwOTAwMDAwYjAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NjcKICAgIC8vIGxvZyhlbmNvZGVBcmM0KHRoaXMuZ2V0RW1wdHlBc3NldFRpbnlMYWJlbHMoKSkpOwogICAgbG9nCgpnZXRBc3NldHNUaW55X2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo2MwogICAgLy8gZm9yIChsZXQgaWR4OiB1aW50NjQgPSAwOyBpZHggPCBhc3NldElkcy5sZW5ndGg7IGlkeCsrKSB7CiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgZ2V0QXNzZXRzVGlueV93aGlsZV90b3BAMgoKZ2V0QXNzZXRzVGlueV9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjcwCiAgICAvLyBhYmVsQXBwSWQgIT09IDAgPyBjb21waWxlQXJjNChBYmVsU3R1YikuY2FsbC5oYXNfYXNzZXRfbGFiZWwoeyBhcHBJZDogYWJlbEFwcElkLCBhcmdzOiBbYXNzZXQuaWQsICJwdiJdIH0pLnJldHVyblZhbHVlIDogMDsKICAgIGRpZyAxCiAgICBieiBnZXRBc3NldHNUaW55X3Rlcm5hcnlfZmFsc2VAOAogICAgaXR4bl9iZWdpbgogICAgcHVzaGJ5dGVzIDB4OTdmNDBhOGEgLy8gbWV0aG9kICJoYXNfYXNzZXRfbGFiZWwodWludDY0LHN0cmluZyl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDgKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDAyNzA3NgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKCmdldEFzc2V0c1RpbnlfdGVybmFyeV9tZXJnZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NzIKICAgIC8vIG5hbWU6IGFzc2V0Lm5hbWUudG9TdHJpbmcoKSwKICAgIGRpZyA1CiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBzd2FwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo3MwogICAgLy8gdW5pdF9uYW1lOiBhc3NldC51bml0TmFtZS50b1N0cmluZygpLAogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NzQKICAgIC8vIGRlY2ltYWxzOiBuZXcgVWludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBsYWJlbHM6IHB2ID09PSAwID8gKFtdIGFzIHN0cmluZ1tdKSA6IFsicHYiXSwKICAgIGJueiBnZXRBc3NldHNUaW55X3Rlcm5hcnlfZmFsc2VAMTEKICAgIHB1c2hieXRlcyAweDAwMDAKCmdldEFzc2V0c1RpbnlfdGVybmFyeV9tZXJnZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjcxLTc2CiAgICAvLyBjb25zdCBhc3NldEluZm86IEFzc2V0VGlueUxhYmVscyA9IHsKICAgIC8vICAgbmFtZTogYXNzZXQubmFtZS50b1N0cmluZygpLAogICAgLy8gICB1bml0X25hbWU6IGFzc2V0LnVuaXROYW1lLnRvU3RyaW5nKCksCiAgICAvLyAgIGRlY2ltYWxzOiBuZXcgVWludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICBsYWJlbHM6IHB2ID09PSAwID8gKFtdIGFzIHN0cmluZ1tdKSA6IFsicHYiXSwKICAgIC8vIH07CiAgICBkaWcgNwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDcgLy8gNwogICAgKwogICAgZGlnIDgKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDcKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICArCiAgICBzd2FwCiAgICBkaWcgMTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo3NwogICAgLy8gbG9nKGVuY29kZUFyYzQoYXNzZXRJbmZvKSk7CiAgICBsb2cKICAgIGIgZ2V0QXNzZXRzVGlueV9hZnRlcl9pZl9lbHNlQDEzCgpnZXRBc3NldHNUaW55X3Rlcm5hcnlfZmFsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gbGFiZWxzOiBwdiA9PT0gMCA/IChbXSBhcyBzdHJpbmdbXSkgOiBbInB2Il0sCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMjAwMDI3MDc2CiAgICBiIGdldEFzc2V0c1RpbnlfdGVybmFyeV9tZXJnZUAxMgoKZ2V0QXNzZXRzVGlueV90ZXJuYXJ5X2ZhbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo3MAogICAgLy8gYWJlbEFwcElkICE9PSAwID8gY29tcGlsZUFyYzQoQWJlbFN0dWIpLmNhbGwuaGFzX2Fzc2V0X2xhYmVsKHsgYXBwSWQ6IGFiZWxBcHBJZCwgYXJnczogW2Fzc2V0LmlkLCAicHYiXSB9KS5yZXR1cm5WYWx1ZSA6IDA7CiAgICBpbnRjXzEgLy8gMAogICAgYiBnZXRBc3NldHNUaW55X3Rlcm5hcnlfbWVyZ2VAOQoKZ2V0QXNzZXRzVGlueV9hZnRlcl93aGlsZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjYxCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUsIG9uQ3JlYXRlOiAiYWxsb3ciIH0pCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTAwMDcwMDA5MDAwMDBiMDAwMDAwMDAwMDAwCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo6QWJlbFJlYWRlci5nZXRBc3NldExhYmVsc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldEFzc2V0TGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6ODMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSwgb25DcmVhdGU6ICJhbGxvdyIsIG5hbWU6ICJnZXRfYXNzZXRfbGFiZWxzIiwgcmVzb3VyY2VFbmNvZGluZzogImluZGV4IiB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDAwCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo6QWJlbFJlYWRlci5nZXRCbG9ja1RpbWVzQW5kVGNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRCbG9ja1RpbWVzQW5kVGM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo5OAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlLCBvbkNyZWF0ZTogImFsbG93IiB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgc3dhcAoKZ2V0QmxvY2tUaW1lc0FuZFRjX3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MTAwCiAgICAvLyBmb3IgKGxldCByb3VuZDogdWludDY0ID0gZmlyc3RSb3VuZDsgcm91bmQgPD0gbGFzdFJvdW5kOyByb3VuZCsrKSB7CiAgICBkdXAKICAgIGRpZyAyCiAgICA8PQogICAgYnogZ2V0QmxvY2tUaW1lc0FuZFRjX2FmdGVyX3doaWxlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gdHM6IG5ldyBVaW50MzIob3AuQmxvY2suYmxrVGltZXN0YW1wKHJvdW5kKSksCiAgICBkdXBuIDIKICAgIGJsb2NrIEJsa1RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMyAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA0IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjEwMwogICAgLy8gdGM6IG9wLkJsb2NrLmJsa1R4bkNvdW50ZXIocm91bmQpLAogICAgZGlnIDEKICAgIGJsb2NrIEJsa1R4bkNvdW50ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjEwMS0xMDQKICAgIC8vIGNvbnN0IGJsa0RhdGE6IEJsb2NrVGltZUFuZFRjID0gewogICAgLy8gICB0czogbmV3IFVpbnQzMihvcC5CbG9jay5ibGtUaW1lc3RhbXAocm91bmQpKSwKICAgIC8vICAgdGM6IG9wLkJsb2NrLmJsa1R4bkNvdW50ZXIocm91bmQpLAogICAgLy8gfTsKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MTA1CiAgICAvLyBsb2coZW5jb2RlQXJjNChibGtEYXRhKSk7CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjEwMAogICAgLy8gZm9yIChsZXQgcm91bmQ6IHVpbnQ2NCA9IGZpcnN0Um91bmQ7IHJvdW5kIDw9IGxhc3RSb3VuZDsgcm91bmQrKykgewogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBnZXRCbG9ja1RpbWVzQW5kVGNfd2hpbGVfdG9wQDIKCmdldEJsb2NrVGltZXNBbmRUY19hZnRlcl93aGlsZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6OTgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSwgb25DcmVhdGU6ICJhbGxvdyIgfSkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAFAQAIIAAxG0EAKDEZFESCBARId6lnBNWrM2YEwu10PwSnDmKgNhoAjgQAHwCTAboBzAAiMRmQgTAaMRgQRCEEIhJBAAoxADIJEkEAAiJDI0MjgAA2GgFHAiNZSU4CJQuBAghMFRJEI0lLAgxBAD1LAlcCAEsBJQslWElFBmBJRQVBABJLBHhLBBZMFlCwSSIIRQFC/9KAEAAAAAAAAAAAAAAAAAAAAACwQv/igBQVH3x1AAAAAAAAAAAAAAAAAAAAALAiQyNHA4AANhoBRwIjWUlOAiQLgQIITBUSRDYaAkkVJBJEFyNJSwMMQQDoSwNXAgBLASQLSiRYRQtbSUUGcQtFAUAAGIANAAcACQAACwAAAAAAALBJIghFAUL/yEsBQQCusYAEl/QKirIaSwiyGoAEAAJwdrIaI7IZSwGyGIEGshAjsgGztD5JVwQATFcABIAEFR98dRJESRUkEkQXSwVJcQRMRQpESXEDTEUJRHEBRBZJkyQORFcHAUUJQABEgAIAAEsHSRUWVwYCTFBJFYEHCEsISRUWVwYCTFBLARZXBgKAAgAHTFBLARVPAwhMSwxQTBZXBgJQTwJQTFBMULBC/1KACAABAAIAAnB2Qv+zI0L/ioARFR98dQAHAAkAAAsAAAAAAACwIkM2GgEVIhJEgAYVH3x1AACwIkM2GgFJFSQSRBc2GgJJFSQSRBdMSUsCDkEAG0cC0QEWSZMlDkRXBARLAdEIFlCwIghFAUL/3oAQFR98dQAAAAAAAAAAAAAAALAiQw==", "clear": "C4EBQw==" }, "events": [], "templateVariables": { "UPDATABLE": { "type": "AVMUint64" } } };
5
5
  class BinaryStateValue {
6
6
  value;
7
7
  constructor(value) {
@@ -20,6 +20,18 @@ class BinaryStateValue {
20
20
  export function AssetTinyLabelsFromTuple(abiTuple) {
21
21
  return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.AssetTinyLabels, APP_SPEC.structs);
22
22
  }
23
+ /**
24
+ * Converts the ABI tuple representation of a BalanceInfo to the struct representation
25
+ */
26
+ export function BalanceInfoFromTuple(abiTuple) {
27
+ return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.BalanceInfo, APP_SPEC.structs);
28
+ }
29
+ /**
30
+ * Converts the ABI tuple representation of a BlockTimeAndTc to the struct representation
31
+ */
32
+ export function BlockTimeAndTcFromTuple(abiTuple) {
33
+ return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.BlockTimeAndTc, APP_SPEC.structs);
34
+ }
23
35
  /**
24
36
  * Exposes methods for constructing `AppClient` params objects for ABI calls to the AbelReader smart contract
25
37
  */
@@ -31,15 +43,34 @@ export class AbelReaderParamsFactory {
31
43
  return {
32
44
  _resolveByMethod(params) {
33
45
  switch (params.method) {
46
+ case 'getBalanceInfo':
47
+ case 'getBalanceInfo(address[])(uint64,uint64)':
48
+ return AbelReaderParamsFactory.create.getBalanceInfo(params);
34
49
  case 'getAssetsTiny':
35
50
  case 'getAssetsTiny(uint64[],uint64)(string,string,uint8,string[])':
36
51
  return AbelReaderParamsFactory.create.getAssetsTiny(params);
37
52
  case 'get_asset_labels':
38
53
  case 'get_asset_labels(asset)string[]':
39
54
  return AbelReaderParamsFactory.create.getAssetLabels(params);
55
+ case 'getBlockTimesAndTc':
56
+ case 'getBlockTimesAndTc(uint64,uint64)(uint32,uint64)':
57
+ return AbelReaderParamsFactory.create.getBlockTimesAndTc(params);
40
58
  }
41
59
  throw new Error(`Unknown ' + verb + ' method`);
42
60
  },
61
+ /**
62
+ * Constructs create ABI call params for the AbelReader smart contract using the getBalanceInfo(address[])(uint64,uint64) ABI method
63
+ *
64
+ * @param params Parameters for the call
65
+ * @returns An `AppClientMethodCallParams` object for the call
66
+ */
67
+ getBalanceInfo(params) {
68
+ return {
69
+ ...params,
70
+ method: 'getBalanceInfo(address[])(uint64,uint64)',
71
+ args: Array.isArray(params.args) ? params.args : [params.args.accounts],
72
+ };
73
+ },
43
74
  /**
44
75
  * Constructs create ABI call params for the AbelReader smart contract using the getAssetsTiny(uint64[],uint64)(string,string,uint8,string[]) ABI method
45
76
  *
@@ -66,6 +97,32 @@ export class AbelReaderParamsFactory {
66
97
  args: Array.isArray(params.args) ? params.args : [params.args.assetId],
67
98
  };
68
99
  },
100
+ /**
101
+ * Constructs create ABI call params for the AbelReader smart contract using the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method
102
+ *
103
+ * @param params Parameters for the call
104
+ * @returns An `AppClientMethodCallParams` object for the call
105
+ */
106
+ getBlockTimesAndTc(params) {
107
+ return {
108
+ ...params,
109
+ method: 'getBlockTimesAndTc(uint64,uint64)(uint32,uint64)',
110
+ args: Array.isArray(params.args) ? params.args : [params.args.firstRound, params.args.lastRound],
111
+ };
112
+ },
113
+ };
114
+ }
115
+ /**
116
+ * Constructs a no op call for the getBalanceInfo(address[])(uint64,uint64) ABI method
117
+ *
118
+ * @param params Parameters for the call
119
+ * @returns An `AppClientMethodCallParams` object for the call
120
+ */
121
+ static getBalanceInfo(params) {
122
+ return {
123
+ ...params,
124
+ method: 'getBalanceInfo(address[])(uint64,uint64)',
125
+ args: Array.isArray(params.args) ? params.args : [params.args.accounts],
69
126
  };
70
127
  }
71
128
  /**
@@ -94,6 +151,19 @@ export class AbelReaderParamsFactory {
94
151
  args: Array.isArray(params.args) ? params.args : [params.args.assetId],
95
152
  };
96
153
  }
154
+ /**
155
+ * Constructs a no op call for the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method
156
+ *
157
+ * @param params Parameters for the call
158
+ * @returns An `AppClientMethodCallParams` object for the call
159
+ */
160
+ static getBlockTimesAndTc(params) {
161
+ return {
162
+ ...params,
163
+ method: 'getBlockTimesAndTc(uint64,uint64)(uint32,uint64)',
164
+ args: Array.isArray(params.args) ? params.args : [params.args.firstRound, params.args.lastRound],
165
+ };
166
+ }
97
167
  }
98
168
  /**
99
169
  * A factory to create and deploy one or more instance of the AbelReader smart contract and to create one or more app clients to interact with those (or other) app instances
@@ -170,6 +240,15 @@ class AbelReaderFactory {
170
240
  * Gets available create methods
171
241
  */
172
242
  create: {
243
+ /**
244
+ * Creates a new instance of the AbelReader smart contract using the getBalanceInfo(address[])(uint64,uint64) ABI method.
245
+ *
246
+ * @param params The params for the smart contract call
247
+ * @returns The create params
248
+ */
249
+ getBalanceInfo: (params) => {
250
+ return this.appFactory.params.create(AbelReaderParamsFactory.create.getBalanceInfo(params));
251
+ },
173
252
  /**
174
253
  * Creates a new instance of the AbelReader smart contract using the getAssetsTiny(uint64[],uint64)(string,string,uint8,string[]) ABI method.
175
254
  *
@@ -188,6 +267,15 @@ class AbelReaderFactory {
188
267
  getAssetLabels: (params) => {
189
268
  return this.appFactory.params.create(AbelReaderParamsFactory.create.getAssetLabels(params));
190
269
  },
270
+ /**
271
+ * Creates a new instance of the AbelReader smart contract using the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method.
272
+ *
273
+ * @param params The params for the smart contract call
274
+ * @returns The create params
275
+ */
276
+ getBlockTimesAndTc: (params) => {
277
+ return this.appFactory.params.create(AbelReaderParamsFactory.create.getBlockTimesAndTc(params));
278
+ },
191
279
  },
192
280
  /**
193
281
  * Gets available deployUpdate methods
@@ -226,6 +314,15 @@ class AbelReaderFactory {
226
314
  * Gets available create methods
227
315
  */
228
316
  create: {
317
+ /**
318
+ * Creates a new instance of the AbelReader smart contract using the getBalanceInfo(address[])(uint64,uint64) ABI method.
319
+ *
320
+ * @param params The params for the smart contract call
321
+ * @returns The create transaction
322
+ */
323
+ getBalanceInfo: (params) => {
324
+ return this.appFactory.createTransaction.create(AbelReaderParamsFactory.create.getBalanceInfo(params));
325
+ },
229
326
  /**
230
327
  * Creates a new instance of the AbelReader smart contract using the getAssetsTiny(uint64[],uint64)(string,string,uint8,string[]) ABI method.
231
328
  *
@@ -244,6 +341,15 @@ class AbelReaderFactory {
244
341
  getAssetLabels: (params) => {
245
342
  return this.appFactory.createTransaction.create(AbelReaderParamsFactory.create.getAssetLabels(params));
246
343
  },
344
+ /**
345
+ * Creates a new instance of the AbelReader smart contract using the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method.
346
+ *
347
+ * @param params The params for the smart contract call
348
+ * @returns The create transaction
349
+ */
350
+ getBlockTimesAndTc: (params) => {
351
+ return this.appFactory.createTransaction.create(AbelReaderParamsFactory.create.getBlockTimesAndTc(params));
352
+ },
247
353
  },
248
354
  };
249
355
  /**
@@ -254,6 +360,16 @@ class AbelReaderFactory {
254
360
  * Gets available create methods
255
361
  */
256
362
  create: {
363
+ /**
364
+ * Creates a new instance of the AbelReader smart contract using an ABI method call using the getBalanceInfo(address[])(uint64,uint64) ABI method.
365
+ *
366
+ * @param params The params for the smart contract call
367
+ * @returns The create result
368
+ */
369
+ getBalanceInfo: async (params) => {
370
+ const result = await this.appFactory.send.create(AbelReaderParamsFactory.create.getBalanceInfo(params));
371
+ return { result: { ...result.result, return: result.result.return }, appClient: new AbelReaderClient(result.appClient) };
372
+ },
257
373
  /**
258
374
  * Creates a new instance of the AbelReader smart contract using an ABI method call using the getAssetsTiny(uint64[],uint64)(string,string,uint8,string[]) ABI method.
259
375
  *
@@ -274,6 +390,16 @@ class AbelReaderFactory {
274
390
  const result = await this.appFactory.send.create(AbelReaderParamsFactory.create.getAssetLabels(params));
275
391
  return { result: { ...result.result, return: result.result.return }, appClient: new AbelReaderClient(result.appClient) };
276
392
  },
393
+ /**
394
+ * Creates a new instance of the AbelReader smart contract using an ABI method call using the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method.
395
+ *
396
+ * @param params The params for the smart contract call
397
+ * @returns The create result
398
+ */
399
+ getBlockTimesAndTc: async (params) => {
400
+ const result = await this.appFactory.send.create(AbelReaderParamsFactory.create.getBlockTimesAndTc(params));
401
+ return { result: { ...result.result, return: result.result.return }, appClient: new AbelReaderClient(result.appClient) };
402
+ },
277
403
  },
278
404
  };
279
405
  }
@@ -377,6 +503,17 @@ class AbelReaderClient {
377
503
  clearState: (params) => {
378
504
  return this.appClient.params.bare.clearState(params);
379
505
  },
506
+ /**
507
+ * Makes a call to the AbelReader smart contract using the `getBalanceInfo(address[])(uint64,uint64)` ABI method.
508
+ *
509
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
510
+ *
511
+ * @param params The params for the smart contract call
512
+ * @returns The call params
513
+ */
514
+ getBalanceInfo: (params) => {
515
+ return this.appClient.params.call(AbelReaderParamsFactory.getBalanceInfo(params));
516
+ },
380
517
  /**
381
518
  * Makes a call to the AbelReader smart contract using the `getAssetsTiny(uint64[],uint64)(string,string,uint8,string[])` ABI method.
382
519
  *
@@ -399,6 +536,17 @@ class AbelReaderClient {
399
536
  getAssetLabels: (params) => {
400
537
  return this.appClient.params.call(AbelReaderParamsFactory.getAssetLabels(params));
401
538
  },
539
+ /**
540
+ * Makes a call to the AbelReader smart contract using the `getBlockTimesAndTc(uint64,uint64)(uint32,uint64)` ABI method.
541
+ *
542
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
543
+ *
544
+ * @param params The params for the smart contract call
545
+ * @returns The call params
546
+ */
547
+ getBlockTimesAndTc: (params) => {
548
+ return this.appClient.params.call(AbelReaderParamsFactory.getBlockTimesAndTc(params));
549
+ },
402
550
  };
403
551
  /**
404
552
  * Create transactions for the current app
@@ -441,6 +589,17 @@ class AbelReaderClient {
441
589
  clearState: (params) => {
442
590
  return this.appClient.createTransaction.bare.clearState(params);
443
591
  },
592
+ /**
593
+ * Makes a call to the AbelReader smart contract using the `getBalanceInfo(address[])(uint64,uint64)` ABI method.
594
+ *
595
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
596
+ *
597
+ * @param params The params for the smart contract call
598
+ * @returns The call transaction
599
+ */
600
+ getBalanceInfo: (params) => {
601
+ return this.appClient.createTransaction.call(AbelReaderParamsFactory.getBalanceInfo(params));
602
+ },
444
603
  /**
445
604
  * Makes a call to the AbelReader smart contract using the `getAssetsTiny(uint64[],uint64)(string,string,uint8,string[])` ABI method.
446
605
  *
@@ -463,6 +622,17 @@ class AbelReaderClient {
463
622
  getAssetLabels: (params) => {
464
623
  return this.appClient.createTransaction.call(AbelReaderParamsFactory.getAssetLabels(params));
465
624
  },
625
+ /**
626
+ * Makes a call to the AbelReader smart contract using the `getBlockTimesAndTc(uint64,uint64)(uint32,uint64)` ABI method.
627
+ *
628
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
629
+ *
630
+ * @param params The params for the smart contract call
631
+ * @returns The call transaction
632
+ */
633
+ getBlockTimesAndTc: (params) => {
634
+ return this.appClient.createTransaction.call(AbelReaderParamsFactory.getBlockTimesAndTc(params));
635
+ },
466
636
  };
467
637
  /**
468
638
  * Send calls to the current app
@@ -505,6 +675,18 @@ class AbelReaderClient {
505
675
  clearState: (params) => {
506
676
  return this.appClient.send.bare.clearState(params);
507
677
  },
678
+ /**
679
+ * Makes a call to the AbelReader smart contract using the `getBalanceInfo(address[])(uint64,uint64)` ABI method.
680
+ *
681
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
682
+ *
683
+ * @param params The params for the smart contract call
684
+ * @returns The call result
685
+ */
686
+ getBalanceInfo: async (params) => {
687
+ const result = await this.appClient.send.call(AbelReaderParamsFactory.getBalanceInfo(params));
688
+ return { ...result, return: result.return };
689
+ },
508
690
  /**
509
691
  * Makes a call to the AbelReader smart contract using the `getAssetsTiny(uint64[],uint64)(string,string,uint8,string[])` ABI method.
510
692
  *
@@ -529,6 +711,18 @@ class AbelReaderClient {
529
711
  const result = await this.appClient.send.call(AbelReaderParamsFactory.getAssetLabels(params));
530
712
  return { ...result, return: result.return };
531
713
  },
714
+ /**
715
+ * Makes a call to the AbelReader smart contract using the `getBlockTimesAndTc(uint64,uint64)(uint32,uint64)` ABI method.
716
+ *
717
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
718
+ *
719
+ * @param params The params for the smart contract call
720
+ * @returns The call result
721
+ */
722
+ getBlockTimesAndTc: async (params) => {
723
+ const result = await this.appClient.send.call(AbelReaderParamsFactory.getBlockTimesAndTc(params));
724
+ return { ...result, return: result.return };
725
+ },
532
726
  };
533
727
  /**
534
728
  * Clone this app client with different params
@@ -539,6 +733,18 @@ class AbelReaderClient {
539
733
  clone(params) {
540
734
  return new AbelReaderClient(this.appClient.clone(params));
541
735
  }
736
+ /**
737
+ * Makes a readonly (simulated) call to the AbelReader smart contract using the `getBalanceInfo(address[])(uint64,uint64)` ABI method.
738
+ *
739
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
740
+ *
741
+ * @param params The params for the smart contract call
742
+ * @returns The call result
743
+ */
744
+ async getBalanceInfo(params) {
745
+ const result = await this.appClient.send.call(AbelReaderParamsFactory.getBalanceInfo(params));
746
+ return result.return;
747
+ }
542
748
  /**
543
749
  * Makes a readonly (simulated) call to the AbelReader smart contract using the `getAssetsTiny(uint64[],uint64)(string,string,uint8,string[])` ABI method.
544
750
  *
@@ -563,6 +769,18 @@ class AbelReaderClient {
563
769
  const result = await this.appClient.send.call(AbelReaderParamsFactory.getAssetLabels(params));
564
770
  return result.return;
565
771
  }
772
+ /**
773
+ * Makes a readonly (simulated) call to the AbelReader smart contract using the `getBlockTimesAndTc(uint64,uint64)(uint32,uint64)` ABI method.
774
+ *
775
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
776
+ *
777
+ * @param params The params for the smart contract call
778
+ * @returns The call result
779
+ */
780
+ async getBlockTimesAndTc(params) {
781
+ const result = await this.appClient.send.call(AbelReaderParamsFactory.getBlockTimesAndTc(params));
782
+ return result.return;
783
+ }
566
784
  /**
567
785
  * Methods to access state for the current AbelReader app
568
786
  */
@@ -573,6 +791,14 @@ class AbelReaderClient {
573
791
  let promiseChain = Promise.resolve();
574
792
  const resultMappers = [];
575
793
  return {
794
+ /**
795
+ * Add a getBalanceInfo(address[])(uint64,uint64) method call against the AbelReader contract
796
+ */
797
+ getBalanceInfo(params) {
798
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getBalanceInfo(params)));
799
+ resultMappers.push((v) => client.decodeReturnValue('getBalanceInfo(address[])(uint64,uint64)', v));
800
+ return this;
801
+ },
576
802
  /**
577
803
  * Add a getAssetsTiny(uint64[],uint64)(string,string,uint8,string[]) method call against the AbelReader contract
578
804
  */
@@ -589,6 +815,14 @@ class AbelReaderClient {
589
815
  resultMappers.push((v) => client.decodeReturnValue('get_asset_labels(asset)string[]', v));
590
816
  return this;
591
817
  },
818
+ /**
819
+ * Add a getBlockTimesAndTc(uint64,uint64)(uint32,uint64) method call against the AbelReader contract
820
+ */
821
+ getBlockTimesAndTc(params) {
822
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getBlockTimesAndTc(params)));
823
+ resultMappers.push((v) => client.decodeReturnValue('getBlockTimesAndTc(uint64,uint64)(uint32,uint64)', v));
824
+ return this;
825
+ },
592
826
  get update() {
593
827
  return {
594
828
  bare: (params) => {
@@ -737,6 +971,15 @@ export class AbelReaderSDK extends GhostBase {
737
971
  constructor(args) {
738
972
  super(args);
739
973
  }
974
+ async getBalanceInfo({ methodArgsOrArgsArray, extraMethodCallArgs, extraSimulateArgs, }) {
975
+ return this.execute({
976
+ signature: 'getBalanceInfo(address[])(uint64,uint64)',
977
+ txnBuilder: (builder, args) => builder.getBalanceInfo(args),
978
+ methodArgsOrArgsArray,
979
+ extraMethodCallArgs,
980
+ extraSimulateArgs,
981
+ });
982
+ }
740
983
  async getAssetsTiny({ methodArgsOrArgsArray, extraMethodCallArgs, extraSimulateArgs, }) {
741
984
  return this.execute({
742
985
  signature: 'getAssetsTiny(uint64[],uint64)(string,string,uint8,string[])',
@@ -746,7 +989,7 @@ export class AbelReaderSDK extends GhostBase {
746
989
  extraSimulateArgs,
747
990
  });
748
991
  }
749
- async get_asset_labels({ methodArgsOrArgsArray, extraMethodCallArgs, extraSimulateArgs, }) {
992
+ async getAssetLabels({ methodArgsOrArgsArray, extraMethodCallArgs, extraSimulateArgs, }) {
750
993
  return this.execute({
751
994
  signature: 'get_asset_labels(asset)string[]',
752
995
  txnBuilder: (builder, args) => builder.getAssetLabels(args),
@@ -755,5 +998,14 @@ export class AbelReaderSDK extends GhostBase {
755
998
  extraSimulateArgs,
756
999
  });
757
1000
  }
1001
+ async getBlockTimesAndTc({ methodArgsOrArgsArray, extraMethodCallArgs, extraSimulateArgs, }) {
1002
+ return this.execute({
1003
+ signature: 'getBlockTimesAndTc(uint64,uint64)(uint32,uint64)',
1004
+ txnBuilder: (builder, args) => builder.getBlockTimesAndTc(args),
1005
+ methodArgsOrArgsArray,
1006
+ extraMethodCallArgs,
1007
+ extraSimulateArgs,
1008
+ });
1009
+ }
758
1010
  }
759
1011
  /* END GHOST SDK CODE */
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  import { AlgorandClient } from "@algorandfoundation/algokit-utils";
2
- import { AbelReaderSDK, AssetTinyLabels as AssetTinyLabelsInternal } from "./generated/AbelReaderSDK.js";
2
+ import { AbelReaderSDK, AssetTinyLabels as AssetTinyLabelsInternal, BalanceInfo, BlockTimeAndTc } from "./generated/AbelReaderSDK.js";
3
3
  export interface AssetTinyLabels extends AssetTinyLabelsInternal {
4
4
  id: bigint;
5
5
  }
6
+ export interface BlockRoundTimeAndTc extends BlockTimeAndTc {
7
+ rnd: bigint;
8
+ }
6
9
  export declare class AbelGhostSDK {
7
10
  static baseSDK: typeof AbelReaderSDK;
8
11
  algorand: AlgorandClient;
@@ -16,9 +19,12 @@ export declare class AbelGhostSDK {
16
19
  ghostAppId?: bigint;
17
20
  readerAccount?: string;
18
21
  });
22
+ getBalanceInfo(accounts: string[]): Promise<Map<string, BalanceInfo>>;
23
+ private getBalanceInfoInternal;
19
24
  getAssetsTinyLabels(assetIds: number[] | bigint[]): Promise<Map<bigint, AssetTinyLabels>>;
20
25
  private getAssetsTinyLabelsInternal;
21
26
  getAssetLabels(assetId: number | bigint): Promise<string[]>;
22
27
  getAllAssetIDs(): Promise<bigint[]>;
23
28
  private getBoxesByLength;
29
+ getBlockTimesAndTc(firstRound: number | bigint, lastRound: number | bigint): Promise<BlockTimeAndTc[]>;
24
30
  }
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { AbelReaderSDK } from "./generated/AbelReaderSDK.js";
7
+ import { AbelReaderSDK, } from "./generated/AbelReaderSDK.js";
8
8
  import { chunked } from "./utils/chunked.js";
9
9
  import { decodeUint64 } from "algosdk";
10
10
  export class AbelGhostSDK {
@@ -23,6 +23,13 @@ export class AbelGhostSDK {
23
23
  ghostAppId,
24
24
  });
25
25
  }
26
+ async getBalanceInfo(accounts) {
27
+ const data = await this.getBalanceInfoInternal(accounts);
28
+ return new Map(data.map((balance, i) => [accounts[i], balance]));
29
+ }
30
+ async getBalanceInfoInternal(accounts) {
31
+ return this.baseSDK.getBalanceInfo({ methodArgsOrArgsArray: { accounts } });
32
+ }
26
33
  async getAssetsTinyLabels(assetIds) {
27
34
  const data = await this.getAssetsTinyLabelsInternal(assetIds);
28
35
  return new Map(data.map((asset, i) => [BigInt(assetIds[i]), { ...asset, id: BigInt(assetIds[i]) }]));
@@ -52,7 +59,22 @@ export class AbelGhostSDK {
52
59
  const boxNames = await this.algorand.app.getBoxNames(this.registryAppId);
53
60
  return boxNames.filter((boxName) => boxName.nameRaw.length === length);
54
61
  }
62
+ async getBlockTimesAndTc(firstRound, lastRound) {
63
+ const first = BigInt(firstRound);
64
+ const last = BigInt(lastRound) - BigInt(1);
65
+ return (await this.baseSDK.getBlockTimesAndTc({
66
+ methodArgsOrArgsArray: { firstRound: first, lastRound: last },
67
+ extraMethodCallArgs: { firstValidRound: first, lastValidRound: last },
68
+ extraSimulateArgs: { round: last },
69
+ })).map((data, i) => ({
70
+ ...data,
71
+ rnd: BigInt(first) + BigInt(i),
72
+ }));
73
+ }
55
74
  }
75
+ __decorate([
76
+ chunked(63)
77
+ ], AbelGhostSDK.prototype, "getBalanceInfoInternal", null);
56
78
  __decorate([
57
79
  chunked(63)
58
80
  ], AbelGhostSDK.prototype, "getAssetsTinyLabelsInternal", null);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "abel-ghost-sdk",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "type": "git",