Transaction #78833

Hash d5ceb0f3f00388c59d3b695beefdd60c894a4f10c999604d19ed20823484865b
Status Success
Timestamp 1073 days ago - 5/21/2021, 5:44:27 AM UTC+0
Block 78248
Stamps Used 387
Burned Fee 0.05953846 TAU
From a02dde674a13d6fb71ac08f79b5ae1e23e4c43af4d8fbd05c7b2db6f167d7adc 
Contract Name submission
Function Name submit_contract

Additional Info
SubBlock Number 0
Nonce 0
Processor 5b09493df6c18d17cc883ebce54fcb1f5afbd507533417fe32c006009a9c3c4a
Signature 63665461ae0a26870d1dd417b9e54ea41c0790bd9f106c3d4b1c1baa1c75641e1276cd18f7b99d72c5fc4c698de1ca4dc541eb2c4bebc9e684f92d37e69e200a
Stamps Supplied 1000
Stamps per TAU 65

Kwargs

code import currency import con_luck_lst001 puzzleInfo = Hash() puzzleOwner = Hash() ownersToPuzzles = Hash() puzzleHash = Hash(default_value='') puzzleSalts = Hash(default_value='') puzzlePrizes = Hash(default_value=0) puzzleImages = Hash(default_value='') puzzleGuesses = Hash(default_value=0) owner = Variable() activePuzzles = Variable() solvedPuzzles = Variable() @construct def seed(): owner.set(ctx.caller) ap = [] activePuzzles.set(ap) sp = [] solvedPuzzles.set(sp) @export def changeOwner(newOwner: str): sender = ctx.caller assert sender == owner.get(), 'error: only the current owner can transfer ownership' owner.set(newOwner) # @export # def withdrawLuck(amount: float): # sender = ctx.caller # assert sender == owner.get(), 'error: only the current owner can withdraw' # con_luck_lst001.transfer(amount, sender) @export def create(puzzleName: str, hint: str, solution: str, prize: int, imageData: str): sender = ctx.caller assert not puzzleInfo[puzzleName], 'error: puzzle name \'{}\' already taken'.format(puzzleName) if(prize > 0): assert currency.balance_of(sender) >= prize, "error: TAU/dTAU balance of less than prize of {}".format(prize) con_luck_lst001.transfer_from(amount=10, to=ctx.this, main_account=sender) currency.transfer_from(amount=prize, to=ctx.this, main_account=sender) pInfo = { 'name': puzzleName, 'prize': prize, 'hint': hint, 'date': now, 'active': True } puzzleInfo[puzzleName] = pInfo puzzleOwner[puzzleName] = sender puzzleImages[puzzleName] = imageData puzzleGuesses[puzzleName] = 0 random.seed() salt = str(random.randint(0, 999999999)) puzzleHash[puzzleName] = hashlib.sha256(salt + solution) puzzleSalts[puzzleName] = salt puzzlePrizes[puzzleName] = prize ap = activePuzzles.get() ap.append(puzzleName) activePuzzles.set(ap) return 'puzzle created' @export def updateHint(puzzleName: str, hint: str): sender = ctx.caller assert sender == puzzleOwner[puzzleName], "error: only the owner can update a puzzle" pInfo = puzzleInfo[puzzleName] pInfo['hint'] = hint puzzleInfo[puzzleName] = pInfo @export def increasePrize(puzzleName: str, increaseToPrize: int): sender = ctx.caller assert sender == puzzleOwner[puzzleName], "error: only the owner can update a puzzle" assert increaseToPrize > 0, "error: increase to prize must be greater than 0" currency.transfer_from(amount=increaseToPrize, to=ctx.this, main_account=sender) prize = puzzlePrizes[puzzleName] + increaseToPrize puzzlePrizes[puzzleName] = prize pInfo = puzzleInfo[puzzleName] pInfo['prize'] = prize puzzleInfo[puzzleName] = pInfo @export def guess(puzzleName: str, guess: str): ap = activePuzzles.get() assert puzzleName in ap, 'error: puzzle is already solved' sender = ctx.caller prize = puzzlePrizes[puzzleName] if(prize > 0): con_luck_lst001.transfer_from(amount=1, to=puzzleOwner[puzzleName], main_account=sender) g = puzzleGuesses[puzzleName] g += 1 puzzleGuesses[puzzleName] = g if(puzzleHash[puzzleName] == hashlib.sha256(puzzleSalts[puzzleName] + guess)): ap.remove(puzzleName) activePuzzles.set(ap) prize = puzzlePrizes[puzzleName] if(prize > 0): currency.transfer(prize, sender) puzzlePrizes[puzzleName] = 0 sp = solvedPuzzles.get() sp.append(puzzleName) solvedPuzzles.set(sp) pInfo = puzzleInfo[puzzleName] pInfo['active'] = False pInfo['winner'] = sender pInfo['solvedDate'] = now pInfo['solution'] = guess puzzleInfo[puzzleName] = pInfo return 'You guessed correctly!' else: return 'You guessed incorrectly...' @export def violation(puzzleName: str): sender = ctx.caller assert sender == owner.get(), 'error: only the current owner can withdraw' ap = activePuzzles.get() ap.remove(puzzleName) activePuzzles.set(ap) puzzleImages[puzzleName] = '' pInfo = puzzleInfo[puzzleName] pInfo['active'] = False pInfo['hint'] = '' pInfo['name'] = 'cancelled due to volation' puzzleInfo[puzzleName] = pInfo prize = puzzlePrizes[puzzleName] if(prize > 0): currency.transfer(prize, sender) puzzlePrizes[puzzleName] = 0
name con_puzzles_v1

State Changes

Contract con_puzzles_v1
Variable owner
New Value a02dde674a13d6fb71ac08f79b5ae1e23e4c43af4d8fbd05c7b2db6f167d7adc
 
Contract con_puzzles_v1
Variable activePuzzles
New Value []
 
Contract con_puzzles_v1
Variable solvedPuzzles
New Value []
 
Contract con_puzzles_v1
Variable __code__
New Value import currency import con_luck_lst001 __puzzleInfo = Hash(contract='con_puzzles_v1', name='puzzleInfo') __puzzleOwner = Hash(contract='con_puzzles_v1', name='puzzleOwner') __ownersToPuzzles = Hash(contract='con_puzzles_v1', name='ownersToPuzzles') __puzzleHash = Hash(default_value='', contract='con_puzzles_v1', name= 'puzzleHash') __puzzleSalts = Hash(default_value='', contract='con_puzzles_v1', name= 'puzzleSalts') __puzzlePrizes = Hash(default_value=0, contract='con_puzzles_v1', name= 'puzzlePrizes') __puzzleImages = Hash(default_value='', contract='con_puzzles_v1', name= 'puzzleImages') __puzzleGuesses = Hash(default_value=0, contract='con_puzzles_v1', name= 'puzzleGuesses') __owner = Variable(contract='con_puzzles_v1', name='owner') __activePuzzles = Variable(contract='con_puzzles_v1', name='activePuzzles') __solvedPuzzles = Variable(contract='con_puzzles_v1', name='solvedPuzzles') def ____(): __owner.set(ctx.caller) ap = [] __activePuzzles.set(ap) sp = [] __solvedPuzzles.set(sp) @__export('con_puzzles_v1') def changeOwner(newOwner: str): sender = ctx.caller assert sender == __owner.get( ), 'error: only the current owner can transfer ownership' __owner.set(newOwner) @__export('con_puzzles_v1') def create(puzzleName: str, hint: str, solution: str, prize: int, imageData: str): sender = ctx.caller assert not __puzzleInfo[puzzleName ], "error: puzzle name '{}' already taken".format(puzzleName) if prize > 0: assert currency.balance_of(sender ) >= prize, 'error: TAU/dTAU balance of less than prize of {}'.format( prize) con_luck_lst001.transfer_from(amount=10, to=ctx.this, main_account= sender) currency.transfer_from(amount=prize, to=ctx.this, main_account=sender) pInfo = {'name': puzzleName, 'prize': prize, 'hint': hint, 'date': now, 'active': True} __puzzleInfo[puzzleName] = pInfo __puzzleOwner[puzzleName] = sender __puzzleImages[puzzleName] = imageData __puzzleGuesses[puzzleName] = 0 random.seed() salt = str(random.randint(0, 999999999)) __puzzleHash[puzzleName] = hashlib.sha256(salt + solution) __puzzleSalts[puzzleName] = salt __puzzlePrizes[puzzleName] = prize ap = __activePuzzles.get() ap.append(puzzleName) __activePuzzles.set(ap) return 'puzzle created' @__export('con_puzzles_v1') def updateHint(puzzleName: str, hint: str): sender = ctx.caller assert sender == __puzzleOwner[puzzleName ], 'error: only the owner can update a puzzle' pInfo = __puzzleInfo[puzzleName] pInfo['hint'] = hint __puzzleInfo[puzzleName] = pInfo @__export('con_puzzles_v1') def increasePrize(puzzleName: str, increaseToPrize: int): sender = ctx.caller assert sender == __puzzleOwner[puzzleName ], 'error: only the owner can update a puzzle' assert increaseToPrize > 0, 'error: increase to prize must be greater than 0' currency.transfer_from(amount=increaseToPrize, to=ctx.this, main_account=sender) prize = __puzzlePrizes[puzzleName] + increaseToPrize __puzzlePrizes[puzzleName] = prize pInfo = __puzzleInfo[puzzleName] pInfo['prize'] = prize __puzzleInfo[puzzleName] = pInfo @__export('con_puzzles_v1') def guess(puzzleName: str, guess: str): ap = __activePuzzles.get() assert puzzleName in ap, 'error: puzzle is already solved' sender = ctx.caller prize = __puzzlePrizes[puzzleName] if prize > 0: con_luck_lst001.transfer_from(amount=1, to=__puzzleOwner[puzzleName ], main_account=sender) g = __puzzleGuesses[puzzleName] g += 1 __puzzleGuesses[puzzleName] = g if __puzzleHash[puzzleName] == hashlib.sha256(__puzzleSalts[puzzleName] + guess): ap.remove(puzzleName) __activePuzzles.set(ap) prize = __puzzlePrizes[puzzleName] if prize > 0: currency.transfer(prize, sender) __puzzlePrizes[puzzleName] = 0 sp = __solvedPuzzles.get() sp.append(puzzleName) __solvedPuzzles.set(sp) pInfo = __puzzleInfo[puzzleName] pInfo['active'] = False pInfo['winner'] = sender pInfo['solvedDate'] = now pInfo['solution'] = guess __puzzleInfo[puzzleName] = pInfo return 'You guessed correctly!' else: return 'You guessed incorrectly...' @__export('con_puzzles_v1') def violation(puzzleName: str): sender = ctx.caller assert sender == __owner.get( ), 'error: only the current owner can withdraw' ap = __activePuzzles.get() ap.remove(puzzleName) __activePuzzles.set(ap) __puzzleImages[puzzleName] = '' pInfo = __puzzleInfo[puzzleName] pInfo['active'] = False pInfo['hint'] = '' pInfo['name'] = 'cancelled due to volation' __puzzleInfo[puzzleName] = pInfo prize = __puzzlePrizes[puzzleName] if prize > 0: currency.transfer(prize, sender) __puzzlePrizes[puzzleName] = 0
 
Contract con_puzzles_v1
Variable __compiled__
New Value e30000000000000000000000000700000040000000733c010000640064016c005a00640064016c015a0165026402640364048d025a0365026402640564048d025a0465026402640664048d025a05650264076402640864098d035a06650264076402640a64098d035a07650264006402640b64098d035a08650264076402640c64098d035a09650264006402640d64098d035a0a650b6402640e64048d025a0c650b6402640f64048d025a0d650b6402641064048d025a0e6411641284005a0f651064028301651164139c0164146415840483015a126510640283016511651165116513651164169c0564176418840483015a146510640283016511651164199c02641a641b840483015a1565106402830165116513641c9c02641d641e840483015a1665106402830165116511641f9c0264206421840483015a17651064028301651164229c0164236424840483015a18640153002925e9000000004eda0e636f6e5f70757a7a6c65735f7631da0a70757a7a6c65496e666f2902da08636f6e7472616374da046e616d65da0b70757a7a6c654f776e6572da0f6f776e657273546f50757a7a6c6573da00da0a70757a7a6c65486173682903da0d64656661756c745f76616c756572040000007205000000da0b70757a7a6c6553616c7473da0c70757a7a6c655072697a6573da0c70757a7a6c65496d61676573da0d70757a7a6c6547756573736573da056f776e6572da0d61637469766550757a7a6c6573da0d736f6c76656450757a7a6c6573630000000000000000020000000200000043000000732c00000074006a0174026a038301010067007d0074046a017c008301010067007d0174056a017c01830101006400530029014e2906da075f5f6f776e6572da03736574da03637478da0663616c6c6572da0f5f5f61637469766550757a7a6c6573da0f5f5f736f6c76656450757a7a6c65732902da026170da027370a900721a0000007208000000da045f5f5f5f15000000730a00000000010c0104010a010401721b0000002901da086e65774f776e6572630100000000000000020000000200000043000000732800000074006a017d017c0174026a0383006b02731a740464018301820174026a057c00830101006400530029024e7a346572726f723a206f6e6c79207468652063757272656e74206f776e65722063616e207472616e73666572206f776e6572736869702906721400000072150000007212000000da03676574da0e417373657274696f6e4572726f7272130000002902721c000000da0673656e646572721a000000721a0000007208000000da0b6368616e67654f776e65721d0000007308000000000206010e01060172200000002905da0a70757a7a6c654e616d65da0468696e74da08736f6c7574696f6eda057072697a65da09696d6167654461746163050000000000000009000000060000004300000073f000000074006a017d0574027c0019000c00731e740364016a047c008301830182017c0364026b04726674056a067c0583017c036b057342740364036a047c0383018301820174076a08640474006a097c0564058d03010074056a087c0374006a097c0564058d0301007c007c037c01740a640664079c057d067c0674027c003c007c05740b7c003c007c04740c7c003c006402740d7c003c00740e6a0f830001007410740e6a1164026408830283017d0774126a137c077c021700830174147c003c007c0774157c003c007c0374167c003c0074176a1883007d087c086a197c008301010074176a1a7c088301010064095300290a4e7a256572726f723a2070757a7a6c65206e616d6520277b7d2720616c72656164792074616b656e72010000007a306572726f723a205441552f645441552062616c616e6365206f66206c657373207468616e207072697a65206f66207b7de90a0000002903da06616d6f756e74da02746fda0c6d61696e5f6163636f756e74542905720500000072240000007222000000da0464617465da0661637469766569ffc99a3b7a0e70757a7a6c652063726561746564291b72140000007215000000da0c5f5f70757a7a6c65496e666f721e000000da06666f726d6174da0863757272656e6379da0a62616c616e63655f6f66da0f636f6e5f6c75636b5f6c7374303031da0d7472616e736665725f66726f6dda0474686973da036e6f77da0d5f5f70757a7a6c654f776e6572da0e5f5f70757a7a6c65496d61676573da0f5f5f70757a7a6c6547756573736573da0672616e646f6dda0473656564da03737472da0772616e64696e74da07686173686c6962da06736861323536da0c5f5f70757a7a6c6548617368da0d5f5f70757a7a6c6553616c7473da0e5f5f70757a7a6c655072697a65737216000000721d000000da06617070656e647213000000290972210000007222000000722300000072240000007225000000721f000000da0570496e666fda0473616c747218000000721a000000721a0000007208000000da06637265617465250000007332000000000306010c010c01080108010c0108010a01080112010801080108010801080108010801100112010801080108010a010a017243000000290272210000007222000000630200000000000000040000000300000043000000733600000074006a017d027c0274027c0019006b02731a740364018301820174047c0019007d037c017c0364023c007c0374047c003c006400530029034e7a296572726f723a206f6e6c7920746865206f776e65722063616e2075706461746520612070757a7a6c6572220000002905721400000072150000007234000000721e000000722c000000290472210000007222000000721f0000007241000000721a000000721a0000007208000000da0a75706461746548696e7443000000730c000000000206010e01060108010801724400000029027221000000da0f696e637265617365546f5072697a65630200000000000000050000000500000043000000736c00000074006a017d027c0274027c0019006b02731a74036401830182017c0164026b04732a740364038301820174046a057c0174006a067c0264048d03010074077c0019007c0117007d037c0374077c003c0074087c0019007d047c037c0464053c007c0474087c003c006400530029064e7a296572726f723a206f6e6c7920746865206f776e65722063616e2075706461746520612070757a7a6c6572010000007a2f6572726f723a20696e63726561736520746f207072697a65206d7573742062652067726561746572207468616e2030290372270000007228000000722900000072240000002909721400000072150000007234000000721e000000722e00000072310000007232000000723f000000722c000000290572210000007245000000721f00000072240000007241000000721a000000721a0000007208000000da0d696e6372656173655072697a654d0000007316000000000206010e01060110010a0108010c01080108010801724600000029027221000000da056775657373630200000000000000080000000500000043000000730401000074006a0183007d027c007c026b067318740264018301820174036a047d0374057c0019007d047c0464026b04724274066a07640374087c0019007c0364048d03010074097c0019007d057c05640337007d057c0574097c003c00740a7c001900740b6a0c740d7c0019007c01170083016b0272fc7c026a0e7c008301010074006a0f7c028301010074057c0019007d047c0464026b0472ac74106a117c047c0383020100640274057c003c0074126a0183007d067c066a137c008301010074126a0f7c068301010074147c0019007d0764057c0764063c007c037c0764073c0074157c0764083c007c017c0764093c007c0774147c003c00640a5300640b530064005300290c4e7a1f6572726f723a2070757a7a6c6520697320616c726561647920736f6c7665647201000000e901000000290372270000007228000000722900000046722b000000da0677696e6e6572da0a736f6c7665644461746572230000007a16596f75206775657373656420636f72726563746c79217a1a596f75206775657373656420696e636f72726563746c792e2e2e29167216000000721d000000721e00000072140000007215000000723f0000007230000000723100000072340000007236000000723d000000723b000000723c000000723e000000da0672656d6f76657213000000722e000000da087472616e7366657272170000007240000000722c00000072330000002908722100000072470000007218000000721f0000007224000000da016772190000007241000000721a000000721a000000720800000072470000005c000000733a0000000002080110010601080108010c01080108010801080110010a010a010a01080108010c01080108010a010a010801080108010801080108010402724700000029017221000000630100000000000000050000000300000043000000738e00000074006a017d017c0174026a0383006b02731a740464018301820174056a0383007d027c026a067c008301010074056a077c0283010100640274087c003c0074097c0019007d0364037c0364043c0064027c0364053c0064067c0364073c007c0374097c003c00740a7c0019007d047c0464086b04728a740b6a0c7c047c01830201006408740a7c003c006400530029094e7a2a6572726f723a206f6e6c79207468652063757272656e74206f776e65722063616e207769746864726177720800000046722b00000072220000007a1963616e63656c6c65642064756520746f20766f6c6174696f6e72050000007201000000290d721400000072150000007212000000721d000000721e0000007216000000724b00000072130000007235000000722c000000723f000000722e000000724c00000029057221000000721f000000721800000072410000007224000000721a000000721a0000007208000000da0976696f6c6174696f6e7e0000007320000000000206010e01060108010a010a01080108010801080108010801080108010c01724e0000002919722e0000007230000000da0448617368722c0000007234000000da115f5f6f776e657273546f50757a7a6c6573723d000000723e000000723f00000072350000007236000000da085661726961626c65721200000072160000007217000000721b000000da085f5f6578706f727472390000007220000000da03696e747243000000724400000072460000007247000000724e000000721a000000721a000000721a0000007208000000da083c6d6f64756c653e01000000733e000000080108010c010c010c0106010801060108010601080106010801060108010c010c010c0308080601100706010801101c060112090601120e060112210601
 
Contract con_puzzles_v1
Variable __owner__
New Value null
 
Contract con_puzzles_v1
Variable __submitted__
New Value 2021,5,21,5,44,28,0
 
Contract con_puzzles_v1
Variable __developer__
New Value a02dde674a13d6fb71ac08f79b5ae1e23e4c43af4d8fbd05c7b2db6f167d7adc
 
Contract currency
Variable balances
Key a02dde674a13d6fb71ac08f79b5ae1e23e4c43af4d8fbd05c7b2db6f167d7adc
New Value 19.046153846153846