{ "name": "SynthraVault", "structs": {}, "methods": [ { "name": "createApplication", "args": [], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "Initialize the contract. Sets the deployer as the owner.\nCalled once when the application is created.", "events": [], "recommendations": {} }, { "name": "optIn", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "OptIn" ] }, "readonly": false, "desc": "Opt-in handler. Initializes the user's local balance to zero.\nThe user must call this before depositing.", "events": [], "recommendations": {} }, { "name": "deposit", "args": [ { "type": "pay", "name": "payTxn", "desc": "- The grouped payment transaction funding the deposit" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Deposit ALGO into the vault. The user sends a grouped payment\ntransaction to the contract address, and this method credits\ntheir local balance.", "events": [], "recommendations": {} }, { "name": "withdraw", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Withdraw remaining balance from the vault. Sends the user's full\nlocal balance back to them via an inner transaction.\nResets their balance to zero.", "events": [], "recommendations": {} }, { "name": "deduct", "args": [ { "type": "address", "name": "user", "desc": "- The account to deduct from" }, { "type": "uint64", "name": "amount", "desc": "- Amount in microALGO to deduct" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Deduct from a user's balance. Only callable by the contract owner.\nUsed by the backend to charge for each API call.", "events": [], "recommendations": {} }, { "name": "getBalance", "args": [ { "type": "address", "name": "user", "desc": "- The account to query" } ], "returns": { "type": "uint64", "desc": "The user's balance in microALGO" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Get a user's current deposited balance.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 1, "bytes": 1 }, "local": { "ints": 1, "bytes": 0 } }, "keys": { "global": { "owner": { "keyType": "AVMString", "valueType": "address", "key": "b3duZXI=", "desc": "Contract operator address. Only this address can call deduct()." }, "totalCalls": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dG90YWxfY2FsbHM=", "desc": "Cumulative count of all deduction calls across all users." } }, "local": { "userBalance": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dXNlcl9iYWxhbmNl", "desc": "User's deposited balance in microALGO." } }, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 237 ], "errorMessage": "Deduction amount must be greater than zero" }, { "pc": [ 165 ], "errorMessage": "Deposit amount must be greater than zero" }, { "pc": [ 248 ], "errorMessage": "Insufficient user balance" }, { "pc": [ 188 ], "errorMessage": "No balance to withdraw" }, { "pc": [ 55 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 118 ], "errorMessage": "OnCompletion must be OptIn && can only call when not creating" }, { "pc": [ 235 ], "errorMessage": "Only the owner can deduct" }, { "pc": [ 154 ], "errorMessage": "Payment must be sent to the vault" }, { "pc": [ 161 ], "errorMessage": "Payment sender must match caller" }, { "pc": [ 233, 257 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 171, 186, 243, 276 ], "errorMessage": "check LocalState exists" }, { "pc": [ 217, 272 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 226 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 147 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwIDMyCiAgICBieXRlY2Jsb2NrICJ1c2VyX2JhbGFuY2UiICJ0b3RhbF9jYWxscyIgIm93bmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6MzgKICAgIC8vIGV4cG9ydCBjbGFzcyBTeW50aHJhVmF1bHQgZXh0ZW5kcyBDb250cmFjdCB7CiAgICBwdXNoYnl0ZXMgMHgyOTMxNGQ5NSAvLyBtZXRob2QgIm9wdEluKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9vcHRJbl9yb3V0ZUAyCgptYWluX3N3aXRjaF9jYXNlX25leHRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjM4CiAgICAvLyBleHBvcnQgY2xhc3MgU3ludGhyYVZhdWx0IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDEwCiAgICBwdXNoYnl0ZXNzIDB4MzYyNWU0ZWIgMHhiNzM1NWZkMSAweDU5MWEyYzdhIDB4YjQxN2E4NjQgLy8gbWV0aG9kICJkZXBvc2l0KHBheSl2b2lkIiwgbWV0aG9kICJ3aXRoZHJhdygpdm9pZCIsIG1ldGhvZCAiZGVkdWN0KGFkZHJlc3MsdWludDY0KXZvaWQiLCBtZXRob2QgImdldEJhbGFuY2UoYWRkcmVzcyl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBkZXBvc2l0IHdpdGhkcmF3IGRlZHVjdCBnZXRCYWxhbmNlCiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czozOAogICAgLy8gZXhwb3J0IGNsYXNzIFN5bnRocmFWYXVsdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHB1c2hieXRlcyAweGI4NDQ3YjM2IC8vIG1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGVBcHBsaWNhdGlvbgogICAgZXJyCgptYWluX29wdEluX3JvdXRlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czo2NwogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydPcHRJbiddIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gT3B0SW4KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBPcHRJbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBiIG9wdEluCgoKLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6OlN5bnRocmFWYXVsdC5jcmVhdGVBcHBsaWNhdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZUFwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6NDIKICAgIC8vIG93bmVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdvd25lcicgfSkKICAgIGJ5dGVjXzIgLy8gIm93bmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6NTkKICAgIC8vIHRoaXMub3duZXIudmFsdWUgPSBUeG4uc2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6NDUKICAgIC8vIHRvdGFsQ2FsbHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndG90YWxfY2FsbHMnIH0pCiAgICBieXRlY18xIC8vICJ0b3RhbF9jYWxscyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjYwCiAgICAvLyB0aGlzLnRvdGFsQ2FsbHMudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6NTgKICAgIC8vIHB1YmxpYyBjcmVhdGVBcHBsaWNhdGlvbigpOiB2b2lkIHsKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czo6U3ludGhyYVZhdWx0Lm9wdEluW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0SW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czo2OQogICAgLy8gdGhpcy51c2VyQmFsYW5jZShUeG4uc2VuZGVyKS52YWx1ZSA9IFVpbnQ2NCgwKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6NTAKICAgIC8vIHVzZXJCYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndXNlcl9iYWxhbmNlJyB9KQogICAgYnl0ZWNfMCAvLyAidXNlcl9iYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6NjkKICAgIC8vIHRoaXMudXNlckJhbGFuY2UoVHhuLnNlbmRlcikudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czo2NwogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogWydPcHRJbiddIH0pCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6OlN5bnRocmFWYXVsdC5kZXBvc2l0W3JvdXRpbmddKCkgLT4gdm9pZDoKZGVwb3NpdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjgxCiAgICAvLyBwdWJsaWMgZGVwb3NpdChwYXlUeG46IGd0eG4uUGF5bWVudFR4bik6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czo4MwogICAgLy8gYXNzZXJ0KHBheVR4bi5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsICdQYXltZW50IG11c3QgYmUgc2VudCB0byB0aGUgdmF1bHQnKQogICAgZHVwCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIHNlbnQgdG8gdGhlIHZhdWx0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czo4NAogICAgLy8gYXNzZXJ0KHBheVR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIsICdQYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIGNhbGxlcicpCiAgICBkdXAKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBQYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIGNhbGxlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6ODUKICAgIC8vIGFzc2VydChwYXlUeG4uYW1vdW50ID4gVWludDY0KDApLCAnRGVwb3NpdCBhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybycpCiAgICBndHhucyBBbW91bnQKICAgIGR1cAogICAgYXNzZXJ0IC8vIERlcG9zaXQgYW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjg5CiAgICAvLyB0aGlzLnVzZXJCYWxhbmNlKFR4bi5zZW5kZXIpLnZhbHVlICsgcGF5VHhuLmFtb3VudAogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjUwCiAgICAvLyB1c2VyQmFsYW5jZSA9IExvY2FsU3RhdGU8dWludDY0Pih7IGtleTogJ3VzZXJfYmFsYW5jZScgfSkKICAgIGJ5dGVjXzAgLy8gInVzZXJfYmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjg5CiAgICAvLyB0aGlzLnVzZXJCYWxhbmNlKFR4bi5zZW5kZXIpLnZhbHVlICsgcGF5VHhuLmFtb3VudAogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czo4OAogICAgLy8gdGhpcy51c2VyQmFsYW5jZShUeG4uc2VuZGVyKS52YWx1ZSA9CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czo1MAogICAgLy8gdXNlckJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd1c2VyX2JhbGFuY2UnIH0pCiAgICBieXRlY18wIC8vICJ1c2VyX2JhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czo4OC04OQogICAgLy8gdGhpcy51c2VyQmFsYW5jZShUeG4uc2VuZGVyKS52YWx1ZSA9CiAgICAvLyAgIHRoaXMudXNlckJhbGFuY2UoVHhuLnNlbmRlcikudmFsdWUgKyBwYXlUeG4uYW1vdW50CiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjgxCiAgICAvLyBwdWJsaWMgZGVwb3NpdChwYXlUeG46IGd0eG4uUGF5bWVudFR4bik6IHZvaWQgewogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjpTeW50aHJhVmF1bHQud2l0aGRyYXdbcm91dGluZ10oKSAtPiB2b2lkOgp3aXRoZHJhdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjk4CiAgICAvLyBjb25zdCBiYWxhbmNlID0gdGhpcy51c2VyQmFsYW5jZShUeG4uc2VuZGVyKS52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjUwCiAgICAvLyB1c2VyQmFsYW5jZSA9IExvY2FsU3RhdGU8dWludDY0Pih7IGtleTogJ3VzZXJfYmFsYW5jZScgfSkKICAgIGJ5dGVjXzAgLy8gInVzZXJfYmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjk4CiAgICAvLyBjb25zdCBiYWxhbmNlID0gdGhpcy51c2VyQmFsYW5jZShUeG4uc2VuZGVyKS52YWx1ZQogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czo5OQogICAgLy8gYXNzZXJ0KGJhbGFuY2UgPiBVaW50NjQoMCksICdObyBiYWxhbmNlIHRvIHdpdGhkcmF3JykKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIGJhbGFuY2UgdG8gd2l0aGRyYXcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjEwMi0xMDgKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFtb3VudDogYmFsYW5jZSwKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czoxMDQKICAgIC8vIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjEwMi0xMDcKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFtb3VudDogYmFsYW5jZSwKICAgIC8vICAgICBmZWU6IFVpbnQ2NCgwKSwKICAgIC8vICAgfSkKICAgIGludGNfMCAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czoxMDYKICAgIC8vIGZlZTogVWludDY0KDApLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czoxMDItMTA4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhbW91bnQ6IGJhbGFuY2UsCiAgICAvLyAgICAgZmVlOiBVaW50NjQoMCksCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjExMAogICAgLy8gdGhpcy51c2VyQmFsYW5jZShUeG4uc2VuZGVyKS52YWx1ZSA9IFVpbnQ2NCgwKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6NTAKICAgIC8vIHVzZXJCYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndXNlcl9iYWxhbmNlJyB9KQogICAgYnl0ZWNfMCAvLyAidXNlcl9iYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6MTEwCiAgICAvLyB0aGlzLnVzZXJCYWxhbmNlKFR4bi5zZW5kZXIpLnZhbHVlID0gVWludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6OTcKICAgIC8vIHB1YmxpYyB3aXRoZHJhdygpOiB2b2lkIHsKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czo6U3ludGhyYVZhdWx0LmRlZHVjdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlZHVjdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjEyMgogICAgLy8gcHVibGljIGRlZHVjdCh1c2VyOiBBY2NvdW50LCBhbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czoxMjMKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLm93bmVyLnZhbHVlLCAnT25seSB0aGUgb3duZXIgY2FuIGRlZHVjdCcpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6NDIKICAgIC8vIG93bmVyID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBrZXk6ICdvd25lcicgfSkKICAgIGJ5dGVjXzIgLy8gIm93bmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6MTIzCiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5vd25lci52YWx1ZSwgJ09ubHkgdGhlIG93bmVyIGNhbiBkZWR1Y3QnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgb3duZXIgY2FuIGRlZHVjdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6MTI0CiAgICAvLyBhc3NlcnQoYW1vdW50ID4gVWludDY0KDApLCAnRGVkdWN0aW9uIGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvJykKICAgIGR1cAogICAgYXNzZXJ0IC8vIERlZHVjdGlvbiBhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybwogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6MTI2CiAgICAvLyBjb25zdCBjdXJyZW50QmFsYW5jZSA9IHRoaXMudXNlckJhbGFuY2UodXNlcikudmFsdWUKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6NTAKICAgIC8vIHVzZXJCYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndXNlcl9iYWxhbmNlJyB9KQogICAgYnl0ZWNfMCAvLyAidXNlcl9iYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6MTI2CiAgICAvLyBjb25zdCBjdXJyZW50QmFsYW5jZSA9IHRoaXMudXNlckJhbGFuY2UodXNlcikudmFsdWUKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6MTI3CiAgICAvLyBhc3NlcnQoY3VycmVudEJhbGFuY2UgPj0gYW1vdW50LCAnSW5zdWZmaWNpZW50IHVzZXIgYmFsYW5jZScpCiAgICBkdXAKICAgIGRpZyAyCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCB1c2VyIGJhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjEyOQogICAgLy8gdGhpcy51c2VyQmFsYW5jZSh1c2VyKS52YWx1ZSA9IGN1cnJlbnRCYWxhbmNlIC0gYW1vdW50CiAgICBzd2FwCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czo1MAogICAgLy8gdXNlckJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd1c2VyX2JhbGFuY2UnIH0pCiAgICBieXRlY18wIC8vICJ1c2VyX2JhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czoxMjkKICAgIC8vIHRoaXMudXNlckJhbGFuY2UodXNlcikudmFsdWUgPSBjdXJyZW50QmFsYW5jZSAtIGFtb3VudAogICAgc3dhcAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6MTMwCiAgICAvLyB0aGlzLnRvdGFsQ2FsbHMudmFsdWUgPSB0aGlzLnRvdGFsQ2FsbHMudmFsdWUgKyBVaW50NjQoMSkKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czo0NQogICAgLy8gdG90YWxDYWxscyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd0b3RhbF9jYWxscycgfSkKICAgIGJ5dGVjXzEgLy8gInRvdGFsX2NhbGxzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6MTMwCiAgICAvLyB0aGlzLnRvdGFsQ2FsbHMudmFsdWUgPSB0aGlzLnRvdGFsQ2FsbHMudmFsdWUgKyBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6NDUKICAgIC8vIHRvdGFsQ2FsbHMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAndG90YWxfY2FsbHMnIH0pCiAgICBieXRlY18xIC8vICJ0b3RhbF9jYWxscyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjEzMAogICAgLy8gdGhpcy50b3RhbENhbGxzLnZhbHVlID0gdGhpcy50b3RhbENhbGxzLnZhbHVlICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6MTIyCiAgICAvLyBwdWJsaWMgZGVkdWN0KHVzZXI6IEFjY291bnQsIGFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N5bnRocmFfdmF1bHQvU3ludGhyYVZhdWx0LmFsZ28udHM6OlN5bnRocmFWYXVsdC5nZXRCYWxhbmNlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0QmFsYW5jZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjE0MQogICAgLy8gcHVibGljIGdldEJhbGFuY2UodXNlcjogQWNjb3VudCk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjE0MgogICAgLy8gcmV0dXJuIHRoaXMudXNlckJhbGFuY2UodXNlcikudmFsdWUKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czo1MAogICAgLy8gdXNlckJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICd1c2VyX2JhbGFuY2UnIH0pCiAgICBieXRlY18wIC8vICJ1c2VyX2JhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3ludGhyYV92YXVsdC9TeW50aHJhVmF1bHQuYWxnby50czoxNDIKICAgIC8vIHJldHVybiB0aGlzLnVzZXJCYWxhbmNlKHVzZXIpLnZhbHVlCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zeW50aHJhX3ZhdWx0L1N5bnRocmFWYXVsdC5hbGdvLnRzOjE0MQogICAgLy8gcHVibGljIGdldEJhbGFuY2UodXNlcjogQWNjb3VudCk6IHVpbnQ2NCB7CiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyADAQAgJgMMdXNlcl9iYWxhbmNlC3RvdGFsX2NhbGxzBW93bmVygAQpMU2VNhoAjgEAOzEZFEQxGEEAJIIEBDYl5OsEtzVf0QRZGix6BLQXqGQ2GgCOBAAqAFUAcgCpAIAEuER7NjYaAI4BAAwAMRkiEjEYEERCAAkqMQBnKSNnIkMxACgjZiJDMRYiCUk4ECISREk4BzIKEkRJOAAxABJEOAhJRDEAIyhjRAgxAChPAmYiQzEAIyhjRElEsTEAsgeyCCKyECOyAbMxACgjZiJDNhoBSRUkEkQ2GgJJFYEIEkQXMQAjKmVEEkRJREsBIyhjRElLAg9ETAkoTGYjKWVEIggpTGciQzYaAUkVJBJEIyhjRBaABBUffHVMULAiQw==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": {} }