Transaction:

8777c89316b59c4558919ec97cc3aae6ccb9e3a2d6fe81cadd72b196a4a26f85
Status
Success
Timestamp
12/13/2020, 10:06:25 PM
Result
None
Block Number
2890
SubBlock Number
0
Nonce
3
Processor
89f67bb871351a1629d66676e4bd92bbacb23bd0649b890542ef98f1b664a497
Stamps Used
774 ( 59.5 dTAU )
Contract Name
submission
Function Name
submit_contract
Signature
9edef6072af560c4df1bf8300d8d79c65d22290f232dc661b1275fe157187392c171aecfe69e0b2e692342673a65ff71e44b940488a290e2ff5d417236f27308

Kwargs

code
import currency owner = Variable() validators = Hash() bets = Hash() settings = Hash() betNames = Hash() @construct def seed(initial_owner: str): owner.set(initial_owner) settings['min_bet'] = 15 settings['validator_deposit_coefficient'] = 0.5 settings['validation_deadline'] = datetime.timedelta(days=1) validators = [initial_owner] @export def redeem_funds(): sender = ctx.caller assert bets[sender, 'funds'] is not None, 'You have no funds to redeem' funds = bets[sender, 'funds'] assert funds > 0, 'You have no funds to redeem' bets[sender, 'funds'] = 0 currency.transfer(amount=funds, to=sender) @export def transfer_ownership(new_owner: str): assert owner.get() == ctx.caller, 'haha' owner.set(new_owner) @export def assign_validator(validator: str, revoke: bool): assert owner.get() == ctx.caller, 'Only the contract owner can assign a new validator' if revoke: validators.remove(validator) if not revoke: validators.append(validator) @export def create_bet(bet_id: str, amount: int, opposing_amount: int, title: str, deadline: datetime.datetime): sender = ctx.caller assert amount >= settings['min_bet'], "Bet is not large enough, min_bet is " + str(settings['min_bet']) assert opposing_amount >= settings['min_bet'], "Bet is not large enough, min_bet is " + str(settings['min_bet']) assert bets[bet_id, 'amount_left'] is None, 'Game with ID ' + str(bet_id) + ' already exists' assert deadline > now, 'Deadline cannot be in the past' validation_deposit_left = amount * settings['validator_deposit_percent'] validation_deposit_right = opposing_amount * settings['validator_deposit_percent'] bet = amount + validation_deposit_left assert_balance(bet) currency.transfer_from(amount=bet, to=ctx.this, main_account=sender) bets[bet_id, 'amount_left'] = amount bets[bet_id, 'amount_right'] = opposing_amount bets[bet_id, 'validation_deposit_left'] = validation_deposit_left bets[bet_id, 'validation_deposit_right'] = validation_deposit_right bets[bet_id, 'player_left'] = sender bets[bet_id, 'locked'] = False bets[bet_id, 'title'] = title bets[bet_id, 'deadline'] = deadline bets[bet_id, 'decision'] = [] bets[bet_id, 'removal'] = [] bets[sender, 'funds'] = 0 if bet_names['names'] is not None: names = bet_names['names'] names.append(bet_id) bet_names['names'] = names else: bet_names['names'] = [bet_id] @export def join_bet(bet_id: str, amount: float): sender = ctx.caller assert bets[bet_id, 'amount_left'] is not None, bet_id + ' does not exist' assert not bets[bet_id, 'locked'], 'This bet is full' assert bets[bet_id, 'deadline'] > now, 'The deadline for this contract has passed' bet = bets[bet_id, 'amount_right'] + bets[bet_id, 'validation_deposit_right'] assert amount == bet, 'Your deposit amount must be exactly the required bet and validation fee, this is ' + str(bet) assert_balance(bet) currency.transfer_from(amount=bet, to=ctx.this, main_account=sender) bets[bet_id, 'player_right'] = sender bets[bet_id, 'locked'] = True bets[sender, 'funds'] = 0 @export def validate(bet_id: str, winner: bool): # True means left, False means right sender = ctx.caller assert bets[bet_id, 'amount_left'] is not None, 'Bet does not exist' assert sender in validators, 'Only certified validators may validate disputed bets' assert bets[bet_id, 'deadline'] + settings[setting, 'validation_deadline'] < now, 'Not past deadline yet' decisions = bets[bet_id, 'decision'] if winner: winner_wallet = bets[bet_id, 'player_left'] loser_wallet = bets[bet_id, 'player_right'] if len(decisions) == 1 and winner_wallet != decisions[0][0]: amount = bets[bet_id, 'amount_left'] + bets[bet_id, 'amount_right'] validator_fee = bets[bet_id, 'validation_deposit_left'] bets[bet_id, 'validation_deposit_right'] = 0 bets[loser_wallet, 'funds'] += bets[bet_id, 'validation_deposit_right'] else: amount = bets[bet_id, 'amount_left'] + bets[bet_id, 'amount_right'] + bets[ bet_id, 'validation_deposit_left'] validator_fee = bets[bet_id, 'validation_deposit_right'] elif not winner: winner_wallet = bets[bet_id, 'player_right'] loser_wallet = bets[bet_id, 'player_left'] if len(decisions) == 1 and winner_wallet != decisions[0][0]: amount = bets[bet_id, 'amount_left'] + bets[bet_id, 'amount_right'] validator_fee = bets[bet_id, 'validation_deposit_right'] bets[bet_id, 'validation_deposit_left'] = 0 bets[loser_wallet, 'funds'] += bets[bet_id, 'validation_deposit_left'] else: amount = bets[bet_id, 'amount_left'] + bets[bet_id, 'amount_right'] + bets[ bet_id, 'validation_deposit_right'] validator_fee = bets[bet_id, 'validation_deposit_left'] bets[winner_wallet, 'funds'] += amount currency.transfer(amount=validator_fee, to=sender) remove_game(bet_id) @export def remove_malicious_bet(bet_id: str): # necessary as a precaution and preventative measure against malicious actors creating bad bets, # such as offensive bets or potential exploits. This is left at the discretion of the owner and will not be used # unless absolutely necessary. assert owner.get() == ctx.caller, 'Only the owner can remove a bet' player_left = bets[bet_id, 'player_left'] amount_left = bets[bet_id, 'amount_left'] + (bets[bet_id, 'validation_deposit_left'] * 0.9) bets[player_left, 'funds'] += amount_left owner_fee = (bets[bet_id, 'validation_deposit_left'] * 0.1) amount_right = 0 if bets[bet_id, 'player_right'] is not None: player_right = bets[bet_id, 'player_right'] amount_right = bets[bet_id, 'amount_right'] + (bets[bet_id, 'validation_deposit_right'] * 0.9) bets[player_right, 'funds'] += amount_right owner_fee += (bets[bet_id, 'validation_deposit_right'] * 0.1) currency.transfer(amount=owner_fee, to=ctx.caller) remove_game(bet_id) @export def remove_amicable_bet(bet_id: str): # necessary in case both parties decide to end a bet. sender = ctx.caller assert bets[bet_id, 'amount_left'] is not None, 'Bet does not exist' assert bets[bet_id, 'locked'], 'Your bet has not been matched yet, you can call cancel_bet instead' assert sender == bets[bet_id, 'player_left'] or sender == bets[bet_id, 'player_right'], 'You are not a part of this bet' assert sender not in bets[ bet_id, 'removal'], 'You have already submitted a removal request, you must wait for your opponent' bets[bet_id, 'removal'].append(sender) if len(bets[bet_id, 'removal']) == 2: player_left = bets[bet_id, 'player_left'] amount_left = bets[bet_id, 'amount_left'] + bets[bet_id, 'validation_deposit_left'] bets[player_left, 'funds'] += amount_left player_right = bets[bet_id, 'player_right'] amount_right = bets[bet_id, 'amount_right'] + bets[bet_id, 'validation_deposit_right'] bets[player_right, 'funds'] += amount_right remove_game(bet_id) @export def cancel_bet(bet_id: str): sender = ctx.caller assert bets[bet_id, 'amount_left'] is not None, 'Bet does not exist' assert not bets[bet_id, 'locked'], 'The game is locked' assert sender == bets[bet_id, 'player_left'], 'You are not in the bet' assert bets[bet_id, 'amount_left'] > 0 amount = bets[bet_id, 'amount_left'] validation = bets[bet_id, 'validation_deposit_left'] bets[sender, 'funds'] += amount + validation remove_game(bet_id) @export def determine_outcome(bet_id: str, outcome: bool): # True means you won, False means you lost sender = ctx.caller assert bets[bet_id, 'amount_left'] is not None, bet_id + ' does not exist' assert deadline < now, 'The deadline has not passed yet' assert bets[bet_id, 'locked'], 'This bet was not matched, please remove the bet instead' assert sender == bets[bet_id, 'player_left'] or sender == bets[ bet_id, 'player_right'], 'You are not in this bet' decision = bets[bet_id, 'decision'] if len(decision) == 1: assert sender != decision[0][0], "You have already made a decision" elif len(decision) == 2: assert decision[0][1] == decision[1][1], "This bet is disputed and must be resolved by a validator" if sender == bets[bet_id, 'player_left']: player_left = sender player_right = bets[bet_id, 'player_right'] if outcome: dec = player_left else: dec = player_right else: player_left = bets[bet_id, 'player_left'] player_right = sender if outcome: dec = player_right else: dec = player_left decision.append([sender, dec]) if len(decision) == 2: assert make_decision(bet_id, decision, player_left, player_right), "This bet is disputed and must be resolved by a validator" else: bets[bet_id, 'decision'] = decision def make_decision(bet_id, decision, player_left, player_right): if decision[0][1] == decision[1][1]: if player_left == decision[0][1]: winner_wallet = player_left loser_wallet = player_right amount = bets[bet_id, 'amount_left'] + bets[bet_id, 'amount_right'] + bets[ bet_id, 'validation_deposit_left'] validation = bets[bet_id, 'validation_deposit_right'] elif player_right == decision[0][1]: winner_wallet = player_right loser_wallet = player_left amount = bets[bet_id, 'amount_left'] + bets[bet_id, 'amount_right'] + bets[ bet_id, 'validation_deposit_right'] validation = bets[bet_id, 'validation_deposit_left'] bets[winner_wallet, 'funds'] += amount bets[loser_wallet, 'funds'] += validation remove_game(bet_id) return True else: return False @export def change_settings(setting: str, new_value: Any): assert owner.get() == ctx.caller, 'You are not authorised to change settings' assert setting in settings['list'], "Not a configurable setting" settings[setting] = new_value def remove_game(bet_id: str): assert owner.get() == ctx.caller bets[bet_id, 'amount_left'] = None bets[bet_id, 'amount_right'] = None bets[bet_id, 'validation_deposit_left'] = None bets[bet_id, 'validation_deposit_right'] = None bets[bet_id, 'player_left'] = None bets[bet_id, 'player_right'] = None bets[bet_id, 'locked'] = None bets[bet_id, 'title'] = None bets[bet_id, 'deadline'] = None bets[bet_id, 'decision'] = None bats[bet_id, 'removal'] = None names = bet_names['names'] names.remove(bet_id) bet_names['names'] = names def assert_balance(balance: int): sender = ctx.caller sender_balance = currency.balance_of(sender) assert sender_balance >= balance, 'Bet amount exceeds available token balance, please note the validation fee'
constructor_args
{"initial_owner":"28bdfeef9675e0662f0cca9bdbeab212b25e06a0345a12f2e7d62d1c0c5cfb32"}
name
con_test_mk1

State Changes

Contract
con_test_mk1
Variable
owner
New Value
28bdfeef9675e0662f0cca9bdbeab212b25e06a0345a12f2e7d62d1c0c5cfb32
Contract
con_test_mk1
Variable
settings
Key
min_bet
New Value
15
Contract
con_test_mk1
Variable
settings
Key
validator_deposit_coefficient
New Value
0
Contract
con_test_mk1
Variable
settings
Key
validation_deadline
New Value
{"__delta__":[1,0]}
Contract
con_test_mk1
Variable
__code__
New Value
import currency __owner = Variable(contract='con_test_mk1', name='owner') __validators = Hash(contract='con_test_mk1', name='validators') __bets = Hash(contract='con_test_mk1', name='bets') __settings = Hash(contract='con_test_mk1', name='settings') __betNames = Hash(contract='con_test_mk1', name='betNames') def ____(initial_owner: str): __owner.set(initial_owner) __settings['min_bet'] = 15 __settings['validator_deposit_coefficient'] = decimal('0.5') __settings['validation_deadline'] = datetime.timedelta(days=1) __validators = [initial_owner] @__export('con_test_mk1') def redeem_funds(): sender = ctx.caller assert __bets[sender, 'funds'] is not None, 'You have no funds to redeem' funds = __bets[sender, 'funds'] assert funds > 0, 'You have no funds to redeem' __bets[sender, 'funds'] = 0 currency.transfer(amount=funds, to=sender) @__export('con_test_mk1') def transfer_ownership(new_owner: str): assert __owner.get() == ctx.caller, 'haha' __owner.set(new_owner) @__export('con_test_mk1') def assign_validator(validator: str, revoke: bool): assert __owner.get( ) == ctx.caller, 'Only the contract owner can assign a new validator' if revoke: __validators.remove(validator) if not revoke: __validators.append(validator) @__export('con_test_mk1') def create_bet(bet_id: str, amount: int, opposing_amount: int, title: str, deadline: datetime.datetime): sender = ctx.caller assert amount >= __settings['min_bet' ], 'Bet is not large enough, min_bet is ' + str(__settings['min_bet']) assert opposing_amount >= __settings['min_bet' ], 'Bet is not large enough, min_bet is ' + str(__settings['min_bet']) assert __bets[bet_id, 'amount_left'] is None, 'Game with ID ' + str(bet_id ) + ' already exists' assert deadline > now, 'Deadline cannot be in the past' validation_deposit_left = amount * __settings['validator_deposit_percent'] validation_deposit_right = opposing_amount * __settings[ 'validator_deposit_percent'] bet = amount + validation_deposit_left __assert_balance(bet) currency.transfer_from(amount=bet, to=ctx.this, main_account=sender) __bets[bet_id, 'amount_left'] = amount __bets[bet_id, 'amount_right'] = opposing_amount __bets[bet_id, 'validation_deposit_left'] = validation_deposit_left __bets[bet_id, 'validation_deposit_right'] = validation_deposit_right __bets[bet_id, 'player_left'] = sender __bets[bet_id, 'locked'] = False __bets[bet_id, 'title'] = title __bets[bet_id, 'deadline'] = deadline __bets[bet_id, 'decision'] = [] __bets[bet_id, 'removal'] = [] __bets[sender, 'funds'] = 0 if bet_names['names'] is not None: names = bet_names['names'] names.append(bet_id) bet_names['names'] = names else: bet_names['names'] = [bet_id] @__export('con_test_mk1') def join_bet(bet_id: str, amount: float): sender = ctx.caller assert __bets[bet_id, 'amount_left' ] is not None, bet_id + ' does not exist' assert not __bets[bet_id, 'locked'], 'This bet is full' assert __bets[bet_id, 'deadline' ] > now, 'The deadline for this contract has passed' bet = __bets[bet_id, 'amount_right'] + __bets[bet_id, 'validation_deposit_right'] assert amount == bet, 'Your deposit amount must be exactly the required bet and validation fee, this is ' + str( bet) __assert_balance(bet) currency.transfer_from(amount=bet, to=ctx.this, main_account=sender) __bets[bet_id, 'player_right'] = sender __bets[bet_id, 'locked'] = True __bets[sender, 'funds'] = 0 @__export('con_test_mk1') def validate(bet_id: str, winner: bool): sender = ctx.caller assert __bets[bet_id, 'amount_left'] is not None, 'Bet does not exist' assert sender in __validators, 'Only certified validators may validate disputed bets' assert __bets[bet_id, 'deadline'] + __settings[setting, 'validation_deadline'] < now, 'Not past deadline yet' decisions = __bets[bet_id, 'decision'] if winner: winner_wallet = __bets[bet_id, 'player_left'] loser_wallet = __bets[bet_id, 'player_right'] if len(decisions) == 1 and winner_wallet != decisions[0][0]: amount = __bets[bet_id, 'amount_left'] + __bets[bet_id, 'amount_right'] validator_fee = __bets[bet_id, 'validation_deposit_left'] __bets[bet_id, 'validation_deposit_right'] = 0 __bets[loser_wallet, 'funds'] += __bets[bet_id, 'validation_deposit_right'] else: amount = __bets[bet_id, 'amount_left'] + __bets[bet_id, 'amount_right'] + __bets[bet_id, 'validation_deposit_left'] validator_fee = __bets[bet_id, 'validation_deposit_right'] elif not winner: winner_wallet = __bets[bet_id, 'player_right'] loser_wallet = __bets[bet_id, 'player_left'] if len(decisions) == 1 and winner_wallet != decisions[0][0]: amount = __bets[bet_id, 'amount_left'] + __bets[bet_id, 'amount_right'] validator_fee = __bets[bet_id, 'validation_deposit_right'] __bets[bet_id, 'validation_deposit_left'] = 0 __bets[loser_wallet, 'funds'] += __bets[bet_id, 'validation_deposit_left'] else: amount = __bets[bet_id, 'amount_left'] + __bets[bet_id, 'amount_right'] + __bets[bet_id, 'validation_deposit_right'] validator_fee = __bets[bet_id, 'validation_deposit_left'] __bets[winner_wallet, 'funds'] += amount currency.transfer(amount=validator_fee, to=sender) __remove_game(bet_id) @__export('con_test_mk1') def remove_malicious_bet(bet_id: str): assert __owner.get() == ctx.caller, 'Only the owner can remove a bet' player_left = __bets[bet_id, 'player_left'] amount_left = __bets[bet_id, 'amount_left'] + __bets[bet_id, 'validation_deposit_left'] * decimal('0.9') __bets[player_left, 'funds'] += amount_left owner_fee = __bets[bet_id, 'validation_deposit_left'] * decimal('0.1') amount_right = 0 if __bets[bet_id, 'player_right'] is not None: player_right = __bets[bet_id, 'player_right'] amount_right = __bets[bet_id, 'amount_right'] + __bets[bet_id, 'validation_deposit_right'] * decimal('0.9') __bets[player_right, 'funds'] += amount_right owner_fee += __bets[bet_id, 'validation_deposit_right'] * decimal('0.1' ) currency.transfer(amount=owner_fee, to=ctx.caller) __remove_game(bet_id) @__export('con_test_mk1') def remove_amicable_bet(bet_id: str): sender = ctx.caller assert __bets[bet_id, 'amount_left'] is not None, 'Bet does not exist' assert __bets[bet_id, 'locked' ], 'Your bet has not been matched yet, you can call cancel_bet instead' assert sender == __bets[bet_id, 'player_left'] or sender == __bets[ bet_id, 'player_right'], 'You are not a part of this bet' assert sender not in __bets[bet_id, 'removal' ], 'You have already submitted a removal request, you must wait for your opponent' __bets[bet_id, 'removal'].append(sender) if len(__bets[bet_id, 'removal']) == 2: player_left = __bets[bet_id, 'player_left'] amount_left = __bets[bet_id, 'amount_left'] + __bets[bet_id, 'validation_deposit_left'] __bets[player_left, 'funds'] += amount_left player_right = __bets[bet_id, 'player_right'] amount_right = __bets[bet_id, 'amount_right'] + __bets[bet_id, 'validation_deposit_right'] __bets[player_right, 'funds'] += amount_right __remove_game(bet_id) @__export('con_test_mk1') def cancel_bet(bet_id: str): sender = ctx.caller assert __bets[bet_id, 'amount_left'] is not None, 'Bet does not exist' assert not __bets[bet_id, 'locked'], 'The game is locked' assert sender == __bets[bet_id, 'player_left'], 'You are not in the bet' assert __bets[bet_id, 'amount_left'] > 0 amount = __bets[bet_id, 'amount_left'] validation = __bets[bet_id, 'validation_deposit_left'] __bets[sender, 'funds'] += amount + validation __remove_game(bet_id) @__export('con_test_mk1') def determine_outcome(bet_id: str, outcome: bool): sender = ctx.caller assert __bets[bet_id, 'amount_left' ] is not None, bet_id + ' does not exist' assert deadline < now, 'The deadline has not passed yet' assert __bets[bet_id, 'locked' ], 'This bet was not matched, please remove the bet instead' assert sender == __bets[bet_id, 'player_left'] or sender == __bets[ bet_id, 'player_right'], 'You are not in this bet' decision = __bets[bet_id, 'decision'] if len(decision) == 1: assert sender != decision[0][0], 'You have already made a decision' elif len(decision) == 2: assert decision[0][1] == decision[1][1 ], 'This bet is disputed and must be resolved by a validator' if sender == __bets[bet_id, 'player_left']: player_left = sender player_right = __bets[bet_id, 'player_right'] if outcome: dec = player_left else: dec = player_right else: player_left = __bets[bet_id, 'player_left'] player_right = sender if outcome: dec = player_right else: dec = player_left decision.append([sender, dec]) if len(decision) == 2: assert __make_decision(bet_id, decision, player_left, player_right ), 'This bet is disputed and must be resolved by a validator' else: __bets[bet_id, 'decision'] = decision def __make_decision(bet_id, decision, player_left, player_right): if decision[0][1] == decision[1][1]: if player_left == decision[0][1]: winner_wallet = player_left loser_wallet = player_right amount = __bets[bet_id, 'amount_left'] + __bets[bet_id, 'amount_right'] + __bets[bet_id, 'validation_deposit_left'] validation = __bets[bet_id, 'validation_deposit_right'] elif player_right == decision[0][1]: winner_wallet = player_right loser_wallet = player_left amount = __bets[bet_id, 'amount_left'] + __bets[bet_id, 'amount_right'] + __bets[bet_id, 'validation_deposit_right'] validation = __bets[bet_id, 'validation_deposit_left'] __bets[winner_wallet, 'funds'] += amount __bets[loser_wallet, 'funds'] += validation __remove_game(bet_id) return True else: return False @__export('con_test_mk1') def change_settings(setting: str, new_value: Any): assert __owner.get( ) == ctx.caller, 'You are not authorised to change settings' assert setting in __settings['list'], 'Not a configurable setting' __settings[setting] = new_value def __remove_game(bet_id: str): assert __owner.get() == ctx.caller __bets[bet_id, 'amount_left'] = None __bets[bet_id, 'amount_right'] = None __bets[bet_id, 'validation_deposit_left'] = None __bets[bet_id, 'validation_deposit_right'] = None __bets[bet_id, 'player_left'] = None __bets[bet_id, 'player_right'] = None __bets[bet_id, 'locked'] = None __bets[bet_id, 'title'] = None __bets[bet_id, 'deadline'] = None __bets[bet_id, 'decision'] = None bats[bet_id, 'removal'] = None names = bet_names['names'] names.remove(bet_id) bet_names['names'] = names def __assert_balance(balance: int): sender = ctx.caller sender_balance = currency.balance_of(sender) assert sender_balance >= balance, 'Bet amount exceeds available token balance, please note the validation fee'
Contract
con_test_mk1
Variable
__compiled__
New Value
{"__bytes__":"e30000000000000000000000000700000040000000737a010000640064016c005a0065016402640364048d025a0265036402640564048d025a0465036402640664048d025a0565036402640764048d025a0665036402640864048d025a07650864099c01640a640b84045a09650a64028301640c640d840083015a0b650a640283016508640e9c01640f6410840483015a0c650a640283016508650d64119c0264126413840483015a0e650a640283016508650f650f650865106a1064149c0564156416840483015a11650a640283016508651264179c0264186419840483015a13650a640283016508650d641a9c02641b641c840483015a14650a640283016508641d9c01641e641f840483015a15650a640283016508641d9c0164206421840483015a16650a640283016508641d9c0164226423840483015a17650a640283016508650d64249c0264256426840483015a186427642884005a19650a640283016508651a64299c02642a642b840483015a1b6508641d9c01642c642d84045a1c650f642e9c01642f643084045a1d640153002931e9000000004eda0c636f6e5f746573745f6d6b31da056f776e65722902da08636f6e7472616374da046e616d65da0a76616c696461746f7273da0462657473da0873657474696e6773da086265744e616d65732901da0d696e697469616c5f6f776e6572630100000000000000020000000300000043000000733800000074006a017c00830101006401740264023c00740364038301740264043c0074046a05640564068d01740264073c007c0067017d016400530029084ee90f000000da076d696e5f6265747a03302e35da1d76616c696461746f725f6465706f7369745f636f656666696369656e74e9010000002901da0464617973da1376616c69646174696f6e5f646561646c696e652906da075f5f6f776e6572da03736574da0a5f5f73657474696e6773da07646563696d616cda086461746574696d65da0974696d6564656c74612902720a000000da0c5f5f76616c696461746f7273a9007218000000da00da045f5f5f5f09000000730a00000000010a0108010c011001721a000000630000000000000000020000000400000043000000735800000074006a017d0074027c0064016602190064006b09731e740364028301820174027c006401660219007d017c0164036b04733a7403640283018201640374027c00640166023c0074046a057c017c0064048d0201006400530029054eda0566756e64737a1b596f752068617665206e6f2066756e647320746f2072656465656d72010000002902da06616d6f756e74da02746f2906da03637478da0663616c6c6572da065f5f62657473da0e417373657274696f6e4572726f72da0863757272656e6379da087472616e736665722902da0673656e646572721b000000721800000072180000007219000000da0c72656465656d5f66756e647311000000730c0000000002060118010c0110010c0172250000002901da096e65775f6f776e6572630100000000000000010000000200000043000000732400000074006a01830074026a036b027316740464018301820174006a057c00830101006400530029024eda046861686129067211000000da03676574721e000000721f0000007221000000721200000029017226000000721800000072180000007219000000da127472616e736665725f6f776e6572736869701b00000073040000000002160172290000002902da0976616c696461746f72da067265766f6b65630200000000000000020000000200000043000000733600000074006a01830074026a036b02731674046401830182017c01722474056a067c00830101007c01733274056a077c00830101006400530029024e7a324f6e6c792074686520636f6e7472616374206f776e65722063616e2061737369676e2061206e65772076616c696461746f72290872110000007228000000721e000000721f00000072210000007217000000da0672656d6f7665da06617070656e642902722a000000722b000000721800000072180000007219000000da1061737369676e5f76616c696461746f7221000000730c00000000020601100104010a010401722e0000002905da066265745f6964721c000000da0f6f70706f73696e675f616d6f756e74da057469746c65da08646561646c696e656305000000000000000a0000000500000043000000737001000074006a017d057c017402640119006b05732674036402740474026401190083011700830182017c027402640119006b057346740364027404740264011900830117008301820174057c0064036602190064006b08736a7403640474047c008301170064051700830182017c0474066b04737a74036406830182017c0174026407190014007d067c0274026407190014007d077c017c0617007d0874077c088301010074086a097c0874006a0a7c0564088d0301007c0174057c00640366023c007c0274057c00640966023c007c0674057c00640a66023c007c0774057c00640b66023c007c0574057c00640c66023c00640d74057c00640e66023c007c0374057c00640f66023c007c0474057c00641066023c00670074057c00641166023c00670074057c00641266023c00641374057c05641466023c00740b6415190064006b0990017262740b641519007d097c096a0c7c00830101007c09740b64153c006e0a7c006701740b64153c006400530029164e720c0000007a24426574206973206e6f74206c6172676520656e6f7567682c206d696e5f62657420697320da0b616d6f756e745f6c6566747a0d47616d652077697468204944207a0f20616c7265616479206578697374737a1e446561646c696e652063616e6e6f7420626520696e207468652070617374da1976616c696461746f725f6465706f7369745f70657263656e742903721c000000721d000000da0c6d61696e5f6163636f756e74da0c616d6f756e745f7269676874da1776616c69646174696f6e5f6465706f7369745f6c656674da1876616c69646174696f6e5f6465706f7369745f7269676874da0b706c617965725f6c65667446da066c6f636b656472310000007232000000da086465636973696f6eda0772656d6f76616c7201000000721b000000da056e616d6573290d721e000000721f00000072130000007221000000da037374727220000000da036e6f77da105f5f6173736572745f62616c616e63657222000000da0d7472616e736665725f66726f6dda0474686973da096265745f6e616d6573722d000000290a722f000000721c000000723000000072310000007232000000722400000072370000007238000000da03626574723d000000721800000072180000007219000000da0a6372656174655f6265742b000000733c000000000306010e0112010e0112011201120110010c01040108010801080112010c010c010c010c010c010c010c010c010c010c010c010e0108010a010a0272450000002902722f000000721c00000063020000000000000004000000050000004300000073c200000074006a017d0274027c0064016602190064006b09732274037c00640217008301820174027c006403660219000c007338740364048301820174027c0064056602190074046b047350740364068301820174027c0064076602190074027c0064086602190017007d037c017c036b0273807403640974057c03830117008301820174067c038301010074076a087c0374006a097c02640a8d0301007c0274027c00640b66023c00640c74027c00640366023c00640d74027c02640e66023c0064005300290f4e72330000007a0f20646f6573206e6f74206578697374723a0000007a1054686973206265742069732066756c6c72320000007a2954686520646561646c696e6520666f72207468697320636f6e74726163742068617320706173736564723600000072380000007a51596f7572206465706f73697420616d6f756e74206d7573742062652065786163746c79207468652072657175697265642062657420616e642076616c69646174696f6e206665652c2074686973206973202903721c000000721d0000007235000000da0c706c617965725f7269676874547201000000721b000000290a721e000000721f00000072200000007221000000723f000000723e00000072400000007222000000724100000072420000002904722f000000721c00000072240000007244000000721800000072180000007219000000da086a6f696e5f6265744f000000731e000000000206010a01120116010a010e010e010a010e010a01080112010c010c0172470000002902722f000000da0677696e6e6572630200000000000000080000000600000043000000730202000074006a017d0274027c0064016602190064006b09731e74036402830182017c0274046b06732e740364038301820174027c0064046602190074057406640566021900170074076b007352740364068301820174027c006407660219007d037c019001721874027c006408660219007d0474027c006409660219007d0574087c038301640a6b0272e67c047c03640b1900640b19006b0372e674027c0064016602190074027c00640c6602190017007d0674027c00640d660219007d07640b74027c00640e66023c0074027c05640f66020500190074027c00640e66021900370003003c006e3074027c0064016602190074027c00640c66021900170074027c00640d6602190017007d0674027c00640e660219007d076ebc7c01900173d474027c006409660219007d0474027c006408660219007d0574087c038301640a6b02900172a47c047c03640b1900640b19006b03900172a474027c0064016602190074027c00640c6602190017007d0674027c00640e660219007d07640b74027c00640d66023c0074027c05640f66020500190074027c00640d66021900370003003c006e3074027c0064016602190074027c00640c66021900170074027c00640e6602190017007d0674027c00640d660219007d0774027c04640f6602050019007c06370003003c0074096a0a7c077c0264108d020100740b7c00830101006400530029114e72330000007a1242657420646f6573206e6f742065786973747a344f6e6c79206365727469666965642076616c696461746f7273206d61792076616c69646174652064697370757465642062657473723200000072100000007a154e6f74207061737420646561646c696e6520796574723b00000072390000007246000000720e0000007201000000723600000072370000007238000000721b0000002902721c000000721d000000290c721e000000721f0000007220000000722100000072170000007213000000da0773657474696e67723f000000da036c656e72220000007223000000da0d5f5f72656d6f76655f67616d652908722f00000072480000007224000000da096465636973696f6e73da0d77696e6e65725f77616c6c6574da0c6c6f7365725f77616c6c6574721c000000da0d76616c696461746f725f666565721800000072180000007219000000da0876616c696461746562000000734200000000020601180110010e0116010c0106010c010c011c010e010a010c010c0110010e0324010e0106010c010c0120010e010a010c010c0110010e0324010c0114010e0172500000002901722f00000063010000000000000006000000040000004300000073f200000074006a01830074026a036b027316740464018301820174057c006402660219007d0174057c0064036602190074057c00640466021900740664058301140017007d0274057c0164066602050019007c02370003003c0074057c0064046602190074066407830114007d0364087d0474057c0064096602190064006b0972d674057c006409660219007d0574057c00640a6602190074057c00640b66021900740664058301140017007d0474057c0564066602050019007c04370003003c007c0374057c00640b66021900740664078301140037007d0374076a087c0374026a03640c8d02010074097c008301010064005300290d4e7a1f4f6e6c7920746865206f776e65722063616e2072656d6f76652061206265747239000000723300000072370000007a03302e39721b0000007a03302e3172010000007246000000723600000072380000002902721c000000721d000000290a72110000007228000000721e000000721f00000072210000007220000000721400000072220000007223000000724b0000002906722f00000072390000007233000000da096f776e65725f66656572360000007246000000721800000072180000007219000000da1472656d6f76655f6d616c6963696f75735f6265748b000000731e000000000216010c010e01120114011401040110010c010e0112011401180210017252000000630100000000000000060000000400000043000000731601000074006a017d0174027c0064016602190064006b09731e740364028301820174027c00640366021900733274036404830182017c0174027c006405660219006b02735a7c0174027c006406660219006b02735a74036407830182017c0174027c006408660219006b077372740364098301820174027c006408660219006a047c0183010100740574027c006408660219008301640a6b029001721274027c006405660219007d0274027c0064016602190074027c00640b6602190017007d0374027c02640c6602050019007c03370003003c0074027c006406660219007d0474027c00640d6602190074027c00640e6602190017007d0574027c04640c6602050019007c05370003003c0074067c008301010064005300290f4e72330000007a1242657420646f6573206e6f74206578697374723a0000007a42596f75722062657420686173206e6f74206265656e206d617463686564207965742c20796f752063616e2063616c6c2063616e63656c5f62657420696e7374656164723900000072460000007a1e596f7520617265206e6f7420612070617274206f66207468697320626574723c0000007a4d596f75206861766520616c7265616479207375626d697474656420612072656d6f76616c20726571756573742c20796f75206d757374207761697420666f7220796f7572206f70706f6e656e74e9020000007237000000721b000000723600000072380000002907721e000000721f00000072200000007221000000722d000000724a000000724b0000002906722f00000072240000007239000000723300000072460000007236000000721800000072180000007219000000da1372656d6f76655f616d696361626c655f6265749f00000073260000000002060118010e0106011401140112010601120116010c010e010a0114010c010e010a0114017254000000630100000000000000040000000500000043000000739c00000074006a017d0174027c0064016602190064006b09731e740364028301820174027c006403660219000c00733474036404830182017c0174027c006405660219006b02734c740364068301820174027c0064016602190064076b0473607403820174027c006401660219007d0274027c006408660219007d0374027c0164096602050019007c027c031700370003003c0074047c008301010064005300290a4e72330000007a1242657420646f6573206e6f74206578697374723a0000007a125468652067616d65206973206c6f636b656472390000007a16596f7520617265206e6f7420696e207468652062657472010000007237000000721b0000002905721e000000721f00000072200000007221000000724b0000002904722f0000007224000000721c000000da0a76616c69646174696f6e721800000072180000007219000000da0a63616e63656c5f626574b600000073120000000002060118011601180114010c010c01180172560000002902722f000000da076f7574636f6d65630200000000000000070000000500000043000000736201000074006a017d0274027c0064016602190064006b09732274037c006402170083018201740474056b007332740364038301820174027c00640466021900734674036405830182017c0274027c006406660219006b02736e7c0274027c006407660219006b02736e740364088301820174027c006409660219007d0374067c038301640a6b0272a07c027c03640b1900640b19006b0373cc7403640c830182016e2c74067c038301640d6b0272cc7c03640b1900640a19007c03640a1900640a19006b0273cc7403640e830182017c0274027c006406660219006b0272fc7c027d0474027c006407660219007d057c0172f67c047d066e047c057d066e2074027c006406660219007d047c027d057c01900172187c057d066e047c047d067c036a077c027c0667028301010074067c038301640d6b029001725274087c007c037c047c0583049001735e7403640e830182016e0c7c0374027c00640966023c0064005300290f4e72330000007a0f20646f6573206e6f742065786973747a1f54686520646561646c696e6520686173206e6f742070617373656420796574723a0000007a37546869732062657420776173206e6f74206d6174636865642c20706c656173652072656d6f7665207468652062657420696e7374656164723900000072460000007a17596f7520617265206e6f7420696e207468697320626574723b000000720e00000072010000007a20596f75206861766520616c7265616479206d6164652061206465636973696f6e72530000007a38546869732062657420697320646973707574656420616e64206d757374206265207265736f6c76656420627920612076616c696461746f722909721e000000721f000000722000000072210000007232000000723f000000724a000000722d000000da0f5f5f6d616b655f6465636973696f6e2907722f00000072570000007224000000723b00000072390000007246000000da03646563721800000072180000007219000000da1164657465726d696e655f6f7574636f6d65c3000000733c000000000206010a01120110010e010601140114010c010c011a010c011a010601100104010c010401060206020c0104010601060204010e010e0112010802725a00000063040000000000000008000000040000004300000073e60000007c0164011900640219007c0164021900640219006b0272de7c027c0164011900640219006b0272627c027d047c037d0574007c0064036602190074007c00640466021900170074007c0064056602190017007d0674007c006406660219007d076e487c037c0164011900640219006b0272aa7c037d047c027d0574007c0064036602190074007c00640466021900170074007c0064066602190017007d0674007c006405660219007d0774007c0464076602050019007c06370003003c0074007c0564076602050019007c07370003003c0074017c0083010100640853006409530064005300290a4e7201000000720e0000007233000000723600000072370000007238000000721b000000544629027220000000724b0000002908722f000000723b00000072390000007246000000724d000000724e000000721c00000072550000007218000000721800000072190000007258000000e900000073200000000001180110010401040224010e0110010401040224010c011401140108010402725800000029027249000000da096e65775f76616c7565630200000000000000020000000300000043000000733600000074006a01830074026a036b02731674046401830182017c007405640219006b06732a74046403830182017c0174057c003c006400530029044e7a29596f7520617265206e6f7420617574686f726973656420746f206368616e67652073657474696e6773da046c6973747a1a4e6f74206120636f6e666967757261626c652073657474696e67290672110000007228000000721e000000721f0000007221000000721300000029027249000000725b000000721800000072180000007219000000da0f6368616e67655f73657474696e6773ff00000073080000000002060110011401725d00000063010000000000000002000000040000004300000073b400000074006a01830074026a036b02731274048201640074057c00640166023c00640074057c00640266023c00640074057c00640366023c00640074057c00640466023c00640074057c00640566023c00640074057c00640666023c00640074057c00640766023c00640074057c00640866023c00640074057c00640966023c00640074057c00640a66023c00640074067c00640b66023c007407640c19007d017c016a087c00830101007c017407640c3c0064005300290d4e723300000072360000007237000000723800000072390000007246000000723a00000072310000007232000000723b000000723c000000723d000000290972110000007228000000721e000000721f00000072210000007220000000da04626174737243000000722c0000002902722f000000723d000000721800000072180000007219000000724b00000007010000731e000000000112010c010c010c010c010c010c010c010c010c010c010c0108010a01724b0000002901da0762616c616e6365630100000000000000030000000200000043000000732400000074006a017d0174026a037c0183017d027c027c006b05732074046401830182016400530029024e7a4a42657420616d6f756e74206578636565647320617661696c61626c6520746f6b656e2062616c616e63652c20706c65617365206e6f7465207468652076616c69646174696f6e206665652905721e000000721f0000007222000000da0a62616c616e63655f6f6672210000002903725f0000007224000000da0e73656e6465725f62616c616e63657218000000721800000072190000007240000000190100007306000000000106010a017240000000291e7222000000da085661726961626c657211000000da0448617368721700000072200000007213000000da0a5f5f6265744e616d6573723e000000721a000000da085f5f6578706f727472250000007229000000da04626f6f6c722e000000da03696e7472150000007245000000da05666c6f617472470000007250000000725200000072540000007256000000725a0000007258000000da03416e79725d000000724b00000072400000007218000000721800000072180000007219000000da083c6d6f64756c653e01000000733e00000008010c010c010c010c010c030e08100a0601100506011209060108011222060112120601122806011013060110160601100c060112250816060112070e12"}
Contract
con_test_mk1
Variable
__owner__
New Value
NULL
Contract
con_test_mk1
Variable
__submitted__
New Value
{"__time__":[2020,12,13,22,6,26,0]}
Contract
con_test_mk1
Variable
__developer__
New Value
28bdfeef9675e0662f0cca9bdbeab212b25e06a0345a12f2e7d62d1c0c5cfb32
Contract
currency
Variable
balances
New Value
534