{ "name": "GameContract", "structs": { "ObjectB555233E": [ { "name": "startAt", "type": "uint64" }, { "name": "endCommitAt", "type": "uint64" }, { "name": "endRevealAt", "type": "uint64" }, { "name": "participation", "type": "uint64" } ] }, "methods": [ { "name": "getGameType", "args": [], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Returns contract identification info.", "events": [], "recommendations": {} }, { "name": "initialize", "args": [ { "type": "string", "name": "gameType" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Sets the game type. Immutable once set.\nCan only be called by the creator.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "Abstract contract implementing a generic Commit-Reveal scheme for N-player games.\n\nImplements the full lifecycle:\n1. Creation (MBR reservation)\n2. Joining (Commit hash + MBR reservation)\n3. Revealing (Verifying hash against choice)\n\nSupports both single-round and multi-round (elimination) logic.", "networks": {}, "state": { "schema": { "global": { "ints": 1, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "gameType": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "Z2FtZVR5cGU=", "desc": "Contract type identifier (e.g., 'RPS', 'GUESS').\nUsed for CLI validation." }, "sessionIDCounter": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c2Vzc2lvbklEQ291bnRlcg==", "desc": "Global counter for generating unique session IDs." } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "playerCommit": { "keyType": "AVMBytes", "valueType": "AVMBytes", "desc": "Storage for player commits.\nKey: Hash(sessionID + playerAddress) OR Hash(sessionID + round + playerAddress)\nValue: Hash(choice + salt) [32 bytes]", "prefix": "cGNvbQ==" }, "playerChoice": { "keyType": "AVMBytes", "valueType": "uint64", "desc": "Storage for revealed choices.\nKey: Hash(sessionID + playerAddress) OR Hash(sessionID + round + playerAddress)\nValue: Player Choice [8 bytes]", "prefix": "cGNobw==" }, "gameSessions": { "keyType": "uint64", "valueType": "ObjectB555233E", "desc": "Configuration storage for each active session.", "prefix": "Z3M=" }, "sessionBalances": { "keyType": "uint64", "valueType": "uint64", "desc": "Tracks the total pot (collected participation fees) for a specific session.", "prefix": "c2JhbA==" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 135 ], "errorMessage": "Contract already initialized" }, { "pc": [ 53 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 86 ], "errorMessage": "OnCompletion must be NoOp && can only call when creating" }, { "pc": [ 141 ], "errorMessage": "Only creator can initialize" }, { "pc": [ 92, 132 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 117 ], "errorMessage": "invalid array length header" }, { "pc": [ 125 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrICJnYW1lVHlwZSIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyBnYW1lVHlwZSA9IEdsb2JhbFN0YXRlPGJ5dGVzPih7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJycpIH0pCiAgICBieXRlY18wIC8vICJnYW1lVHlwZSIKICAgIHB1c2hieXRlcyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBzZXNzaW9uSURDb3VudGVyID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KQogICAgcHVzaGJ5dGVzICJzZXNzaW9uSURDb3VudGVyIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjM4CiAgICAvLyBleHBvcnQgY2xhc3MgR2FtZUNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDExCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDU2ODNlZTA4IDB4ZWNmMzM5ZTcgLy8gbWV0aG9kICJnZXRHYW1lVHlwZSgpYnl0ZVtdIiwgbWV0aG9kICJpbml0aWFsaXplKHN0cmluZyl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZ2V0R2FtZVR5cGUgaW5pdGlhbGl6ZQogICAgZXJyCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjM4CiAgICAvLyBleHBvcnQgY2xhc3MgR2FtZUNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo6R2FtZUNvbnRyYWN0LmdldEdhbWVUeXBlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0R2FtZVR5cGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo3OQogICAgLy8gcmV0dXJuIHRoaXMuZ2FtZVR5cGUudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo0NAogICAgLy8gZ2FtZVR5cGUgPSBHbG9iYWxTdGF0ZTxieXRlcz4oeyBpbml0aWFsVmFsdWU6IEJ5dGVzKCcnKSB9KQogICAgYnl0ZWNfMCAvLyAiZ2FtZVR5cGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo3OQogICAgLy8gcmV0dXJuIHRoaXMuZ2FtZVR5cGUudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo3OAogICAgLy8gcHVibGljIGdldEdhbWVUeXBlKCk6IGJ5dGVzIHsKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo6R2FtZUNvbnRyYWN0LmluaXRpYWxpemVbcm91dGluZ10oKSAtPiB2b2lkOgppbml0aWFsaXplOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6ODYKICAgIC8vIHB1YmxpYyBpbml0aWFsaXplKGdhbWVUeXBlOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJzdHJhY3RfY29udHJhY3QvY29udHJhY3QuYWxnby50czo4NwogICAgLy8gYXNzZXJ0KHRoaXMuZ2FtZVR5cGUudmFsdWUubGVuZ3RoID09PSAwLCAnQ29udHJhY3QgYWxyZWFkeSBpbml0aWFsaXplZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIGdhbWVUeXBlID0gR2xvYmFsU3RhdGU8Ynl0ZXM+KHsgaW5pdGlhbFZhbHVlOiBCeXRlcygnJykgfSkKICAgIGJ5dGVjXzAgLy8gImdhbWVUeXBlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6ODcKICAgIC8vIGFzc2VydCh0aGlzLmdhbWVUeXBlLnZhbHVlLmxlbmd0aCA9PT0gMCwgJ0NvbnRyYWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGxlbgogICAgIQogICAgYXNzZXJ0IC8vIENvbnRyYWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjg4CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCAnT25seSBjcmVhdG9yIGNhbiBpbml0aWFsaXplJykKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIGluaXRpYWxpemUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyBnYW1lVHlwZSA9IEdsb2JhbFN0YXRlPGJ5dGVzPih7IGluaXRpYWxWYWx1ZTogQnl0ZXMoJycpIH0pCiAgICBieXRlY18wIC8vICJnYW1lVHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYnN0cmFjdF9jb250cmFjdC9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyB0aGlzLmdhbWVUeXBlLnZhbHVlID0gQnl0ZXMoZ2FtZVR5cGUpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2Fic3RyYWN0X2NvbnRyYWN0L2NvbnRyYWN0LmFsZ28udHM6ODYKICAgIC8vIHB1YmxpYyBpbml0aWFsaXplKGdhbWVUeXBlOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyACAAEmAQhnYW1lVHlwZTEYQAAYKIAAZ4AQc2Vzc2lvbklEQ291bnRlciJnMRtBAB0xGRREMRhEggIEVoPuCATs8znnNhoAjgIACwAiADEZFDEYFBBEI0MiKGVESRUWVwYCTFCABBUffHVMULAjQzYaAUkiWYECCEsBFRJEVwIAIihlRBUURDEAMgkSRChMZyND", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": {} }