["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"
99999998575302998392
1000000000
["transfer", "approve", "transfer_from", "token_mint_once", "asset_update_ownership", "asset_update_functions"]
"0x376d3737da2a540318bba02a98f03a97d1dd8f6d"
18
"Test Zentra Token"
21000000
21000000
["transfer", "approve", "transfer_from", "token_mint_once", "asset_update_ownership", "asset_update_functions"]
"0x376d3737da2a540318bba02a98f03a97d1dd8f6d"
18
"Mock Bitcoin"
20999982256674461888992201
21000000000000000000000000
7
["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", -778221778221778222, 779000005, 1001000000, 2, null]
9
2
["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]
3
3
5
["0x376d3737da2a540318bba02a98f03a97d1dd8f6d", -1000000000000000000, 999000000, 999000000, null, null]
121000003
1880119880119880120
["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"
100000000
100000000
["transfer", "approve", "transfer_from", "token_mint_once", "asset_update_ownership", "asset_update_functions"]
"0x719c8d75faf8f1b117ea56205414892caab4a1b7"
18
"Mock ETH"
2781000003
7133100903456245404
210000001
1012500000000000000
null