["0xe1288759446298f250c3bce5616706d25525ba7f"]{"sourcecode": "\ndef function_proposal(info, args):\n    assert args['f'] == 'function_proposal'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n    fname = args['a'][0]\n    assert set(fname) <= set(string.ascii_lowercase+'_')\n    sourcecode = args['a'][1]\n\n    require = args['a'][2]\n    for i in require:\n        assert type(i) is list\n        assert set(i[0]) <= set(string.ascii_lowercase+'_')\n        assert type(i[1]) is list\n        for j in i[1]:\n            assert set(j) <= set(string.ascii_uppercase+'_')\n\n    asset_permission = args['a'][3]\n    assert type(asset_permission) is list\n    for i in asset_permission:\n        assert i == '*' or set(i) <= set(string.ascii_lowercase+'_')\n\n    invoke_permission = args['a'][4]\n    assert type(invoke_permission) is list\n    for i in invoke_permission:\n        assert i == '*' or set(i) <= set(string.ascii_lowercase+'_')\n\n    hexdigest = hashlib.sha256(sourcecode.encode('utf8')).hexdigest()\n    k = 'function-proposal-%s:%s' % (fname, hexdigest)\n    put(addr, 'function', 'proposal', {'sourcecode': sourcecode, 'asset_permission': asset_permission, 'require': require, 'votes': []}, '%s:%s' % (fname, hexdigest))\n", "asset_permission": [], "require": [], "votes": []}{"sourcecode": "\ndef function_proposal(info, args):\n    assert args['f'] == 'function_proposal'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n    fname = args['a'][0]\n    assert set(fname) <= set(string.ascii_lowercase+'_')\n    sourcecode = args['a'][1]\n\n    require = args['a'][2]\n    for i in require:\n        assert type(i) is list\n        assert set(i[0]) <= set(string.ascii_lowercase+'_')\n        assert type(i[1]) is list\n        for j in i[1]:\n            assert set(j) <= set(string.ascii_uppercase+'_')\n\n    asset_permission = args['a'][3]\n    assert type(asset_permission) is list\n    for i in asset_permission:\n        assert i == '*' or set(i) <= set(string.ascii_lowercase+'_')\n\n    invoke_permission = args['a'][4]\n    assert type(invoke_permission) is list\n    for i in invoke_permission:\n        assert i == '*' or set(i) <= set(string.ascii_lowercase+'_')\n\n    hexdigest = hashlib.sha256(sourcecode.encode('utf8')).hexdigest()\n    k = 'function-proposal-%s:%s' % (fname, hexdigest)\n    put(addr, 'function', 'proposal', {'sourcecode': sourcecode, 'asset_permission': asset_permission, 'require': require, 'votes': []}, '%s:%s' % (fname, hexdigest))\n", "asset_permission": [], "require": [], "votes": ["0xe1288759446298f250c3bce5616706d25525ba7f"]}{"votes": [], "require": [], "asset_permission": [], "sourcecode": "\ndef function_vote(info, args):\n    assert args['f'] == 'function_vote'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n    committee_members = set(get('committee', 'members', []))\n    assert addr in committee_members\n\n    fname = args['a'][0]\n    sourcecode_hexdigest = args['a'][1]\n    proposal = get('function', 'proposal', None, '%s:%s' % (fname, sourcecode_hexdigest))\n    votes = set(proposal['votes'])\n    votes.add(addr)\n    proposal['votes'] = list(votes)\n\n    if len(votes) >= len(committee_members)*2//3:\n        put(addr, 'function', 'code', proposal, fname)\n    else:\n        put(addr, 'function', 'proposal', proposal, '%s:%s' % (fname, sourcecode_hexdigest))\n"}{"votes": ["0xe1288759446298f250c3bce5616706d25525ba7f"], "require": [], "asset_permission": [], "sourcecode": "\ndef function_vote(info, args):\n    assert args['f'] == 'function_vote'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n    committee_members = set(get('committee', 'members', []))\n    assert addr in committee_members\n\n    fname = args['a'][0]\n    sourcecode_hexdigest = args['a'][1]\n    proposal = get('function', 'proposal', None, '%s:%s' % (fname, sourcecode_hexdigest))\n    votes = set(proposal['votes'])\n    votes.add(addr)\n    proposal['votes'] = list(votes)\n\n    if len(votes) >= len(committee_members)*2//3:\n        put(addr, 'function', 'code', proposal, fname)\n    else:\n        put(addr, 'function', 'proposal', proposal, '%s:%s' % (fname, sourcecode_hexdigest))\n"}{"votes": [], "require": [], "asset_permission": [], "sourcecode": "\ndef committee_add_member(info, args):\n    assert args['f'] == 'committee_add_member'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    committee_members = set(get('committee', 'members', []))\n    assert handle in committee_members\n\n    user = args['a'][0]\n    votes = set(get('committee', 'proposal', [], user))\n    votes.add(handle)\n\n    if len(votes) >= len(committee_members)*2//3:\n        committee_members.add(user)\n        put(handle, 'committee', 'members', list(committee_members))\n    else:\n        put(handle, 'committee', 'proposal', list(votes), user)\n"}{"votes": ["0xe1288759446298f250c3bce5616706d25525ba7f"], "require": [], "asset_permission": [], "sourcecode": "\ndef committee_add_member(info, args):\n    assert args['f'] == 'committee_add_member'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    committee_members = set(get('committee', 'members', []))\n    assert handle in committee_members\n\n    user = args['a'][0]\n    votes = set(get('committee', 'proposal', [], user))\n    votes.add(handle)\n\n    if len(votes) >= len(committee_members)*2//3:\n        committee_members.add(user)\n        put(handle, 'committee', 'members', list(committee_members))\n    else:\n        put(handle, 'committee', 'proposal', list(votes), user)\n"}{"votes": [], "require": [], "asset_permission": [], "sourcecode": "\ndef committee_remove_member(info, args):\n    assert args['f'] == 'committee_remove_member'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    committee_members = set(get('committee', 'members', []))\n    assert handle in committee_members\n\n    user = args['a'][0]\n    votes = set(get('committee', 'proposal', [], user))\n    votes.add(handle)\n\n    if len(votes) >= len(committee_members)*2//3:\n        committee_members.remove(user)\n        put(handle, 'committee', 'members', list(committee_members))\n    else:\n        put(handle, 'committee', 'proposal', list(votes), user)\n"}{"votes": ["0xe1288759446298f250c3bce5616706d25525ba7f"], "require": [], "asset_permission": [], "sourcecode": "\ndef committee_remove_member(info, args):\n    assert args['f'] == 'committee_remove_member'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    committee_members = set(get('committee', 'members', []))\n    assert handle in committee_members\n\n    user = args['a'][0]\n    votes = set(get('committee', 'proposal', [], user))\n    votes.add(handle)\n\n    if len(votes) >= len(committee_members)*2//3:\n        committee_members.remove(user)\n        put(handle, 'committee', 'members', list(committee_members))\n    else:\n        put(handle, 'committee', 'proposal', list(votes), user)\n"}{"votes": [], "require": [], "asset_permission": [], "sourcecode": "def asset_create(info, args):\n    assert args['f'] == 'asset_create'\n    sender = info['sender']\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    handle = handle_lookup(sender)\n    addr = handle or sender\n    print('handle', handle, 'addr', addr, 'sender', sender)\n    owner = get('asset', 'owner', None, tick)\n    print(owner, addr)\n    assert not owner\n\n    put(addr, 'asset', 'owner', addr, tick)\n    put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n"}{"votes": ["0xe1288759446298f250c3bce5616706d25525ba7f"], "require": [], "asset_permission": [], "sourcecode": "def asset_create(info, args):\n    assert args['f'] == 'asset_create'\n    sender = info['sender']\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    handle = handle_lookup(sender)\n    addr = handle or sender\n    print('handle', handle, 'addr', addr, 'sender', sender)\n    owner = get('asset', 'owner', None, tick)\n    print(owner, addr)\n    assert not owner\n\n    put(addr, 'asset', 'owner', addr, tick)\n    put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n"}{"votes": [], "require": [], "asset_permission": [], "sourcecode": "def asset_update_functions(info, args):\n    assert args['f'] == 'asset_update_functions'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    print('handle', handle)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    functions = args['a'][1]\n    assert type(functions) is list\n    assert functions\n"}{"votes": ["0xe1288759446298f250c3bce5616706d25525ba7f"], "require": [], "asset_permission": [], "sourcecode": "def asset_update_functions(info, args):\n    assert args['f'] == 'asset_update_functions'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    print('handle', handle)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    functions = args['a'][1]\n    assert type(functions) is list\n    assert functions\n"}{"votes": [], "require": [], "asset_permission": [], "sourcecode": "def asset_update_ownership(info, args):\n    assert args['f'] == 'asset_update_ownership'\n    sender = info['sender']\n    tick = args['a'][0]\n    receiver = args['a'][1]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    print('sender', sender)\n    handle = handle_lookup(sender)\n    print('handle', handle)\n    addr = handle or sender\n\n    owner = get('asset', 'owner', None, tick)\n    print( owner, addr)\n    assert owner == addr\n    functions = get('asset', 'functions', None, tick)\n    assert type(functions) is list\n    assert functions\n    put(receiver, 'asset', 'owner', receiver, tick)\n    put(receiver, 'asset', 'functions', functions, tick)\n"}{"votes": ["0xe1288759446298f250c3bce5616706d25525ba7f"], "require": [], "asset_permission": [], "sourcecode": "def asset_update_ownership(info, args):\n    assert args['f'] == 'asset_update_ownership'\n    sender = info['sender']\n    tick = args['a'][0]\n    receiver = args['a'][1]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    print('sender', sender)\n    handle = handle_lookup(sender)\n    print('handle', handle)\n    addr = handle or sender\n\n    owner = get('asset', 'owner', None, tick)\n    print( owner, addr)\n    assert owner == addr\n    functions = get('asset', 'functions', None, tick)\n    assert type(functions) is list\n    assert functions\n    put(receiver, 'asset', 'owner', receiver, tick)\n    put(receiver, 'asset', 'functions', functions, tick)\n"}{"votes": [], "require": [], "asset_permission": [], "sourcecode": "def token_create(info, args):\n    assert args['f'] == 'token_create'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    name = args['a'][1]\n    assert type(name) is str\n    decimal = int(args['a'][2])\n    assert type(decimal) is int\n    assert decimal >= 0 and decimal <= 18\n\n    functions = ['transfer', 'approve', 'transfer_from', 'token_mint_once', 'asset_update_ownership', 'asset_update_functions']\n    if len(args['a']) == 4:\n        functions = args['a'][3]\n        assert type(functions) is list\n\n    put(addr, tick, 'name', name)\n    put(addr, tick, 'decimal', decimal)\n    put(addr, 'asset', 'functions', functions, tick)\n"}{"votes": ["0xe1288759446298f250c3bce5616706d25525ba7f"], "require": [], "asset_permission": [], "sourcecode": "def token_create(info, args):\n    assert args['f'] == 'token_create'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    name = args['a'][1]\n    assert type(name) is str\n    decimal = int(args['a'][2])\n    assert type(decimal) is int\n    assert decimal >= 0 and decimal <= 18\n\n    functions = ['transfer', 'approve', 'transfer_from', 'token_mint_once', 'asset_update_ownership', 'asset_update_functions']\n    if len(args['a']) == 4:\n        functions = args['a'][3]\n        assert type(functions) is list\n\n    put(addr, tick, 'name', name)\n    put(addr, tick, 'decimal', decimal)\n    put(addr, 'asset', 'functions', functions, tick)\n"}{"votes": [], "require": [], "asset_permission": [], "sourcecode": "def token_mint_once(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    value = int(args['a'][1])\n    assert value > 0\n\n    assert args['f'] == 'token_mint_once'\n    assert args['f'] in get('asset', 'functions', [], tick)\n\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n\n    total = value\n    assert get(tick, 'total', None) is None\n    put(addr, tick, 'total', total)\n\n    balance = get(tick, 'balance', 0, addr)\n    balance += value\n    put(addr, tick, 'balance', balance, addr)\n"}{"votes": ["0xe1288759446298f250c3bce5616706d25525ba7f"], "require": [], "asset_permission": [], "sourcecode": "def token_mint_once(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    value = int(args['a'][1])\n    assert value > 0\n\n    assert args['f'] == 'token_mint_once'\n    assert args['f'] in get('asset', 'functions', [], tick)\n\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n\n    total = value\n    assert get(tick, 'total', None) is None\n    put(addr, tick, 'total', total)\n\n    balance = get(tick, 'balance', 0, addr)\n    balance += value\n    put(addr, tick, 'balance', balance, addr)\n"}{"votes": [], "require": [], "asset_permission": [], "sourcecode": "def token_mint(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'token_mint'\n    assert args['f'] in get('asset', 'functions', [], tick)\n\n    value = int(args['a'][1])\n    assert value > 0\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n    # TODO: check addr is the asset owner\n\n    balance = get(tick, 'balance', 0, addr)\n    balance += value\n    total = get(tick, 'total', 0, addr)\n    total += value\n\n    put(addr, tick, 'balance', balance, addr)\n    put(addr, tick, 'total', total)\n"}{"votes": ["0xe1288759446298f250c3bce5616706d25525ba7f"], "require": [], "asset_permission": [], "sourcecode": "def token_mint(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'token_mint'\n    # assert args['f'] in get('asset', 'functions', [], tick)\n\n    value = int(args['a'][1])\n    assert value > 0\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n    # TODO: check addr is the asset owner\n\n    balance = get(tick, 'balance', 0, addr)\n    balance += value\n    total = get(tick, 'total', 0, addr)\n    total += value\n\n    put(addr, tick, 'balance', balance, addr)\n    put(addr, tick, 'total', total)\n"}{"votes": [], "require": [], "asset_permission": [], "sourcecode": "def token_burn(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'token_burn'\n    assert args['f'] in get('asset', 'functions', [], tick)\n\n    value = int(args['a'][1])\n    assert value > 0\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n\n    balance = get(tick, 'balance', 0, addr)\n    balance -= value\n    assert balance >= 0\n    \n    total = get(tick, 'total', 0, addr)\n    total -= value\n    assert total >= 0\n\n    put(addr, tick, 'balance', balance, addr)\n    put(addr, tick, 'total', total)\n"}{"votes": ["0xe1288759446298f250c3bce5616706d25525ba7f"], "require": [], "asset_permission": [], "sourcecode": "def token_burn(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'token_burn'\n    assert args['f'] in get('asset', 'functions', [], tick)\n\n    value = int(args['a'][1])\n    assert value > 0\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n\n    balance = get(tick, 'balance', 0, addr)\n    balance -= value\n    assert balance >= 0\n    \n    total = get(tick, 'total', 0, addr)\n    total -= value\n    assert total >= 0\n\n    put(addr, tick, 'balance', balance, addr)\n    put(addr, tick, 'total', total)\n"}{"votes": [], "require": [], "asset_permission": [], "sourcecode": "def transfer(info, args):\n    tick = args['a'][0]\n    assert set(tick) <= set(string.ascii_uppercase+'_')\n\n    assert args['f'] == 'transfer'\n    assert args['f'] in get('asset', 'functions', [], tick)\n\n    receiver = args['a'][1].lower()\n    assert len(receiver) <= 42\n    assert type(receiver) is str\n    if len(receiver) == 42:\n        assert receiver.startswith('0x')\n        assert set(receiver[2:]) <= set(string.digits+'abcdef')\n    else:\n        assert len(receiver) > 4\n\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n\n    value = int(args['a'][2])\n    assert value > 0\n\n    sender_balance = get(tick, 'balance', 0, addr)\n    assert sender_balance >= value\n    sender_balance -= value\n    put(addr, tick, 'balance', sender_balance, addr)\n    receiver_balance = get(tick, 'balance', 0, receiver)\n    receiver_balance += value\n    put(receiver, tick, 'balance', receiver_balance, receiver)\n"}{"votes": ["0xe1288759446298f250c3bce5616706d25525ba7f"], "require": [], "asset_permission": [], "sourcecode": "def transfer(info, args):\n    tick = args['a'][0]\n    assert set(tick) <= set(string.ascii_uppercase+'_')\n\n    assert args['f'] == 'transfer'\n    assert args['f'] in get('asset', 'functions', [], tick)\n\n    receiver = args['a'][1].lower()\n    assert len(receiver) <= 42\n    assert type(receiver) is str\n    if len(receiver) == 42:\n        assert receiver.startswith('0x')\n        assert set(receiver[2:]) <= set(string.digits+'abcdef')\n    else:\n        assert len(receiver) > 4\n\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n\n    value = int(args['a'][2])\n    assert value > 0\n\n    sender_balance = get(tick, 'balance', 0, addr)\n    assert sender_balance >= value\n    sender_balance -= value\n    put(addr, tick, 'balance', sender_balance, addr)\n    receiver_balance = get(tick, 'balance', 0, receiver)\n    receiver_balance += value\n    put(receiver, tick, 'balance', receiver_balance, receiver)\n"}{"votes": [], "require": [], "asset_permission": [], "sourcecode": "\ndef trade_limit_order(info, args):\n    assert args['f'] == 'trade_limit_order'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n    print('trade_limit_order addr', addr, 'handle', handle, 'sender', sender)\n\n    base_tick = args['a'][0]\n    quote_tick = args['a'][2]\n    assert set(base_tick) <= set(string.ascii_uppercase+'_')\n    assert set(quote_tick) <= set(string.ascii_uppercase+'_')\n    # TODO: make sure quote_tick is set\n\n    pair = '%s_%s' % tuple([base_tick, quote_tick])\n    # TODO: check if pair exists\n\n    base_value = int(args['a'][1])\n    quote_value = int(args['a'][3])\n    assert base_value * quote_value < 0\n    K = 10**18\n\n    trade_buy_start = get('trade', f'{pair}_buy_start', 1) # from maximum\n    trade_buy_new = get('trade', f'{pair}_buy_new', 1)\n    trade_sell_start = get('trade', f'{pair}_sell_start', 1) # from minimum\n    trade_sell_new = get('trade', f'{pair}_sell_new', 1)\n\n    # SORT AND INSERT\n    if base_value < 0 and quote_value > 0: # sell token get USDC\n        balance = get(base_tick, 'balance', 0, addr)\n        # print('base_tick balance', balance, addr, base_tick)\n        balance += base_value\n        assert balance >= 0\n        put(addr, base_tick, 'balance', balance, addr)\n\n        trade_sell_no = trade_sell_start\n        while True:\n            sell = get('trade', f'{pair}_sell', None, str(trade_sell_no))\n            price = - quote_value * K // base_value\n\n            # the first order\n            if sell is None:\n                put(addr, 'trade', f'{pair}_sell', [addr, base_value, quote_value, price, None, None], str(trade_sell_new))\n                trade_sell_new += 1\n                put(addr, 'trade', f'{pair}_sell_new', trade_sell_new)\n                break\n\n            # print('sell prices', price, sell[3])\n            if price < sell[3]:\n                next_sell_id = sell[5]\n                put(addr, 'trade', f'{pair}_sell', [addr, base_value, quote_value, price, trade_sell_no, next_sell_id], str(trade_sell_new))\n                if next_sell_id is None:\n                    trade_sell_start = trade_sell_new\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n                sell[5] = trade_sell_new\n                trade_sell_new += 1\n                put(addr, 'trade', f'{pair}_sell_new', trade_sell_new)\n\n                put(addr, 'trade', f'{pair}_sell', sell, str(trade_sell_no))\n                if next_sell_id is not None:\n                    next_sell = get('trade', f'{pair}_sell', None, str(next_sell_id))\n                    if next_sell is not None:\n                        next_sell[4] = sell[5]\n                        put(addr, 'trade', f'{pair}_sell', next_sell, str(next_sell_id))\n                break\n\n            # lowest sell order\n            if sell[4] is None:\n                put(addr, 'trade', f'{pair}_sell', [addr, base_value, quote_value, price, None, trade_sell_no], str(trade_sell_new))\n                put(addr, 'trade', f'{pair}_sell', [sell[0], sell[1], sell[2], sell[3], trade_sell_new, sell[5]], str(trade_sell_no))\n                trade_sell_new += 1\n                put(addr, 'trade', f'{pair}_sell_new', trade_sell_new)\n                break\n\n            trade_sell_no = sell[4]\n\n    elif base_value > 0 and quote_value < 0: # buy token with USDC\n        balance = get(quote_tick, 'balance', 0, addr)\n        balance += quote_value\n        assert balance >= 0\n        put(addr, quote_tick, 'balance', balance, addr)\n\n        trade_buy_no = trade_buy_start\n        while True:\n            buy = get('trade', f'{pair}_buy', None, str(trade_buy_no))\n            price = - quote_value * K // base_value\n\n            if buy is None:\n                buy = [addr, base_value, quote_value, price, None, None]\n                put(addr, 'trade', f'{pair}_buy', buy, str(trade_buy_new))\n                trade_buy_new += 1\n                put(addr, 'trade', f'{pair}_buy_new', trade_buy_new)\n                break\n\n            # print('buy prices', price, buy[3])\n            if price > buy[3]:\n                # print('buy', buy)\n                next_buy_id = buy[5]\n                put(addr, 'trade', f'{pair}_buy', [addr, base_value, quote_value, price, trade_buy_no, next_buy_id], str(trade_buy_new))\n                if next_buy_id is None:\n                    trade_buy_start = trade_buy_new\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n                buy[5] = trade_buy_new\n                trade_buy_new += 1\n                put(addr, 'trade', f'{pair}_buy_new', trade_buy_new)\n\n                put(addr, 'trade', f'{pair}_buy', buy, str(trade_buy_no))\n                if next_buy_id is not None:\n                    next_buy = get('trade', f'{pair}_buy', None, str(next_buy_id))\n                    if next_buy is not None:\n                        next_buy[4] = buy[5]\n                        put(addr, 'trade', f'{pair}_buy', next_buy, str(next_buy_id))\n                break\n\n            if buy[4] is None:\n                put(addr, 'trade', f'{pair}_buy', [addr, base_value, quote_value, price, None, trade_buy_no], str(trade_buy_new))\n                put(addr, 'trade', f'{pair}_buy', [buy[0], buy[1], buy[2], buy[3], trade_buy_new, buy[5]], str(trade_buy_no))\n                trade_buy_new += 1\n                put(addr, 'trade', f'{pair}_buy_new', trade_buy_new)\n                break\n\n            # print('trade_buy_no', trade_buy_no)\n            trade_buy_no = buy[4]\n\n    # MATCHING\n    # trade_buy_start = get('trade', f'{pair}_buy_start', 1)\n    # trade_sell_start = get('trade', f'{pair}_sell_start', 1)\n    # print('trade_buy_start', trade_buy_start, 'trade_sell_start', trade_sell_start)\n    trade_sell_no = trade_sell_start\n    highest_buy_price = None\n\n    while True:\n        sell = get('trade', f'{pair}_sell', None, str(trade_sell_no))\n        if not sell:\n            break\n        # sell_price = - sell[2] * K // sell[1]\n        sell_price = sell[3]\n        # print('>sell_price', sell_price)\n        if highest_buy_price and sell_price > highest_buy_price:\n            # print('highest_buy_price', highest_buy_price)\n            break\n\n        trade_buy_no = trade_buy_start\n        while True:\n            buy = get('trade', f'{pair}_buy', None, str(trade_buy_no))\n            if not buy:\n                break\n            # buy_price = - buy[2] * K // buy[1]\n            buy_price = buy[3]\n            print('buy_price', buy_price)\n            if highest_buy_price is None:\n                highest_buy_price = buy_price\n            if sell_price > buy_price:\n                trade_buy_no = buy[4]\n                continue\n\n            # matched_price = (buy_price + sell_price) // 2\n            matched_price = sell_price\n            # dx = min(-sell[1], sell[2] * K // matched_price, buy[1])\n            dx = min(-sell[1], buy[1])\n            sell[1] += dx\n            sell[2] -= dx * matched_price // K\n            buy[1] -= dx\n            buy[2] += dx * matched_price // K\n\n            balance = get(base_tick, 'balance', 0, buy[0])\n            balance += dx\n            assert balance >= 0\n            put(buy[0], base_tick, 'balance', balance, buy[0])\n\n            balance = get(quote_tick, 'balance', 0, sell[0])\n            balance += dx * matched_price // K\n            assert balance >= 0\n            put(sell[0], quote_tick, 'balance', balance, sell[0])\n\n            if buy[1] == 0:\n                if buy[4]:\n                    prev_buy = get('trade', f'{pair}_buy', None, str(buy[4]))\n                    prev_buy[5] = buy[5]\n                    put(prev_buy[0], 'trade', f'{pair}_buy', prev_buy, str(buy[4]))\n\n                if buy[5]:\n                    next_buy = get('trade', f'{pair}_buy', None, str(buy[5]))\n                    next_buy[4] = buy[4]\n                    put(next_buy[0], 'trade', f'{pair}_buy', next_buy, str(buy[5]))\n\n                if buy[4] is not None and buy[5] is None:\n                    trade_buy_start = buy[4]\n                elif buy[4] is None and buy[5] is None:\n                    trade_buy_start = trade_buy_new\n\n                print(f'{pair}_buy_to_refund', buy)\n                if buy[2] < 0:\n                    balance = get(quote_tick, 'balance', 0, buy[0])\n                    balance -= buy[2]\n                    assert balance >= 0\n                    put(buy[0], quote_tick, 'balance', balance, buy[0])\n    \n                put('', 'trade', f'{pair}_buy', None, str(trade_buy_no))\n            else:\n                put('', 'trade', f'{pair}_buy', buy, str(trade_buy_no))\n\n            if sell[1] == 0:\n                break\n            if buy[4] is None:\n                break\n            trade_buy_no = buy[4]\n\n        if sell[1] == 0:\n            if sell[4]:\n                prev_sell = get('trade', f'{pair}_sell', None, str(sell[4]))\n                prev_sell[5] = sell[5]\n                put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n            if sell[5]:\n                next_sell = get('trade', f'{pair}_sell', None, str(sell[5]))\n                next_sell[4] = sell[4]\n                put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n            if sell[4] is not None and sell[5] is None:\n                trade_sell_start = sell[4]\n            elif sell[4] is None and sell[5] is None:\n                trade_sell_start = trade_sell_new\n\n            print(f'{pair}_sell_to_refund', sell)\n            if sell[1] < 0:\n                balance = get(base_tick, 'balance', 0, sell[0])\n                balance -= sell[1]\n                assert balance >= 0\n                put(sell[0], base_tick, 'balance', balance, sell[0])\n\n            put('', 'trade', f'{pair}_sell', None, str(trade_sell_no))\n        else:\n            put('', 'trade', f'{pair}_sell', sell, str(trade_sell_no))\n\n        if sell[4] is None:\n            break\n        trade_sell_no = sell[4]\n\n    put('', 'trade', f'{pair}_sell_start', trade_sell_start)\n    put('', 'trade', f'{pair}_buy_start', trade_buy_start)\n"}{"votes": ["0xe1288759446298f250c3bce5616706d25525ba7f"], "require": [], "asset_permission": [], "sourcecode": "\ndef trade_limit_order(info, args):\n    assert args['f'] == 'trade_limit_order'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n    print('trade_limit_order addr', addr, 'handle', handle, 'sender', sender)\n\n    base_tick = args['a'][0]\n    quote_tick = args['a'][2]\n    assert set(base_tick) <= set(string.ascii_uppercase+'_')\n    assert set(quote_tick) <= set(string.ascii_uppercase+'_')\n    # TODO: make sure quote_tick is set\n\n    pair = '%s_%s' % tuple([base_tick, quote_tick])\n    # TODO: check if pair exists\n\n    base_value = int(args['a'][1])\n    quote_value = int(args['a'][3])\n    assert base_value * quote_value < 0\n    K = 10**18\n\n    trade_buy_start = get('trade', f'{pair}_buy_start', 1) # from maximum\n    trade_buy_new = get('trade', f'{pair}_buy_new', 1)\n    trade_sell_start = get('trade', f'{pair}_sell_start', 1) # from minimum\n    trade_sell_new = get('trade', f'{pair}_sell_new', 1)\n\n    # SORT AND INSERT\n    if base_value < 0 and quote_value > 0: # sell token get USDC\n        balance = get(base_tick, 'balance', 0, addr)\n        # print('base_tick balance', balance, addr, base_tick)\n        balance += base_value\n        assert balance >= 0\n        put(addr, base_tick, 'balance', balance, addr)\n\n        trade_sell_no = trade_sell_start\n        while True:\n            sell = get('trade', f'{pair}_sell', None, str(trade_sell_no))\n            price = - quote_value * K // base_value\n\n            # the first order\n            if sell is None:\n                put(addr, 'trade', f'{pair}_sell', [addr, base_value, quote_value, price, None, None], str(trade_sell_new))\n                trade_sell_new += 1\n                put(addr, 'trade', f'{pair}_sell_new', trade_sell_new)\n                break\n\n            # print('sell prices', price, sell[3])\n            if price < sell[3]:\n                next_sell_id = sell[5]\n                put(addr, 'trade', f'{pair}_sell', [addr, base_value, quote_value, price, trade_sell_no, next_sell_id], str(trade_sell_new))\n                if next_sell_id is None:\n                    trade_sell_start = trade_sell_new\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n                sell[5] = trade_sell_new\n                trade_sell_new += 1\n                put(addr, 'trade', f'{pair}_sell_new', trade_sell_new)\n\n                put(addr, 'trade', f'{pair}_sell', sell, str(trade_sell_no))\n                if next_sell_id is not None:\n                    next_sell = get('trade', f'{pair}_sell', None, str(next_sell_id))\n                    if next_sell is not None:\n                        next_sell[4] = sell[5]\n                        put(addr, 'trade', f'{pair}_sell', next_sell, str(next_sell_id))\n                break\n\n            # lowest sell order\n            if sell[4] is None:\n                put(addr, 'trade', f'{pair}_sell', [addr, base_value, quote_value, price, None, trade_sell_no], str(trade_sell_new))\n                put(addr, 'trade', f'{pair}_sell', [sell[0], sell[1], sell[2], sell[3], trade_sell_new, sell[5]], str(trade_sell_no))\n                trade_sell_new += 1\n                put(addr, 'trade', f'{pair}_sell_new', trade_sell_new)\n                break\n\n            trade_sell_no = sell[4]\n\n    elif base_value > 0 and quote_value < 0: # buy token with USDC\n        balance = get(quote_tick, 'balance', 0, addr)\n        balance += quote_value\n        assert balance >= 0\n        put(addr, quote_tick, 'balance', balance, addr)\n\n        trade_buy_no = trade_buy_start\n        while True:\n            buy = get('trade', f'{pair}_buy', None, str(trade_buy_no))\n            price = - quote_value * K // base_value\n\n            if buy is None:\n                buy = [addr, base_value, quote_value, price, None, None]\n                put(addr, 'trade', f'{pair}_buy', buy, str(trade_buy_new))\n                trade_buy_new += 1\n                put(addr, 'trade', f'{pair}_buy_new', trade_buy_new)\n                break\n\n            # print('buy prices', price, buy[3])\n            if price > buy[3]:\n                # print('buy', buy)\n                next_buy_id = buy[5]\n                put(addr, 'trade', f'{pair}_buy', [addr, base_value, quote_value, price, trade_buy_no, next_buy_id], str(trade_buy_new))\n                if next_buy_id is None:\n                    trade_buy_start = trade_buy_new\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n                buy[5] = trade_buy_new\n                trade_buy_new += 1\n                put(addr, 'trade', f'{pair}_buy_new', trade_buy_new)\n\n                put(addr, 'trade', f'{pair}_buy', buy, str(trade_buy_no))\n                if next_buy_id is not None:\n                    next_buy = get('trade', f'{pair}_buy', None, str(next_buy_id))\n                    if next_buy is not None:\n                        next_buy[4] = buy[5]\n                        put(addr, 'trade', f'{pair}_buy', next_buy, str(next_buy_id))\n                break\n\n            if buy[4] is None:\n                put(addr, 'trade', f'{pair}_buy', [addr, base_value, quote_value, price, None, trade_buy_no], str(trade_buy_new))\n                put(addr, 'trade', f'{pair}_buy', [buy[0], buy[1], buy[2], buy[3], trade_buy_new, buy[5]], str(trade_buy_no))\n                trade_buy_new += 1\n                put(addr, 'trade', f'{pair}_buy_new', trade_buy_new)\n                break\n\n            # print('trade_buy_no', trade_buy_no)\n            trade_buy_no = buy[4]\n\n    # MATCHING\n    # trade_buy_start = get('trade', f'{pair}_buy_start', 1)\n    # trade_sell_start = get('trade', f'{pair}_sell_start', 1)\n    # print('trade_buy_start', trade_buy_start, 'trade_sell_start', trade_sell_start)\n    trade_sell_no = trade_sell_start\n    highest_buy_price = None\n\n    while True:\n        sell = get('trade', f'{pair}_sell', None, str(trade_sell_no))\n        if not sell:\n            break\n        # sell_price = - sell[2] * K // sell[1]\n        sell_price = sell[3]\n        # print('>sell_price', sell_price)\n        if highest_buy_price and sell_price > highest_buy_price:\n            # print('highest_buy_price', highest_buy_price)\n            break\n\n        trade_buy_no = trade_buy_start\n        while True:\n            buy = get('trade', f'{pair}_buy', None, str(trade_buy_no))\n            if not buy:\n                break\n            # buy_price = - buy[2] * K // buy[1]\n            buy_price = buy[3]\n            print('buy_price', buy_price)\n            if highest_buy_price is None:\n                highest_buy_price = buy_price\n            if sell_price > buy_price:\n                trade_buy_no = buy[4]\n                continue\n\n            # matched_price = (buy_price + sell_price) // 2\n            matched_price = sell_price\n            # dx = min(-sell[1], sell[2] * K // matched_price, buy[1])\n            dx = min(-sell[1], buy[1])\n            sell[1] += dx\n            sell[2] -= dx * matched_price // K\n            buy[1] -= dx\n            buy[2] += dx * matched_price // K\n\n            balance = get(base_tick, 'balance', 0, buy[0])\n            balance += dx\n            assert balance >= 0\n            put(buy[0], base_tick, 'balance', balance, buy[0])\n\n            balance = get(quote_tick, 'balance', 0, sell[0])\n            balance += dx * matched_price // K\n            assert balance >= 0\n            put(sell[0], quote_tick, 'balance', balance, sell[0])\n\n            if buy[1] == 0:\n                if buy[4]:\n                    prev_buy = get('trade', f'{pair}_buy', None, str(buy[4]))\n                    prev_buy[5] = buy[5]\n                    put(prev_buy[0], 'trade', f'{pair}_buy', prev_buy, str(buy[4]))\n\n                if buy[5]:\n                    next_buy = get('trade', f'{pair}_buy', None, str(buy[5]))\n                    next_buy[4] = buy[4]\n                    put(next_buy[0], 'trade', f'{pair}_buy', next_buy, str(buy[5]))\n\n                if buy[4] is not None and buy[5] is None:\n                    trade_buy_start = buy[4]\n                elif buy[4] is None and buy[5] is None:\n                    trade_buy_start = trade_buy_new\n\n                print(f'{pair}_buy_to_refund', buy)\n                if buy[2] < 0:\n                    balance = get(quote_tick, 'balance', 0, buy[0])\n                    balance -= buy[2]\n                    assert balance >= 0\n                    put(buy[0], quote_tick, 'balance', balance, buy[0])\n    \n                put('', 'trade', f'{pair}_buy', None, str(trade_buy_no))\n            else:\n                put('', 'trade', f'{pair}_buy', buy, str(trade_buy_no))\n\n            if sell[1] == 0:\n                break\n            if buy[4] is None:\n                break\n            trade_buy_no = buy[4]\n\n        if sell[1] == 0:\n            if sell[4]:\n                prev_sell = get('trade', f'{pair}_sell', None, str(sell[4]))\n                prev_sell[5] = sell[5]\n                put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n            if sell[5]:\n                next_sell = get('trade', f'{pair}_sell', None, str(sell[5]))\n                next_sell[4] = sell[4]\n                put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n            if sell[4] is not None and sell[5] is None:\n                trade_sell_start = sell[4]\n            elif sell[4] is None and sell[5] is None:\n                trade_sell_start = trade_sell_new\n\n            print(f'{pair}_sell_to_refund', sell)\n            if sell[1] < 0:\n                balance = get(base_tick, 'balance', 0, sell[0])\n                balance -= sell[1]\n                assert balance >= 0\n                put(sell[0], base_tick, 'balance', balance, sell[0])\n\n            put('', 'trade', f'{pair}_sell', None, str(trade_sell_no))\n        else:\n            put('', 'trade', f'{pair}_sell', sell, str(trade_sell_no))\n\n        if sell[4] is None:\n            break\n        trade_sell_no = sell[4]\n\n    put('', 'trade', f'{pair}_sell_start', trade_sell_start)\n    put('', 'trade', f'{pair}_buy_start', trade_buy_start)\n"}["transfer", "approve", "transfer_from", "token_mint_once", "asset_update_ownership", "asset_update_functions"]"0x376d3737da2a540318bba02a98f03a97d1dd8f6d"6"Mock USDC"999999985753029983921000000000["transfer", "approve", "transfer_from", "token_mint_once", "asset_update_ownership", "asset_update_functions"]"0x376d3737da2a540318bba02a98f03a97d1dd8f6d"18"Test Zentra Token"2100000021000000["transfer", "approve", "transfer_from", "token_mint_once", "asset_update_ownership", "asset_update_functions"]"0x376d3737da2a540318bba02a98f03a97d1dd8f6d"18"Mock Bitcoin"20999982256674461888992201210000000000000000000000007["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", -778221778221778222, 779000005, 1001000000, 2, null]92["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", -790419161676646707, 792000002, 1002000000, 3, null]["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", -2000000000000000000, 2006000000, 1003000000, 6, 2]["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", 1000000000000000000, -999000000, 999000000, null, null]11{"votes": [], "require": [], "asset_permission": [], "sourcecode": "def token_mint(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'token_mint'\n    # assert args['f'] in get('asset', 'functions', [], tick)\n\n    value = int(args['a'][1])\n    assert value > 0\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n    # TODO: check addr is the asset owner\n\n    balance = get(tick, 'balance', 0, addr)\n    balance += value\n    total = get(tick, 'total', 0, addr)\n    total += value\n\n    put(addr, tick, 'balance', balance, addr)\n    put(addr, tick, 'total', total)\n"}{"votes": [], "require": [], "asset_permission": [], "sourcecode": "\ndef trade_market_order(info, args):\n    assert args['f'] == 'trade_market_order'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n\n    base_tick = args['a'][0]\n    quote_tick = args['a'][2]\n    assert set(base_tick) <= set(string.ascii_uppercase+'_')\n    assert set(quote_tick) <= set(string.ascii_uppercase+'_')\n    pair = '%s_%s' % tuple([base_tick, quote_tick])\n\n    base_value = args['a'][1]\n    quote_value = args['a'][3]\n    trade_sell_start = get('trade', f'{pair}_sell_start', 1)\n    trade_buy_start = get('trade', f'{pair}_buy_start', 1)\n\n    K = 10**18\n    if quote_value is None and int(base_value) < 0:\n        base_value = int(args['a'][1])\n        base_balance = get(base_tick, 'balance', 0, addr)\n\n        trade_buy_no = trade_buy_start\n        while True:\n            buy = get('trade', f'{pair}_buy', None, str(trade_buy_no))\n            if buy is None:\n                break\n\n            price = buy[3]\n            dx_base = min(buy[1], -buy[2] * K // price, -base_value)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            buy[1] -= dx_base\n            buy[2] += dx_quote\n\n            if base_balance - dx_base < 0:\n                break\n            base_balance -= dx_base\n\n            if buy[1] == 0 or buy[1] // price == 0:\n                if buy[4]:\n                    prev_buy = get('trade', f'{pair}_buy', None, str(buy[4]))\n                    prev_buy[5] = buy[5]\n                    put(prev_buy[0], 'trade', f'{pair}_buy', prev_buy, str(buy[4]))\n\n                if buy[5]:\n                    next_buy = get('trade', f'{pair}_buy', None, str(buy[5]))\n                    next_buy[4] = buy[4]\n                    put(next_buy[0], 'trade', f'{pair}_buy', next_buy, str(buy[5]))\n\n                if buy[4] is not None and buy[5] is None:\n                    trade_buy_start = buy[4]\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n                elif buy[4] is None and buy[5] is None:\n                    trade_buy_new = get('trade', f'{pair}_buy_new', 1)\n                    trade_buy_start = trade_buy_new\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n\n                if buy[2] < 0:\n                    balance = get(quote_tick, 'balance', 0, buy[0])\n                    balance -= buy[2]\n                    assert balance >= 0\n                    put(buy[0], quote_tick, 'balance', balance, buy[0])\n    \n                put(buy[0], 'trade', f'{pair}_buy', None, str(trade_buy_no))\n            else:\n                put(buy[0], 'trade', f'{pair}_buy', buy, str(trade_buy_no))\n\n            balance = get(quote_tick, 'balance', 0, addr)\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, addr)\n\n            base_value += dx_base\n            assert base_value <= 0\n\n            if buy[4] is None:\n                break\n            trade_buy_no = buy[4]\n\n        assert base_balance >= 0\n        put(addr, base_tick, 'balance', base_balance, addr)\n\n    elif quote_value is None and int(base_value) > 0:\n        base_value = int(args['a'][1])\n        quote_balance = get(quote_tick, 'balance', 0, addr)\n        print('base > 0')\n\n        trade_buy_no = trade_buy_start\n        while True:\n            buy = get('trade', f'{pair}_buy', None, str(trade_buy_no))\n            if buy is None:\n                break\n\n            price = buy[3]\n            dx_base = min(buy[1], quote_balance * K // price, base_value)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            buy[1] -= dx_base\n            buy[2] += dx_quote\n\n            if quote_balance - dx_quote < 0:\n                break\n            quote_balance -= dx_quote\n\n            if buy[1] == 0 or buy[1] // price == 0:\n                if buy[4]:\n                    prev_buy = get('trade', f'{pair}_buy', None, str(buy[4]))\n                    prev_buy[5] = buy[5]\n                    put(prev_buy[0], 'trade', f'{pair}_buy', prev_buy, str(buy[4]))\n\n                if buy[5]:\n                    next_buy = get('trade', f'{pair}_buy', None, str(buy[5]))\n                    next_buy[4] = buy[4]\n                    put(next_buy[0], 'trade', f'{pair}_buy', next_buy, str(buy[5]))\n\n                if buy[4] is not None and buy[5] is None:\n                    trade_buy_start = buy[4]\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n                elif buy[4] is None and buy[5] is None:\n                    trade_buy_new = get('trade', f'{pair}_buy_new', 1)\n                    trade_buy_start = trade_buy_new\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n\n                print(f'{pair}_buy_to_refund', buy)\n                if buy[2] < 0:\n                    balance = get(quote_tick, 'balance', 0, buy[0])\n                    balance -= buy[2]\n                    assert balance >= 0\n                    put(buy[0], quote_tick, 'balance', balance, buy[0])\n    \n                put(buy[0], 'trade', f'{pair}_buy', None, str(trade_buy_no))\n            else:\n                put(buy[0], 'trade', f'{pair}_buy', buy, str(trade_buy_no))\n\n            balance = get(base_tick, 'balance', 0, buy[0])\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, buy[0])\n\n            base_value -= dx_base\n            assert base_value >= 0\n\n            if buy[4] is None:\n                break\n            trade_buy_no = buy[4]\n\n        assert quote_balance >= 0\n        put(addr, quote_tick, 'balance', quote_balance, addr)\n\n    elif base_value is None and int(quote_value) < 0:\n        quote_value = int(args['a'][3])\n        quote_balance = get(quote_tick, 'balance', 0, addr)\n\n        trade_sell_no = trade_sell_start\n        while True:\n            sell = get('trade', f'{pair}_sell', None, str(trade_sell_no))\n            if sell is None:\n                break\n\n            price = sell[3]\n            dx_base = min(-sell[1], -quote_value * K // price)\n            dx_quote = dx * price // K\n            if dx_base == 0 or  dx_quote == 0:\n                break\n            sell[1] += dx_base\n            sell[2] -= dx_quote\n\n            if quote_balance - dx_quote < 0:\n                break\n            quote_balance -= dx_quote\n\n            if sell[1] == 0 or sell[1] // price == 0:\n                if sell[4]:\n                    prev_sell = get('trade', f'{pair}_sell', None, str(sell[4]))\n                    prev_sell[5] = sell[5]\n                    put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n                if sell[5]:\n                    next_sell = get('trade', f'{pair}_sell', None, str(sell[5]))\n                    next_sell[4] = sell[4]\n                    put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n                if sell[4] is not None and sell[5] is None:\n                    trade_sell_start = sell[4]\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n                elif sell[4] is None and sell[5] is None:\n                    trade_sell_new = get('trade', f'{pair}_sell_new', 1)\n                    trade_sell_start = trade_sell_new\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n\n                print(f'{pair}_sell_to_refund', sell)\n                if sell[1] < 0:\n                    balance = get(base_tick, 'balance', 0, sell[0])\n                    balance -= sell[1]\n                    assert balance >= 0\n                    put(sell[0], base_tick, 'balance', balance, sell[0])\n\n                put(sell[0], 'trade', f'{pair}_sell', None, str(trade_sell_no))\n            else:\n                put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_sell_no))\n\n            balance = get(base_tick, 'balance', 0, addr)\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, addr)\n\n            quote_value += dx_quote\n            assert quote_value <= 0\n\n            if sell[4] is None:\n                break\n            trade_sell_no = sell[4]\n\n        assert quote_balance >= 0\n        put(addr, quote_tick, 'balance', quote_balance, addr)\n\n    elif base_value is None and int(quote_value) > 0:\n        quote_value = int(args['a'][3])\n        base_balance = get(base_tick, 'balance', 0, addr)\n\n        trade_sell_no = trade_sell_start\n        while True:\n            sell = get('trade', f'{pair}_sell', None, str(trade_sell_no))\n            if sell is None:\n                break\n\n            price = sell[3]\n            dx_base = min(-sell[1], quote_value * K // price, base_balance)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            sell[1] += dx_base\n            sell[2] -= dx_quote\n\n            if base_balance - dx_base < 0:\n                break\n            base_balance -= dx_base\n\n            if sell[1] == 0 or sell[1] // price == 0:\n                if sell[4]:\n                    prev_sell = get('trade', f'{pair}_sell', None, str(sell[4]))\n                    prev_sell[5] = sell[5]\n                    put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n                if sell[5]:\n                    next_sell = get('trade', f'{pair}_sell', None, str(sell[5]))\n                    next_sell[4] = sell[4]\n                    put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n                if sell[4] is not None and sell[5] is None:\n                    trade_sell_start = sell[4]\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n                elif sell[4] is None and sell[5] is None:\n                    trade_sell_new = get('trade', f'{pair}_sell_new', 1)\n                    trade_sell_start = trade_sell_new\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n\n                print(f'{pair}_sell_to_refund', sell)\n                if sell[1] < 0:\n                    balance = get(base_tick, 'balance', 0, sell[0])\n                    balance -= sell[1]\n                    assert balance >= 0\n                    put(sell[0], base_tick, 'balance', balance, sell[0])\n\n                put(sell[0], 'trade', f'{pair}_sell', None, str(trade_sell_no))\n            else:\n                put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_sell_no))\n\n            balance = get(quote_tick, 'balance', 0, sell[0])\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, sell[0])\n\n            quote_value -= dx_quote\n            assert quote_value >= 0\n\n            if sell[4] is None:\n                break\n            trade_sell_no = sell[4]\n\n        assert base_balance >= 0\n        put(addr, base_tick, 'balance', base_balance, addr)\n"}{"votes": ["0xe1288759446298f250c3bce5616706d25525ba7f"], "require": [], "asset_permission": [], "sourcecode": "\ndef trade_market_order(info, args):\n    assert args['f'] == 'trade_market_order'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n\n    base_tick = args['a'][0]\n    quote_tick = args['a'][2]\n    assert set(base_tick) <= set(string.ascii_uppercase+'_')\n    assert set(quote_tick) <= set(string.ascii_uppercase+'_')\n    pair = '%s_%s' % tuple([base_tick, quote_tick])\n\n    base_value = args['a'][1]\n    quote_value = args['a'][3]\n    trade_sell_start = get('trade', f'{pair}_sell_start', 1)\n    trade_buy_start = get('trade', f'{pair}_buy_start', 1)\n\n    K = 10**18\n    if quote_value is None and int(base_value) < 0:\n        base_value = int(args['a'][1])\n        base_balance = get(base_tick, 'balance', 0, addr)\n        base_sum = 0\n\n        trade_buy_no = trade_buy_start\n        while True:\n            buy = get('trade', f'{pair}_buy', None, str(trade_buy_no))\n            if buy is None:\n                break\n\n            price = buy[3]\n            dx_base = min(buy[1], -buy[2] * K // price, -base_value)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            buy[1] -= dx_base\n            buy[2] += dx_quote\n\n            if base_balance - dx_base < 0:\n                break\n            base_balance -= dx_base\n            base_sum += dx_base\n\n            if buy[1] == 0 or buy[1] // price == 0:\n                if buy[4]:\n                    prev_buy = get('trade', f'{pair}_buy', None, str(buy[4]))\n                    prev_buy[5] = buy[5]\n                    put(prev_buy[0], 'trade', f'{pair}_buy', prev_buy, str(buy[4]))\n\n                if buy[5]:\n                    next_buy = get('trade', f'{pair}_buy', None, str(buy[5]))\n                    next_buy[4] = buy[4]\n                    put(next_buy[0], 'trade', f'{pair}_buy', next_buy, str(buy[5]))\n\n                if buy[4] is not None and buy[5] is None:\n                    trade_buy_start = buy[4]\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n                elif buy[4] is None and buy[5] is None:\n                    trade_buy_new = get('trade', f'{pair}_buy_new', 1)\n                    trade_buy_start = trade_buy_new\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n\n                if buy[2] < 0:\n                    balance = get(quote_tick, 'balance', 0, buy[0])\n                    balance -= buy[2]\n                    assert balance >= 0\n                    put(buy[0], quote_tick, 'balance', balance, buy[0])\n    \n                put(buy[0], 'trade', f'{pair}_buy', None, str(trade_buy_no))\n            else:\n                put(buy[0], 'trade', f'{pair}_buy', buy, str(trade_buy_no))\n\n            balance = get(base_tick, 'balance', 0, buy[0])\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, buy[0])\n\n            base_value += dx_base\n            assert base_value <= 0\n            balance = get(quote_tick, 'balance', 0, addr)\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, addr)\n\n            if buy[4] is None:\n                break\n            trade_buy_no = buy[4]\n\n        balance = get(base_tick, 'balance', 0, addr)\n        balance -= base_sum\n        assert balance >= 0\n        put(addr, base_tick, 'balance', balance, addr)\n\n    elif quote_value is None and int(base_value) > 0:\n        base_value = int(args['a'][1])\n        quote_balance = get(quote_tick, 'balance', 0, addr)\n        quote_sum = 0\n\n        trade_sell_no = trade_sell_start\n        while True:\n            sell = get('trade', f'{pair}_sell', None, str(trade_sell_no))\n            if sell is None:\n                break\n\n            price = sell[3]\n            dx_base = min(-sell[1], quote_balance * K // price, base_value)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            sell[1] += dx_base\n            sell[2] -= dx_quote\n\n            if quote_balance - dx_quote < 0:\n                break\n            quote_balance -= dx_quote\n            quote_sum += dx_quote\n\n            if sell[1] == 0 or sell[1] // price == 0:\n                if sell[4]:\n                    prev_sell = get('trade', f'{pair}_sell', None, str(sell[4]))\n                    prev_sell[5] = sell[5]\n                    put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n                if sell[5]:\n                    next_sell = get('trade', f'{pair}_sell', None, str(sell[5]))\n                    next_sell[4] = sell[4]\n                    put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n                if sell[4] is not None and sell[5] is None:\n                    trade_sell_start = sell[4]\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n                elif sell[4] is None and sell[5] is None:\n                    trade_sell_new = get('trade', f'{pair}_sell_new', 1)\n                    trade_sell_start = trade_sell_new\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n\n                if sell[1] < 0:\n                    balance = get(base_tick, 'balance', 0, sell[0])\n                    balance -= sell[1]\n                    assert balance >= 0\n                    put(sell[0], base_tick, 'balance', balance, sell[0])\n\n                put(sell[0], 'trade', f'{pair}_sell', None, str(trade_sell_no))\n            else:\n                put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_sell_no))\n\n            balance = get(quote_tick, 'balance', 0, sell[0])\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, sell[0])\n\n            base_value -= dx_base\n            assert base_value >= 0\n            balance = get(base_tick, 'balance', 0, addr)\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, addr)\n\n            if sell[4] is None:\n                break\n            trade_sell_no = sell[4]\n\n        balance = get(quote_tick, 'balance', 0, addr)\n        balance -= quote_sum\n        assert balance >= 0\n        put(addr, quote_tick, 'balance', balance, addr)\n\n    elif base_value is None and int(quote_value) < 0:\n        quote_value = int(args['a'][3])\n        quote_balance = get(quote_tick, 'balance', 0, addr)\n        quote_sum = 0\n\n        trade_sell_no = trade_sell_start\n        while True:\n            sell = get('trade', f'{pair}_sell', None, str(trade_sell_no))\n            if sell is None:\n                break\n\n            price = sell[3]\n            dx_base = min(-sell[1], -quote_value * K // price)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or  dx_quote == 0:\n                break\n            sell[1] += dx_base\n            sell[2] -= dx_quote\n\n            if quote_balance - dx_quote < 0:\n                break\n            quote_balance -= dx_quote\n            quote_sum += dx_quote\n\n            if sell[1] == 0 or sell[1] // price == 0:\n                if sell[4]:\n                    prev_sell = get('trade', f'{pair}_sell', None, str(sell[4]))\n                    prev_sell[5] = sell[5]\n                    put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n                if sell[5]:\n                    next_sell = get('trade', f'{pair}_sell', None, str(sell[5]))\n                    next_sell[4] = sell[4]\n                    put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n                if sell[4] is not None and sell[5] is None:\n                    trade_sell_start = sell[4]\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n                elif sell[4] is None and sell[5] is None:\n                    trade_sell_new = get('trade', f'{pair}_sell_new', 1)\n                    trade_sell_start = trade_sell_new\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n\n                if sell[1] < 0:\n                    balance = get(base_tick, 'balance', 0, sell[0])\n                    balance -= sell[1]\n                    assert balance >= 0\n                    put(sell[0], base_tick, 'balance', balance, sell[0])\n\n                put(sell[0], 'trade', f'{pair}_sell', None, str(trade_sell_no))\n            else:\n                put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_sell_no))\n\n            balance = get(quote_tick, 'balance', 0, sell[0])\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, sell[0])\n\n            quote_value += dx_quote\n            assert quote_value <= 0\n            balance = get(base_tick, 'balance', 0, addr)\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, addr)\n\n            if sell[4] is None:\n                break\n            trade_sell_no = sell[4]\n\n        balance = get(quote_tick, 'balance', 0, addr)\n        balance -= quote_sum\n        assert balance >= 0\n        put(addr, quote_tick, 'balance', balance, addr)\n\n    elif base_value is None and int(quote_value) > 0:\n        # this is a sell, get USDC by selling BTC\n        quote_value = int(args['a'][3])\n        base_balance = get(base_tick, 'balance', 0, addr)\n        base_sum = 0\n\n        trade_buy_no = trade_buy_start\n        while True:\n            buy = get('trade', f'{pair}_buy', None, str(trade_buy_no))\n            if buy is None:\n                break\n\n            price = buy[3]\n            dx_base = min(buy[1], base_balance, quote_value * K // price)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            buy[1] -= dx_base\n            buy[2] += dx_quote\n\n            if base_balance - dx_base < 0:\n                break\n            base_balance -= dx_base\n            base_sum += dx_base\n\n            if buy[1] == 0 or buy[1] // price == 0:\n                if buy[4]:\n                    prev_buy = get('trade', f'{pair}_buy', None, str(buy[4]))\n                    prev_buy[5] = buy[5]\n                    put(prev_buy[0], 'trade', f'{pair}_buy', prev_buy, str(buy[4]))\n\n                if buy[5]:\n                    next_buy = get('trade', f'{pair}_buy', None, str(buy[5]))\n                    next_buy[4] = buy[4]\n                    put(next_buy[0], 'trade', f'{pair}_buy', next_buy, str(buy[5]))\n\n                if buy[4] is not None and buy[5] is None:\n                    trade_buy_start = buy[4]\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n                elif buy[4] is None and buy[5] is None:\n                    trade_buy_new = get('trade', f'{pair}_buy_new', 1)\n                    trade_buy_start = trade_buy_new\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n\n                if buy[2] < 0:\n                    balance = get(quote_tick, 'balance', 0, buy[0])\n                    balance -= buy[2]\n                    assert balance >= 0\n                    put(buy[0], quote_tick, 'balance', balance, buy[0])\n    \n                put(buy[0], 'trade', f'{pair}_buy', None, str(trade_buy_no))\n            else:\n                put(buy[0], 'trade', f'{pair}_buy', buy, str(trade_buy_no))\n\n            balance = get(base_tick, 'balance', 0, buy[0])\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, buy[0])\n\n            quote_value -= dx_quote\n            assert quote_value >= 0\n            balance = get(quote_tick, 'balance', 0, addr)\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, addr)\n\n            if buy[4] is None:\n                break\n            trade_buy_no = buy[4]\n\n        balance = get(base_tick, 'balance', 0, addr)\n        balance -= base_sum\n        assert balance >= 0\n        put(addr, base_tick, 'balance', balance, addr)\n"}{"votes": [], "require": [], "asset_permission": [], "sourcecode": "\ndef trade_market_order(info, args):\n    assert args['f'] == 'trade_market_order'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n\n    base_tick = args['a'][0]\n    quote_tick = args['a'][2]\n    assert set(base_tick) <= set(string.ascii_uppercase+'_')\n    assert set(quote_tick) <= set(string.ascii_uppercase+'_')\n    pair = '%s_%s' % tuple([base_tick, quote_tick])\n\n    base_value = args['a'][1]\n    quote_value = args['a'][3]\n    trade_sell_start = get('trade', f'{pair}_sell_start', 1)\n    trade_buy_start = get('trade', f'{pair}_buy_start', 1)\n\n    K = 10**18\n    if quote_value is None and int(base_value) < 0:\n        base_value = int(args['a'][1])\n        base_balance = get(base_tick, 'balance', 0, addr)\n\n        trade_buy_no = trade_buy_start\n        while True:\n            buy = get('trade', f'{pair}_buy', None, str(trade_buy_no))\n            if buy is None:\n                break\n\n            price = buy[3]\n            dx_base = min(buy[1], -buy[2] * K // price, -base_value)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            buy[1] -= dx_base\n            buy[2] += dx_quote\n\n            if base_balance - dx_base < 0:\n                break\n            base_balance -= dx_base\n\n            if buy[1] == 0 or buy[1] // price == 0:\n                if buy[4]:\n                    prev_buy = get('trade', f'{pair}_buy', None, str(buy[4]))\n                    prev_buy[5] = buy[5]\n                    put(prev_buy[0], 'trade', f'{pair}_buy', prev_buy, str(buy[4]))\n\n                if buy[5]:\n                    next_buy = get('trade', f'{pair}_buy', None, str(buy[5]))\n                    next_buy[4] = buy[4]\n                    put(next_buy[0], 'trade', f'{pair}_buy', next_buy, str(buy[5]))\n\n                if buy[4] is not None and buy[5] is None:\n                    trade_buy_start = buy[4]\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n                elif buy[4] is None and buy[5] is None:\n                    trade_buy_new = get('trade', f'{pair}_buy_new', 1)\n                    trade_buy_start = trade_buy_new\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n\n                if buy[2] < 0:\n                    balance = get(quote_tick, 'balance', 0, buy[0])\n                    balance -= buy[2]\n                    assert balance >= 0\n                    put(buy[0], quote_tick, 'balance', balance, buy[0])\n    \n                put(buy[0], 'trade', f'{pair}_buy', None, str(trade_buy_no))\n            else:\n                put(buy[0], 'trade', f'{pair}_buy', buy, str(trade_buy_no))\n\n            balance = get(quote_tick, 'balance', 0, addr)\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, addr)\n\n            base_value += dx_base\n            assert base_value <= 0\n\n            if buy[4] is None:\n                break\n            trade_buy_no = buy[4]\n\n        assert base_balance >= 0\n        put(addr, base_tick, 'balance', base_balance, addr)\n\n    elif quote_value is None and int(base_value) > 0:\n        base_value = int(args['a'][1])\n        quote_balance = get(quote_tick, 'balance', 0, addr)\n        print('base > 0')\n\n        trade_buy_no = trade_buy_start\n        while True:\n            buy = get('trade', f'{pair}_buy', None, str(trade_buy_no))\n            if buy is None:\n                break\n\n            price = buy[3]\n            dx_base = min(buy[1], quote_balance * K // price, base_value)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            buy[1] -= dx_base\n            buy[2] += dx_quote\n\n            if quote_balance - dx_quote < 0:\n                break\n            quote_balance -= dx_quote\n\n            if buy[1] == 0 or buy[1] // price == 0:\n                if buy[4]:\n                    prev_buy = get('trade', f'{pair}_buy', None, str(buy[4]))\n                    prev_buy[5] = buy[5]\n                    put(prev_buy[0], 'trade', f'{pair}_buy', prev_buy, str(buy[4]))\n\n                if buy[5]:\n                    next_buy = get('trade', f'{pair}_buy', None, str(buy[5]))\n                    next_buy[4] = buy[4]\n                    put(next_buy[0], 'trade', f'{pair}_buy', next_buy, str(buy[5]))\n\n                if buy[4] is not None and buy[5] is None:\n                    trade_buy_start = buy[4]\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n                elif buy[4] is None and buy[5] is None:\n                    trade_buy_new = get('trade', f'{pair}_buy_new', 1)\n                    trade_buy_start = trade_buy_new\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n\n                print(f'{pair}_buy_to_refund', buy)\n                if buy[2] < 0:\n                    balance = get(quote_tick, 'balance', 0, buy[0])\n                    balance -= buy[2]\n                    assert balance >= 0\n                    put(buy[0], quote_tick, 'balance', balance, buy[0])\n    \n                put(buy[0], 'trade', f'{pair}_buy', None, str(trade_buy_no))\n            else:\n                put(buy[0], 'trade', f'{pair}_buy', buy, str(trade_buy_no))\n\n            balance = get(base_tick, 'balance', 0, buy[0])\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, buy[0])\n\n            base_value -= dx_base\n            assert base_value >= 0\n\n            if buy[4] is None:\n                break\n            trade_buy_no = buy[4]\n\n        assert quote_balance >= 0\n        put(addr, quote_tick, 'balance', quote_balance, addr)\n\n    elif base_value is None and int(quote_value) < 0:\n        quote_value = int(args['a'][3])\n        quote_balance = get(quote_tick, 'balance', 0, addr)\n\n        trade_sell_no = trade_sell_start\n        while True:\n            sell = get('trade', f'{pair}_sell', None, str(trade_sell_no))\n            if sell is None:\n                break\n\n            price = sell[3]\n            dx_base = min(-sell[1], -quote_value * K // price)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or  dx_quote == 0:\n                break\n            sell[1] += dx_base\n            sell[2] -= dx_quote\n\n            if quote_balance - dx_quote < 0:\n                break\n            quote_balance -= dx_quote\n\n            if sell[1] == 0 or sell[1] // price == 0:\n                if sell[4]:\n                    prev_sell = get('trade', f'{pair}_sell', None, str(sell[4]))\n                    prev_sell[5] = sell[5]\n                    put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n                if sell[5]:\n                    next_sell = get('trade', f'{pair}_sell', None, str(sell[5]))\n                    next_sell[4] = sell[4]\n                    put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n                if sell[4] is not None and sell[5] is None:\n                    trade_sell_start = sell[4]\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n                elif sell[4] is None and sell[5] is None:\n                    trade_sell_new = get('trade', f'{pair}_sell_new', 1)\n                    trade_sell_start = trade_sell_new\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n\n                print(f'{pair}_sell_to_refund', sell)\n                if sell[1] < 0:\n                    balance = get(base_tick, 'balance', 0, sell[0])\n                    balance -= sell[1]\n                    assert balance >= 0\n                    put(sell[0], base_tick, 'balance', balance, sell[0])\n\n                put(sell[0], 'trade', f'{pair}_sell', None, str(trade_sell_no))\n            else:\n                put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_sell_no))\n\n            balance = get(base_tick, 'balance', 0, addr)\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, addr)\n\n            quote_value += dx_quote\n            assert quote_value <= 0\n\n            if sell[4] is None:\n                break\n            trade_sell_no = sell[4]\n\n        assert quote_balance >= 0\n        put(addr, quote_tick, 'balance', quote_balance, addr)\n\n    elif base_value is None and int(quote_value) > 0:\n        quote_value = int(args['a'][3])\n        base_balance = get(base_tick, 'balance', 0, addr)\n\n        trade_sell_no = trade_sell_start\n        while True:\n            sell = get('trade', f'{pair}_sell', None, str(trade_sell_no))\n            if sell is None:\n                break\n\n            price = sell[3]\n            dx_base = min(-sell[1], quote_value * K // price, base_balance)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            sell[1] += dx_base\n            sell[2] -= dx_quote\n\n            if base_balance - dx_base < 0:\n                break\n            base_balance -= dx_base\n\n            if sell[1] == 0 or sell[1] // price == 0:\n                if sell[4]:\n                    prev_sell = get('trade', f'{pair}_sell', None, str(sell[4]))\n                    prev_sell[5] = sell[5]\n                    put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n                if sell[5]:\n                    next_sell = get('trade', f'{pair}_sell', None, str(sell[5]))\n                    next_sell[4] = sell[4]\n                    put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n                if sell[4] is not None and sell[5] is None:\n                    trade_sell_start = sell[4]\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n                elif sell[4] is None and sell[5] is None:\n                    trade_sell_new = get('trade', f'{pair}_sell_new', 1)\n                    trade_sell_start = trade_sell_new\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n\n                print(f'{pair}_sell_to_refund', sell)\n                if sell[1] < 0:\n                    balance = get(base_tick, 'balance', 0, sell[0])\n                    balance -= sell[1]\n                    assert balance >= 0\n                    put(sell[0], base_tick, 'balance', balance, sell[0])\n\n                put(sell[0], 'trade', f'{pair}_sell', None, str(trade_sell_no))\n            else:\n                put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_sell_no))\n\n            balance = get(quote_tick, 'balance', 0, sell[0])\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, sell[0])\n\n            quote_value -= dx_quote\n            assert quote_value >= 0\n\n            if sell[4] is None:\n                break\n            trade_sell_no = sell[4]\n\n        assert base_balance >= 0\n        put(addr, base_tick, 'balance', base_balance, addr)\n"}3["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", -1000000000000000000, 999000000, 999000000, null, null]335["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", -1000000000000000000, 999000000, 999000000, null, null]1210000031880119880119880120["0xde409115a2a65c2ba10c7d2cad90f88dd8a4eb25", 1000000000000000000, -1000000000, 1000000000, null, null]{"votes": [], "require": [], "asset_permission": [], "sourcecode": "\ndef trade_market_order(info, args):\n    assert args['f'] == 'trade_market_order'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n\n    base_tick = args['a'][0]\n    quote_tick = args['a'][2]\n    assert set(base_tick) <= set(string.ascii_uppercase+'_')\n    assert set(quote_tick) <= set(string.ascii_uppercase+'_')\n    pair = '%s_%s' % tuple([base_tick, quote_tick])\n\n    base_value = args['a'][1]\n    quote_value = args['a'][3]\n    trade_sell_start = get('trade', f'{pair}_sell_start', 1)\n    trade_buy_start = get('trade', f'{pair}_buy_start', 1)\n\n    K = 10**18\n    if quote_value is None and int(base_value) < 0:\n        base_value = int(args['a'][1])\n        base_balance = get(base_tick, 'balance', 0, addr)\n\n        trade_buy_no = trade_buy_start\n        while True:\n            buy = get('trade', f'{pair}_buy', None, str(trade_buy_no))\n            if buy is None:\n                break\n\n            price = buy[3]\n            dx_base = min(buy[1], -buy[2] * K // price, -base_value)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            buy[1] -= dx_base\n            buy[2] += dx_quote\n\n            if base_balance - dx_base < 0:\n                break\n            base_balance -= dx_base\n\n            if buy[1] == 0 or buy[1] // price == 0:\n                if buy[4]:\n                    prev_buy = get('trade', f'{pair}_buy', None, str(buy[4]))\n                    prev_buy[5] = buy[5]\n                    put(prev_buy[0], 'trade', f'{pair}_buy', prev_buy, str(buy[4]))\n\n                if buy[5]:\n                    next_buy = get('trade', f'{pair}_buy', None, str(buy[5]))\n                    next_buy[4] = buy[4]\n                    put(next_buy[0], 'trade', f'{pair}_buy', next_buy, str(buy[5]))\n\n                if buy[4] is not None and buy[5] is None:\n                    trade_buy_start = buy[4]\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n                elif buy[4] is None and buy[5] is None:\n                    trade_buy_new = get('trade', f'{pair}_buy_new', 1)\n                    trade_buy_start = trade_buy_new\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n\n                if buy[2] < 0:\n                    balance = get(quote_tick, 'balance', 0, buy[0])\n                    balance -= buy[2]\n                    assert balance >= 0\n                    put(buy[0], quote_tick, 'balance', balance, buy[0])\n    \n                put(buy[0], 'trade', f'{pair}_buy', None, str(trade_buy_no))\n            else:\n                put(buy[0], 'trade', f'{pair}_buy', buy, str(trade_buy_no))\n\n            base_value += dx_base\n            assert base_value <= 0\n            balance = get(quote_tick, 'balance', 0, addr)\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, addr)\n\n            if buy[4] is None:\n                break\n            trade_buy_no = buy[4]\n\n        assert base_balance >= 0\n        put(addr, base_tick, 'balance', base_balance, addr)\n\n    elif quote_value is None and int(base_value) > 0:\n        base_value = int(args['a'][1])\n        quote_balance = get(quote_tick, 'balance', 0, addr)\n\n        trade_sell_no = trade_sell_start\n        while True:\n            sell = get('trade', f'{pair}_sell', None, str(trade_sell_no))\n            if sell is None:\n                break\n\n            price = sell[3]\n            dx_base = min(-sell[1], quote_balance * K // price, base_value)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            sell[1] += dx_base\n            sell[2] -= dx_quote\n\n            if quote_balance - dx_quote < 0:\n                break\n            quote_balance -= dx_quote\n\n            if sell[1] == 0 or sell[1] // price == 0:\n                if sell[4]:\n                    prev_sell = get('trade', f'{pair}_sell', None, str(sell[4]))\n                    prev_sell[5] = sell[5]\n                    put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n                if sell[5]:\n                    next_sell = get('trade', f'{pair}_sell', None, str(sell[5]))\n                    next_sell[4] = sell[4]\n                    put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n                if sell[4] is not None and sell[5] is None:\n                    trade_sell_start = sell[4]\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n                elif sell[4] is None and sell[5] is None:\n                    trade_sell_new = get('trade', f'{pair}_sell_new', 1)\n                    trade_sell_start = trade_sell_new\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n\n                if sell[1] < 0:\n                    balance = get(base_tick, 'balance', 0, sell[0])\n                    balance -= sell[1]\n                    assert balance >= 0\n                    put(sell[0], base_tick, 'balance', balance, sell[0])\n\n                put(sell[0], 'trade', f'{pair}_sell', None, str(trade_sell_no))\n            else:\n                put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_sell_no))\n\n            balance = get(quote_tick, 'balance', 0, sell[0])\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, sell[0])\n\n            base_value -= dx_base\n            assert base_value >= 0\n            balance = get(base_tick, 'balance', 0, addr)\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, addr)\n\n            if sell[4] is None:\n                break\n            trade_sell_no = sell[4]\n\n        assert quote_balance >= 0\n        put(addr, quote_tick, 'balance', quote_balance, addr)\n\n    elif base_value is None and int(quote_value) < 0:\n        quote_value = int(args['a'][3])\n        quote_balance = get(quote_tick, 'balance', 0, addr)\n\n        trade_sell_no = trade_sell_start\n        while True:\n            sell = get('trade', f'{pair}_sell', None, str(trade_sell_no))\n            if sell is None:\n                break\n\n            price = sell[3]\n            dx_base = min(-sell[1], -quote_value * K // price)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or  dx_quote == 0:\n                break\n            sell[1] += dx_base\n            sell[2] -= dx_quote\n\n            if quote_balance - dx_quote < 0:\n                break\n            quote_balance -= dx_quote\n\n            if sell[1] == 0 or sell[1] // price == 0:\n                if sell[4]:\n                    prev_sell = get('trade', f'{pair}_sell', None, str(sell[4]))\n                    prev_sell[5] = sell[5]\n                    put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n                if sell[5]:\n                    next_sell = get('trade', f'{pair}_sell', None, str(sell[5]))\n                    next_sell[4] = sell[4]\n                    put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n                if sell[4] is not None and sell[5] is None:\n                    trade_sell_start = sell[4]\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n                elif sell[4] is None and sell[5] is None:\n                    trade_sell_new = get('trade', f'{pair}_sell_new', 1)\n                    trade_sell_start = trade_sell_new\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n\n                if sell[1] < 0:\n                    balance = get(base_tick, 'balance', 0, sell[0])\n                    balance -= sell[1]\n                    assert balance >= 0\n                    put(sell[0], base_tick, 'balance', balance, sell[0])\n\n                put(sell[0], 'trade', f'{pair}_sell', None, str(trade_sell_no))\n            else:\n                put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_sell_no))\n\n            quote_value += dx_quote\n            assert quote_value <= 0\n            balance = get(base_tick, 'balance', 0, addr)\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, addr)\n\n            if sell[4] is None:\n                break\n            trade_sell_no = sell[4]\n\n        assert quote_balance >= 0\n        put(addr, quote_tick, 'balance', quote_balance, addr)\n\n    elif base_value is None and int(quote_value) > 0:\n        # this is a sell, get USDC by selling BTC\n        quote_value = int(args['a'][3])\n        base_balance = get(base_tick, 'balance', 0, addr)\n\n        trade_buy_no = trade_buy_start\n        while True:\n            buy = get('trade', f'{pair}_buy', None, str(trade_buy_no))\n            if buy is None:\n                break\n\n            price = buy[3]\n            dx_base = min(buy[1], base_balance, quote_value * K // price)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            buy[1] -= dx_base\n            buy[2] += dx_quote\n\n            if base_balance - dx_base < 0:\n                break\n            base_balance -= dx_base\n\n            if buy[1] == 0 or buy[1] // price == 0:\n                if buy[4]:\n                    prev_buy = get('trade', f'{pair}_buy', None, str(buy[4]))\n                    prev_buy[5] = buy[5]\n                    put(prev_buy[0], 'trade', f'{pair}_buy', prev_buy, str(buy[4]))\n\n                if buy[5]:\n                    next_buy = get('trade', f'{pair}_buy', None, str(buy[5]))\n                    next_buy[4] = buy[4]\n                    put(next_buy[0], 'trade', f'{pair}_buy', next_buy, str(buy[5]))\n\n                if buy[4] is not None and buy[5] is None:\n                    trade_buy_start = buy[4]\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n                elif buy[4] is None and buy[5] is None:\n                    trade_buy_new = get('trade', f'{pair}_buy_new', 1)\n                    trade_buy_start = trade_buy_new\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n\n                if buy[2] < 0:\n                    balance = get(quote_tick, 'balance', 0, buy[0])\n                    balance -= buy[2]\n                    assert balance >= 0\n                    put(buy[0], quote_tick, 'balance', balance, buy[0])\n    \n                put(buy[0], 'trade', f'{pair}_buy', None, str(trade_buy_no))\n            else:\n                put(buy[0], 'trade', f'{pair}_buy', buy, str(trade_buy_no))\n\n            balance = get(base_tick, 'balance', 0, buy[0])\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, buy[0])\n\n            quote_value -= dx_quote\n            assert quote_value >= 0\n            balance = get(quote_tick, 'balance', 0, addr)\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, addr)\n\n            if buy[4] is None:\n                break\n            trade_buy_no = buy[4]\n\n        assert base_balance >= 0\n        put(addr, base_tick, 'balance', base_balance, addr)\n"}["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", 3000000000000000000, -2997000000, 999000000, 4, null]["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", 1000000000000000000, -999000000, 999000000, null, 3]null["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", -1000000000000000000, 1500000000, 1500000000, 8, 3]["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", 1000000000000000000, -500000000, 500000000, 9, 4]["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", 10000000000000000000, -6000000000, 600000000, 3, 5]["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", 10000000000000000000, -7000000000, 700000000, 4, 6]null["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", 1550000000000000000000, -1162500000000, 750000000, 5, 7]["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", 0, -4, 760000000, 6, null]["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", 2077922077922077922, -1600, 770, null, 9]["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", 3000000000000000000, -900000000, 300000000, 8, 3]["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", -1666666666666666666, 3000000000, 1800000000, null, 6]{"votes": [], "require": [], "asset_permission": [], "sourcecode": "\ndef trade_market_order(info, args):\n    assert args['f'] == 'trade_market_order'\n    sender = info['sender']\n    handle = handle_lookup(sender)\n    addr = handle or sender\n\n    base_tick = args['a'][0]\n    quote_tick = args['a'][2]\n    assert set(base_tick) <= set(string.ascii_uppercase+'_')\n    assert set(quote_tick) <= set(string.ascii_uppercase+'_')\n    pair = '%s_%s' % tuple([base_tick, quote_tick])\n\n    base_value = args['a'][1]\n    quote_value = args['a'][3]\n    trade_sell_start = get('trade', f'{pair}_sell_start', 1)\n    trade_buy_start = get('trade', f'{pair}_buy_start', 1)\n\n    K = 10**18\n    if quote_value is None and int(base_value) < 0:\n        base_value = int(args['a'][1])\n        base_balance = get(base_tick, 'balance', 0, addr)\n        base_sum = 0\n\n        trade_buy_no = trade_buy_start\n        while True:\n            buy = get('trade', f'{pair}_buy', None, str(trade_buy_no))\n            if buy is None:\n                break\n\n            price = buy[3]\n            dx_base = min(buy[1], -buy[2] * K // price, -base_value)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            buy[1] -= dx_base\n            buy[2] += dx_quote\n\n            if base_balance - dx_base < 0:\n                break\n            base_balance -= dx_base\n            base_sum += dx_base\n\n            if buy[1] == 0 or buy[1] // price == 0:\n                if buy[4]:\n                    prev_buy = get('trade', f'{pair}_buy', None, str(buy[4]))\n                    prev_buy[5] = buy[5]\n                    put(prev_buy[0], 'trade', f'{pair}_buy', prev_buy, str(buy[4]))\n\n                if buy[5]:\n                    next_buy = get('trade', f'{pair}_buy', None, str(buy[5]))\n                    next_buy[4] = buy[4]\n                    put(next_buy[0], 'trade', f'{pair}_buy', next_buy, str(buy[5]))\n\n                if buy[4] is not None and buy[5] is None:\n                    trade_buy_start = buy[4]\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n                elif buy[4] is None and buy[5] is None:\n                    trade_buy_new = get('trade', f'{pair}_buy_new', 1)\n                    trade_buy_start = trade_buy_new\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n\n                if buy[2] < 0:\n                    balance = get(quote_tick, 'balance', 0, buy[0])\n                    balance -= buy[2]\n                    assert balance >= 0\n                    put(buy[0], quote_tick, 'balance', balance, buy[0])\n    \n                put(buy[0], 'trade', f'{pair}_buy', None, str(trade_buy_no))\n            else:\n                put(buy[0], 'trade', f'{pair}_buy', buy, str(trade_buy_no))\n\n            balance = get(base_tick, 'balance', 0, buy[0])\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, buy[0])\n\n            base_value += dx_base\n            assert base_value <= 0\n            balance = get(quote_tick, 'balance', 0, addr)\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, addr)\n\n            if buy[4] is None:\n                break\n            trade_buy_no = buy[4]\n\n        balance = get(base_tick, 'balance', 0, addr)\n        balance -= base_sum\n        assert balance >= 0\n        put(addr, base_tick, 'balance', balance, addr)\n\n    elif quote_value is None and int(base_value) > 0:\n        base_value = int(args['a'][1])\n        quote_balance = get(quote_tick, 'balance', 0, addr)\n        quote_sum = 0\n\n        trade_sell_no = trade_sell_start\n        while True:\n            sell = get('trade', f'{pair}_sell', None, str(trade_sell_no))\n            if sell is None:\n                break\n\n            price = sell[3]\n            dx_base = min(-sell[1], quote_balance * K // price, base_value)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            sell[1] += dx_base\n            sell[2] -= dx_quote\n\n            if quote_balance - dx_quote < 0:\n                break\n            quote_balance -= dx_quote\n            quote_sum += dx_quote\n\n            if sell[1] == 0 or sell[1] // price == 0:\n                if sell[4]:\n                    prev_sell = get('trade', f'{pair}_sell', None, str(sell[4]))\n                    prev_sell[5] = sell[5]\n                    put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n                if sell[5]:\n                    next_sell = get('trade', f'{pair}_sell', None, str(sell[5]))\n                    next_sell[4] = sell[4]\n                    put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n                if sell[4] is not None and sell[5] is None:\n                    trade_sell_start = sell[4]\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n                elif sell[4] is None and sell[5] is None:\n                    trade_sell_new = get('trade', f'{pair}_sell_new', 1)\n                    trade_sell_start = trade_sell_new\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n\n                if sell[1] < 0:\n                    balance = get(base_tick, 'balance', 0, sell[0])\n                    balance -= sell[1]\n                    assert balance >= 0\n                    put(sell[0], base_tick, 'balance', balance, sell[0])\n\n                put(sell[0], 'trade', f'{pair}_sell', None, str(trade_sell_no))\n            else:\n                put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_sell_no))\n\n            balance = get(quote_tick, 'balance', 0, sell[0])\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, sell[0])\n\n            base_value -= dx_base\n            assert base_value >= 0\n            balance = get(base_tick, 'balance', 0, addr)\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, addr)\n\n            if sell[4] is None:\n                break\n            trade_sell_no = sell[4]\n\n        balance = get(quote_tick, 'balance', 0, addr)\n        balance -= quote_sum\n        assert balance >= 0\n        put(addr, quote_tick, 'balance', balance, addr)\n\n    elif base_value is None and int(quote_value) < 0:\n        quote_value = int(args['a'][3])\n        quote_balance = get(quote_tick, 'balance', 0, addr)\n        quote_sum = 0\n\n        trade_sell_no = trade_sell_start\n        while True:\n            sell = get('trade', f'{pair}_sell', None, str(trade_sell_no))\n            if sell is None:\n                break\n\n            price = sell[3]\n            dx_base = min(-sell[1], -quote_value * K // price)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or  dx_quote == 0:\n                break\n            sell[1] += dx_base\n            sell[2] -= dx_quote\n\n            if quote_balance - dx_quote < 0:\n                break\n            quote_balance -= dx_quote\n            quote_sum += dx_quote\n\n            if sell[1] == 0 or sell[1] // price == 0:\n                if sell[4]:\n                    prev_sell = get('trade', f'{pair}_sell', None, str(sell[4]))\n                    prev_sell[5] = sell[5]\n                    put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n                if sell[5]:\n                    next_sell = get('trade', f'{pair}_sell', None, str(sell[5]))\n                    next_sell[4] = sell[4]\n                    put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n                if sell[4] is not None and sell[5] is None:\n                    trade_sell_start = sell[4]\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n                elif sell[4] is None and sell[5] is None:\n                    trade_sell_new = get('trade', f'{pair}_sell_new', 1)\n                    trade_sell_start = trade_sell_new\n                    put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n\n                if sell[1] < 0:\n                    balance = get(base_tick, 'balance', 0, sell[0])\n                    balance -= sell[1]\n                    assert balance >= 0\n                    put(sell[0], base_tick, 'balance', balance, sell[0])\n\n                put(sell[0], 'trade', f'{pair}_sell', None, str(trade_sell_no))\n            else:\n                put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_sell_no))\n\n            balance = get(quote_tick, 'balance', 0, sell[0])\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, sell[0])\n\n            quote_value += dx_quote\n            assert quote_value <= 0\n            balance = get(base_tick, 'balance', 0, addr)\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, addr)\n\n            if sell[4] is None:\n                break\n            trade_sell_no = sell[4]\n\n        balance = get(quote_tick, 'balance', 0, addr)\n        balance -= quote_sum\n        assert balance >= 0\n        put(addr, quote_tick, 'balance', balance, addr)\n\n    elif base_value is None and int(quote_value) > 0:\n        # this is a sell, get USDC by selling BTC\n        quote_value = int(args['a'][3])\n        base_balance = get(base_tick, 'balance', 0, addr)\n        base_sum = 0\n\n        trade_buy_no = trade_buy_start\n        while True:\n            buy = get('trade', f'{pair}_buy', None, str(trade_buy_no))\n            if buy is None:\n                break\n\n            price = buy[3]\n            dx_base = min(buy[1], base_balance, quote_value * K // price)\n            dx_quote = dx_base * price // K\n            if dx_base == 0 or dx_quote == 0:\n                break\n            buy[1] -= dx_base\n            buy[2] += dx_quote\n\n            if base_balance - dx_base < 0:\n                break\n            base_balance -= dx_base\n            base_sum += dx_base\n\n            if buy[1] == 0 or buy[1] // price == 0:\n                if buy[4]:\n                    prev_buy = get('trade', f'{pair}_buy', None, str(buy[4]))\n                    prev_buy[5] = buy[5]\n                    put(prev_buy[0], 'trade', f'{pair}_buy', prev_buy, str(buy[4]))\n\n                if buy[5]:\n                    next_buy = get('trade', f'{pair}_buy', None, str(buy[5]))\n                    next_buy[4] = buy[4]\n                    put(next_buy[0], 'trade', f'{pair}_buy', next_buy, str(buy[5]))\n\n                if buy[4] is not None and buy[5] is None:\n                    trade_buy_start = buy[4]\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n                elif buy[4] is None and buy[5] is None:\n                    trade_buy_new = get('trade', f'{pair}_buy_new', 1)\n                    trade_buy_start = trade_buy_new\n                    put(addr, 'trade', f'{pair}_buy_start', trade_buy_start)\n\n                if buy[2] < 0:\n                    balance = get(quote_tick, 'balance', 0, buy[0])\n                    balance -= buy[2]\n                    assert balance >= 0\n                    put(buy[0], quote_tick, 'balance', balance, buy[0])\n    \n                put(buy[0], 'trade', f'{pair}_buy', None, str(trade_buy_no))\n            else:\n                put(buy[0], 'trade', f'{pair}_buy', buy, str(trade_buy_no))\n\n            balance = get(base_tick, 'balance', 0, buy[0])\n            balance += dx_base\n            assert balance >= 0\n            put(addr, base_tick, 'balance', balance, buy[0])\n\n            quote_value -= dx_quote\n            assert quote_value >= 0\n            balance = get(quote_tick, 'balance', 0, addr)\n            balance += dx_quote\n            assert balance >= 0\n            put(addr, quote_tick, 'balance', balance, addr)\n\n            if buy[4] is None:\n                break\n            trade_buy_no = buy[4]\n\n        balance = get(base_tick, 'balance', 0, addr)\n        balance -= base_sum\n        assert balance >= 0\n        put(addr, base_tick, 'balance', balance, addr)\n"}["transfer", "approve", "transfer_from", "token_mint_once", "asset_update_ownership", "asset_update_functions"]"0x719c8d75faf8f1b117ea56205414892caab4a1b7"6"Mock USDT"100000000100000000["transfer", "approve", "transfer_from", "token_mint_once", "asset_update_ownership", "asset_update_functions"]"0x719c8d75faf8f1b117ea56205414892caab4a1b7"18"Mock ETH"278100000371331009034562454042100000011012500000000000000null