null
null
null
null
null
[3820754, "0xe135014f069e42d91e99498e25888c7513f9c0e4"]
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
{"functions": [], "snippet": "K = 10**18\n\ndef _insert_order(addr, pair, order_type, order_start, order_new, quote_value, base_value):\n assert order_type in ['buy', 'sell']\n price = - quote_value * K // base_value\n order_id = order_start\n while True:\n order, _ = get('predict', f'{pair}_{order_type}', None, str(order_id))\n\n if order is None:\n put(addr, 'predict', f'{pair}_{order_type}',\n [addr, base_value, quote_value, price, None, None], str(order_new))\n order_new += 1\n put(addr, 'predict', f'{pair}_{order_type}_new', order_new)\n break\n\n if order_type == 'buy':\n cond = price > order[3]\n else:\n cond = price < order[3]\n\n if cond:\n next_order_id = order[5]\n put(addr, 'predict', f'{pair}_{order_type}',\n [addr, base_value, quote_value, price, order_id, next_order_id], str(order_new))\n if next_order_id is None:\n order_start = order_new\n put(addr, 'predict', f'{pair}_{order_type}_start', order_new)\n order[5] = order_new\n order_new += 1\n put(addr, 'predict', f'{pair}_{order_type}_new', order_new)\n\n put(addr, 'predict', f'{pair}_{order_type}', order, str(order_id))\n if next_order_id is not None:\n next_order, _ = get('predict', f'{pair}_{order_type}', None, str(next_order_id))\n if next_order is not None:\n next_order[4] = order[5]\n put(addr, 'predict', f'{pair}_{order_type}', next_order, str(next_order_id))\n break\n\n if order[4] is None:\n put(addr, 'predict', f'{pair}_{order_type}',\n [addr, base_value, quote_value, price, None, order_id], str(order_new))\n put(addr, 'predict', f'{pair}_{order_type}',\n [order[0], order[1], order[2], order[3], order_new, order[5]], str(order_id))\n order_new += 1\n put(addr, 'predict', f'{pair}_{order_type}_new', order_new)\n break\n\n order_id = order[4]\n return order_start, order_new\n\ndef _remove_order(addr, pair, order, order_start, buy_or_sell):\n assert buy_or_sell in ['buy', 'sell']\n if order[4]:\n prev_order, _ = get('predict', f'{pair}_{buy_or_sell}', None, str(order[4]))\n prev_order[5] = order[5]\n put(prev_order[0], 'predict', f'{pair}_{buy_or_sell}', prev_order, str(order[4]))\n\n if order[5]:\n next_order, _ = get('predict', f'{pair}_{buy_or_sell}', None, str(order[5]))\n next_order[4] = order[4]\n put(next_order[0], 'predict', f'{pair}_{buy_or_sell}', next_order, str(order[5]))\n\n if order[4] is not None and order[5] is None:\n order_start = order[4]\n put(addr, 'predict', f'{pair}_{buy_or_sell}_start', order_start)\n\n elif order[4] is None and order[5] is None:\n order_new, _ = get('predict', f'{pair}_{buy_or_sell}_new', 1)\n order_start = order_new\n put(addr, 'predict', f'{pair}_{buy_or_sell}_start', order_start)\n\n return order_start\n\ndef _update_slug_balance(addr, slug, tick, delta):\n prev, manager = get('predict', f'{slug}_{tick}_balance_new', None)\n balance_tuple, _ = get('predict', f'{slug}_{tick}_balance', None, addr)\n if balance_tuple is None:\n balance = 0\n put(manager, 'predict', f'{slug}_{tick}_balance_new', addr)\n else:\n balance = balance_tuple[0]\n prev = balance_tuple[1]\n balance += delta\n assert balance >= 0\n put(addr, 'predict', f'{slug}_{tick}_balance', [balance, prev], addr)\n\ndef _update_quote_balance(addr, quote_tick, delta):\n balance, _ = get(quote_tick, 'balance', 0, addr)\n balance += delta\n assert balance >= 0\n put(addr, quote_tick, 'balance', balance, addr)\n\n\ndef predict_limit_order(info, args):\n assert args['f'] == 'predict_limit_order'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n slug = args['a'][0]\n yes_or_no = args['a'][2]\n assert set(slug) <= set(string.ascii_lowercase+string.digits+'_')\n assert yes_or_no in set(['yes', 'no'])\n\n pair = f'{slug}_{yes_or_no}'\n base_value = int(args['a'][1])\n quote_value = int(args['a'][3])\n assert base_value * quote_value < 0\n\n quote_tick, _ = get('predict', f'{slug}_quote_token', None)\n assert quote_tick, \"Slug not exists\"\n\n predict_buy_start, _ = get('predict', f'{pair}_buy_start', 1)\n predict_buy_new, _ = get('predict', f'{pair}_buy_new', 1)\n predict_sell_start, _ = get('predict', f'{pair}_sell_start', 1)\n predict_sell_new, _ = get('predict', f'{pair}_sell_new', 1)\n\n if base_value < 0 and quote_value > 0:\n buy_or_sell = 'sell'\n _update_slug_balance(addr, slug, yes_or_no, base_value)\n make_base = - base_value\n\n order_id = predict_sell_new\n predict_sell_start, predict_sell_new = _insert_order(addr, pair, 'sell', predict_sell_start, predict_sell_new, quote_value, base_value)\n\n elif base_value > 0 and quote_value < 0:\n buy_or_sell = 'buy'\n _update_quote_balance(addr, quote_tick, quote_value)\n make_base = base_value\n\n order_id = predict_buy_new\n predict_buy_start, predict_buy_new = _insert_order(addr, pair, 'buy', predict_buy_start, predict_buy_new, quote_value, base_value)\n\n predict_sell_id = predict_sell_start\n highest_buy_price = None\n\n take_base = 0\n take_quote = 0\n while True:\n sell, _ = get('predict', f'{pair}_sell', None, str(predict_sell_id))\n if not sell:\n break\n sell_price = sell[3]\n if highest_buy_price and sell_price > highest_buy_price:\n break\n\n predict_buy_id = predict_buy_start\n while True:\n buy, _ = get('predict', f'{pair}_buy', None, str(predict_buy_id))\n if not buy:\n break\n buy_price = buy[3]\n if highest_buy_price is None:\n highest_buy_price = buy_price\n if sell_price > buy_price:\n predict_buy_id = buy[4]\n continue\n\n matched_price = sell_price\n dx_base = min(-sell[1], buy[1])\n dx_quote = dx_base * matched_price // K\n sell[1] += dx_base\n sell[2] -= dx_quote\n buy[1] -= dx_base\n buy[2] += dx_quote\n take_base += dx_base\n take_quote += dx_quote\n\n _update_slug_balance(buy[0], slug, yes_or_no, dx_base)\n _update_quote_balance(sell[0], quote_tick, dx_quote)\n if buy[1] == 0:\n predict_buy_start = _remove_order(addr, pair, buy, predict_buy_start, 'buy')\n\n if buy[2] < 0:\n _update_quote_balance(buy[0], quote_tick, -buy[2])\n\n put(buy[0], 'predict', f'{pair}_buy', None, str(predict_buy_id))\n else:\n put(buy[0], 'predict', f'{pair}_buy', buy, str(predict_buy_id))\n\n if sell[1] == 0:\n break\n if buy[4] is None:\n break\n predict_buy_id = buy[4]\n\n if sell[1] == 0:\n predict_sell_start = _remove_order(addr, pair, sell, predict_sell_start, 'sell')\n\n if sell[1] < 0:\n _update_slug_balance(sell[0], slug, yes_or_no, -sell[1])\n\n put(sell[0], 'predict', f'{pair}_sell', None, str(predict_sell_id))\n else:\n put(sell[0], 'predict', f'{pair}_sell', sell, str(predict_sell_id))\n\n if sell[4] is None:\n break\n predict_sell_id = sell[4]\n\n make_base -= take_base\n assert make_base >= 0\n make_price = - quote_value * K // base_value\n event('PredictLimitMake', [pair, buy_or_sell, addr, make_base, make_price, order_id])\n if take_base > 0:\n take_price = take_quote * K // take_base\n event('PredictLimitTake', [pair, buy_or_sell, addr, take_base, take_price, order_id])\n\n\ndef predict_market_order(info, args):\n assert args['f'] == 'predict_market_order'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n slug = args['a'][0]\n yes_or_no = args['a'][2]\n assert set(slug) <= set(string.ascii_lowercase+string.digits+'_')\n assert yes_or_no in set(['yes', 'no'])\n\n quote_tick, _ = get('predict', f'{slug}_quote_token', None)\n assert quote_tick, \"Slug not exists\"\n pair = f'{slug}_{yes_or_no}'\n\n base_value = args['a'][1]\n quote_value = args['a'][3]\n predict_sell_start, _ = get('predict', f'{pair}_sell_start', 1)\n predict_buy_start, _ = get('predict', f'{pair}_buy_start', 1)\n\n take_base = 0\n take_quote = 0\n if quote_value is None and int(base_value) < 0:\n buy_or_sell = 'sell'\n base_value = int(args['a'][1])\n [base_balance, _], _ = get('predict', f'{pair}_balance', [0, None], addr)\n\n predict_buy_id = predict_buy_start\n while True:\n buy, _ = get('predict', f'{pair}_buy', None, str(predict_buy_id))\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 if base_balance - dx_base < 0:\n break\n buy[1] -= dx_base\n buy[2] += dx_quote\n take_base += dx_base\n take_quote += dx_quote\n base_balance -= dx_base\n\n if buy[1] == 0 or buy[1] * K // price == 0:\n predict_buy_start = _remove_order(addr, pair, buy, predict_buy_start, 'buy')\n if buy[2] < 0:\n _update_quote_balance(buy[0], quote_tick, -buy[2])\n\n put(buy[0], 'predict', f'{pair}_buy', None, str(predict_buy_id))\n else:\n put(buy[0], 'predict', f'{pair}_buy', buy, str(predict_buy_id))\n\n _update_slug_balance(buy[0], slug, yes_or_no, dx_base)\n base_value += dx_base\n assert base_value <= 0\n _update_quote_balance(addr, quote_tick, dx_quote)\n if buy[4] is None:\n break\n predict_buy_id = buy[4]\n\n _update_slug_balance(addr, slug, yes_or_no, -take_base)\n\n elif quote_value is None and int(base_value) > 0:\n buy_or_sell = 'buy'\n base_value = int(args['a'][1])\n quote_balance, _ = get(quote_tick, 'balance', 0, addr)\n\n predict_sell_id = predict_sell_start\n while True:\n sell, _ = get('predict', f'{pair}_sell', None, str(predict_sell_id))\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 if quote_balance - dx_quote < 0:\n break\n\n sell[1] += dx_base\n sell[2] -= dx_quote\n take_base += dx_base\n take_quote += dx_quote\n quote_balance -= dx_quote\n\n if sell[1] == 0 or sell[1] * K // price == 0:\n predict_sell_start = _remove_order(addr, pair, sell, predict_sell_start, 'sell')\n if sell[1] < 0:\n _update_slug_balance(sell[0], slug, yes_or_no, -sell[1])\n\n put(sell[0], 'predict', f'{pair}_sell', None, str(predict_sell_id))\n else:\n put(sell[0], 'predict', f'{pair}_sell', sell, str(predict_sell_id))\n\n _update_quote_balance(sell[0], quote_tick, dx_quote)\n base_value -= dx_base\n assert base_value >= 0\n _update_slug_balance(addr, slug, yes_or_no, dx_base)\n if sell[4] is None:\n break\n predict_sell_id = sell[4]\n\n _update_quote_balance(addr, quote_tick, -take_quote)\n\n elif base_value is None and int(quote_value) < 0:\n buy_or_sell = 'buy'\n quote_value = int(args['a'][3])\n quote_balance, _ = get(quote_tick, 'balance', 0, addr)\n\n predict_sell_id = predict_sell_start\n while True:\n sell, _ = get('predict', f'{pair}_sell', None, str(predict_sell_id))\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 if quote_balance - dx_quote < 0:\n break\n\n sell[1] += dx_base\n sell[2] -= dx_quote\n take_base += dx_base\n take_quote += dx_quote\n quote_balance -= dx_quote\n\n if sell[1] == 0 or sell[1] * K // price == 0:\n predict_sell_start = _remove_order(addr, pair, sell, predict_sell_start, 'sell')\n if sell[1] < 0:\n _update_slug_balance(sell[0], slug, yes_or_no, -sell[1])\n\n put(sell[0], 'predict', f'{pair}_sell', None, str(predict_sell_id))\n else:\n put(sell[0], 'predict', f'{pair}_sell', sell, str(predict_sell_id))\n\n _update_quote_balance(sell[0], quote_tick, dx_quote)\n quote_value += dx_quote\n assert quote_value <= 0\n _update_slug_balance(addr, slug, yes_or_no, dx_base)\n if sell[4] is None:\n break\n predict_sell_id = sell[4]\n\n _update_quote_balance(addr, quote_tick, -take_quote)\n\n elif base_value is None and int(quote_value) > 0:\n buy_or_sell = 'sell'\n quote_value = int(args['a'][3])\n [base_balance, _], _ = get('predict', f'{pair}_balance', [0, None], addr)\n\n predict_buy_id = predict_buy_start\n while True:\n buy, _ = get('predict', f'{pair}_buy', None, str(predict_buy_id))\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 if base_balance - dx_base < 0:\n break\n\n buy[1] -= dx_base\n buy[2] += dx_quote\n take_base += dx_base\n take_quote += dx_quote\n base_balance -= dx_base\n\n if buy[1] == 0 or buy[1] * K // price == 0:\n predict_buy_start = _remove_order(addr, pair, buy, predict_buy_start, 'buy')\n if buy[2] < 0:\n _update_quote_balance(buy[0], quote_tick, -buy[2])\n\n put(buy[0], 'predict', f'{pair}_buy', None, str(predict_buy_id))\n else:\n put(buy[0], 'predict', f'{pair}_buy', buy, str(predict_buy_id))\n\n _update_slug_balance(buy[0], slug, yes_or_no, dx_base)\n quote_value -= dx_quote\n assert quote_value >= 0\n _update_quote_balance(addr, quote_tick, dx_quote)\n if buy[4] is None:\n break\n predict_buy_id = buy[4]\n\n _update_slug_balance(addr, slug, yes_or_no, -take_base)\n\n if take_base > 0:\n price = take_quote * K // take_base\n event('PredictMarketTake', [pair, buy_or_sell, addr, take_base, price])\n\n\ndef predict_limit_order_cancel(info, args):\n assert args['f'] == 'predict_limit_order_cancel'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n slug = args['a'][0]\n yes_or_no = args['a'][1]\n buy_or_sell = args['a'][2]\n predict_order_id = int(args['a'][3])\n assert set(slug) <= set(string.ascii_lowercase+string.digits+'_')\n assert yes_or_no in set(['yes', 'no'])\n assert buy_or_sell in ['buy', 'sell']\n assert predict_order_id > 0\n\n pair = f'{slug}_{yes_or_no}'\n order_key = f'{pair}_{buy_or_sell}'\n quote_tick, _ = get('predict', f'{slug}_quote_token', None)\n order, _ = get('predict', order_key, None, str(predict_order_id))\n\n if order is None:\n return\n\n assert order[0] == addr, \"Sender is not the owner of the order\"\n prev_order_id = order[4]\n next_order_id = order[5]\n\n if prev_order_id is not None:\n prev_order, _ = get('predict', order_key, None, str(prev_order_id))\n if prev_order:\n prev_order[5] = next_order_id\n put(prev_order[0], 'predict', order_key, prev_order, str(prev_order_id))\n\n if next_order_id is not None:\n next_order, _ = get('predict', order_key, None, str(next_order_id))\n if next_order:\n next_order[4] = prev_order_id\n put(next_order[0], 'predict', order_key, next_order, str(next_order_id))\n\n start_key = f'{pair}_{buy_or_sell}_start'\n current_start, _ = get('predict', start_key, 1)\n if current_start == predict_order_id:\n if prev_order_id is not None:\n put(addr, 'predict', start_key, prev_order_id)\n else:\n new_start_key = f'{pair}_{buy_or_sell}_new'\n new_start_val, _ = get('predict', new_start_key, 1)\n put(addr, 'predict', start_key, new_start_val)\n\n if buy_or_sell == 'sell':\n if order[1] < 0:\n _update_slug_balance(addr, slug, yes_or_no, -order[1])\n elif buy_or_sell == 'buy':\n if order[2] < 0:\n _update_quote_balance(addr, quote_tick, -order[2])\n\n put(addr, 'predict', order_key, None, str(predict_order_id))\n event('PredictOrderCancel', [predict_order_id, buy_or_sell, pair])\n\n\ndef predict_create(info, args):\n assert args['f'] == 'predict_create'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n slug = args['a'][0]\n quote_tick = args['a'][1]\n assert set(slug) <= set(string.ascii_lowercase+string.digits+'_')\n\n quote_tokens, _ = get('predict', 'quote_tokens', [])\n assert quote_tick in quote_tokens, f'{quote_tick} is not a designated quote token'\n\n manager, _ = get('predict', 'manager', None)\n assert manager == addr, f\"Sender must be the owner of predict system\"\n created, _ = get('predict', f'{slug}_quote_token', None)\n assert created is None, \"Slug already exists\"\n put(addr, 'predict', f'{slug}_quote_token', quote_tick)\n\n put(addr, 'predict', f'{slug}_yes_buy_start', 1)\n put(addr, 'predict', f'{slug}_yes_buy_new', 1)\n put(addr, 'predict', f'{slug}_yes_sell_start', 1)\n put(addr, 'predict', f'{slug}_yes_sell_new', 1)\n put(addr, 'predict', f'{slug}_yes_balance_new', None)\n\n put(addr, 'predict', f'{slug}_no_buy_start', 1)\n put(addr, 'predict', f'{slug}_no_buy_new', 1)\n put(addr, 'predict', f'{slug}_no_sell_start', 1)\n put(addr, 'predict', f'{slug}_no_sell_new', 1)\n put(addr, 'predict', f'{slug}_no_balance_new', None)\n\n event('PredictCreate', [slug, quote_tick, addr])\n\n\ndef predict_mint(info, args):\n assert args['f'] == 'predict_mint'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n slug = args['a'][0]\n assert set(slug) <= set(string.ascii_lowercase+string.digits+'_')\n\n quote_tick, _ = get('predict', f'{slug}_quote_token', None)\n assert quote_tick, \"Slug is not created\"\n\n quote_value = int(args['a'][1])\n assert quote_value > 0\n\n _update_quote_balance(addr, quote_tick, -quote_value)\n\n #TODO: move the balance to the predict slug\n\n for tick in ['yes', 'no']:\n _update_slug_balance(addr, slug, tick, quote_value)\n\n event('PredictMint', [slug, addr, quote_value])\n\n\ndef predict_submit(info, args):\n assert args['f'] == 'predict_submit'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n manager, _ = get('predict', 'manager', None)\n assert manager is not None, \"Manager not set\"\n assert addr == manager, \"Only the manager can submit result\"\n\n slug = args['a'][0]\n yes_or_no = args['a'][1]\n assert set(slug) <= set(string.ascii_lowercase+string.digits+'_')\n assert yes_or_no in set(['yes', 'no'])\n lose_tick = 'no' if yes_or_no == 'yes' else 'yes'\n\n quote_tick, _ = get('predict', f'{slug}_quote_token', None)\n assert quote_tick, \"Slug not exists\"\n\n win_pair = f'{slug}_{yes_or_no}'\n win_sell_start, _ = get('predict', f'{win_pair}_sell_start', 1)\n win_buy_start, _ = get('predict', f'{win_pair}_buy_start', 1)\n\n predict_sell_id = win_sell_start\n while True:\n sell, _ = get('predict', f'{win_pair}_sell', None, str(predict_sell_id))\n if not sell:\n break\n next_id = sell[4]\n if sell[1] < 0:\n _update_slug_balance(sell[0], slug, yes_or_no, -sell[1])\n put(sell[0], 'predict', f'{win_pair}_sell', None, str(predict_sell_id))\n if next_id is None:\n break\n predict_sell_id = next_id\n\n predict_buy_id = win_buy_start\n while True:\n buy, _ = get('predict', f'{win_pair}_buy', None, str(predict_buy_id))\n if not buy:\n break\n next_id = buy[4]\n if buy[2] < 0:\n _update_quote_balance(buy[0], quote_tick, -buy[2])\n put(buy[0], 'predict', f'{win_pair}_buy', None, str(predict_buy_id))\n if next_id is None:\n break\n predict_buy_id = next_id\n\n put(addr, 'predict', f'{win_pair}_sell_start', None)\n put(addr, 'predict', f'{win_pair}_sell_new', None)\n put(addr, 'predict', f'{win_pair}_buy_start', None)\n put(addr, 'predict', f'{win_pair}_buy_new', None)\n\n win_balance_new, _ = get('predict', f'{win_pair}_balance_new', None)\n current_addr = win_balance_new\n while current_addr is not None:\n balance_tuple, _ = get('predict', f'{win_pair}_balance', None, current_addr)\n if balance_tuple is None:\n break\n balance, prev = balance_tuple\n assert balance >= 0\n _update_quote_balance(current_addr, quote_tick, balance)\n put(current_addr, 'predict', f'{win_pair}_balance', None, current_addr)\n current_addr = prev\n put(addr, 'predict', f'{win_pair}_balance_new', None)\n\n lose_pair = f'{slug}_{lose_tick}'\n lose_sell_start, _ = get('predict', f'{lose_pair}_sell_start', 1)\n lose_buy_start, _ = get('predict', f'{lose_pair}_buy_start', 1)\n\n predict_sell_id = lose_sell_start\n while True:\n sell, _ = get('predict', f'{lose_pair}_sell', None, str(predict_sell_id))\n if not sell:\n break\n next_id = sell[4]\n put(sell[0], 'predict', f'{lose_pair}_sell', None, str(predict_sell_id))\n if next_id is None:\n break\n predict_sell_id = next_id\n\n predict_buy_id = lose_buy_start\n while True:\n buy, _ = get('predict', f'{lose_pair}_buy', None, str(predict_buy_id))\n if not buy:\n break\n next_id = buy[4]\n put(buy[0], 'predict', f'{lose_pair}_buy', None, str(predict_buy_id))\n if next_id is None:\n break\n predict_buy_id = next_id\n\n put(addr, 'predict', f'{lose_pair}_sell_start', None)\n put(addr, 'predict', f'{lose_pair}_sell_new', None)\n put(addr, 'predict', f'{lose_pair}_buy_start', None)\n put(addr, 'predict', f'{lose_pair}_buy_new', None)\n\n balance_new, _ = get('predict', f'{lose_pair}_balance_new', None)\n current_addr = balance_new\n while current_addr is not None:\n balance_tuple, _ = get('predict', f'{lose_pair}_balance', None, current_addr)\n if balance_tuple is None:\n break\n _, prev = balance_tuple\n put(current_addr, 'predict', f'{lose_pair}_balance', None, current_addr)\n current_addr = prev\n put(addr, 'predict', f'{lose_pair}_balance_new', None)\n\n put(addr, 'predict', f'{slug}_quote_token', None)\n event('PredictSubmit', [slug, yes_or_no])\n\n\ndef predict_set_quote_token(info, args):\n assert args['f'] == 'predict_set_quote_token'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n manager, _ = get('predict', 'manager', None)\n assert manager is not None, \"Manager not set\"\n assert addr == manager, \"Only the manager can add quote tokens\"\n\n new_tokens = args['a'][0]\n assert isinstance(new_tokens, list), \"Quote tokens must be a list\"\n\n quote_tokens, _ = get('predict', 'quote_tokens', [])\n\n for token in new_tokens:\n assert isinstance(token, str), \"Token ticker must be a string\"\n assert set(token) <= set(string.ascii_uppercase+'_'), \"Invalid characters in token ticker\"\n if token not in quote_tokens:\n quote_tokens.append(token)\n\n put(addr, 'predict', 'quote_tokens', quote_tokens)\n\n\ndef predict_update_manager(info, args):\n assert args['f'] == 'predict_update_manager'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n manager, _ = get('predict', 'manager', None)\n if manager is not None:\n assert addr == manager, \"Only the current manager can change manager\"\n\n user = args['a'][0]\n assert isinstance(user, str), \"User address must be a string\"\n put(addr, 'predict', 'manager', user)\n event('PredictUpdateManager', [addr, user])\n\n\ndef predict_vote_manager(info, args):\n assert args['f'] == 'predict_vote_manager'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n manager, _ = get('predict', 'manager', None)\n assert manager is None, \"Manager already set, use predict_set_manager instead\"\n\n committee_members, _ = get('committee', 'members', [])\n committee_members = set(committee_members)\n assert addr in committee_members, \"Only committee members can vote\"\n\n user = args['a'][0]\n assert isinstance(user, str), \"User address must be a string\"\n\n proposal_key = f'predict_manager:{user}'\n votes, _ = get('committee', 'proposal', [], proposal_key)\n votes = set(votes)\n votes.add(addr)\n\n if len(votes) >= len(committee_members) * 2 // 3:\n put(addr, 'predict', 'manager', user)\n put(addr, 'committee', 'proposal', [], proposal_key)\n event('PredictUpdateManager', [list(votes), user])\n else:\n put(addr, 'committee', 'proposal', list(votes), proposal_key)\n\n"}
{"votes": [], "snippets": ["04352fc7b561c7db28011382c70f45376020fe8f113ce18f6b5b72b17a16318f"], "functions": ["predict_create", "predict_mint", "predict_submit", "predict_limit_order", "predict_market_order", "predict_limit_order_cancel", "predict_set_quote_token", "predict_vote_manager"]}
194650002
[3790955, "0x719c8d75faf8f1b117ea56205414892caab4a1b7"]
[6179246, "0x719c8d75faf8f1b117ea56205414892caab4a1b7"]
{"functions": ["function_vote", "function_proposal", "function_snippet_clear", "function_delete_proposal", "function_delete_vote", "function_snippet"], "snippet": "def function_snippet(info, args):\n assert args['f'] == 'function_snippet'\n sender = info['sender']\n addr = handle_lookup(sender)\n snippet = args['a'][0]\n snippet_digest = hashlib.sha256(snippet.encode('utf8')).hexdigest()\n existing, _ = get('function', 'snippet', None, snippet_digest)\n if existing:\n # Already published (content-addressed by digest); keep its bindings.\n return\n put(addr, 'function', 'snippet', {\n 'snippet': snippet,\n 'functions': []\n }, snippet_digest)\n event('NewFunctionSnippet', [snippet_digest])\n\n\ndef function_snippet_clear(info, args):\n assert args['f'] == 'function_snippet_clear'\n snippet_digest = args['a'][0]\n snippet, snippet_owner = get('function', 'snippet', None, snippet_digest)\n assert snippet, \"Snippet not found: %s\" % snippet_digest\n assert snippet['functions'] == [], \"Snippet is not empty: %s\" % snippet\n put(snippet_owner, 'function', 'snippet', None, snippet_digest)\n event('RemoveFunctionSnippet', [snippet_digest])\n\n\ndef function_proposal(info, args):\n assert args['f'] == 'function_proposal'\n sender = info['sender']\n addr = handle_lookup(sender)\n func_names = args['a'][0]\n snippet_digests = args['a'][1]\n for func_name in func_names:\n assert set(func_name) <= set(string.ascii_lowercase+string.digits+'_')\n assert not func_name.startswith('_')\n\n snippet_digests = args['a'][1]\n for snippet_digest in snippet_digests:\n assert set(snippet_digest) <= set(string.ascii_lowercase+string.digits)\n assert len(snippet_digest) == 64\n\n proposal_id, _ = get('function', 'proposal_count', 0)\n proposal_id += 1\n put(addr, 'function', 'proposal_count', proposal_id)\n\n put(addr, 'function', 'proposal', {\n 'functions': func_names,\n 'snippets': snippet_digests,\n 'votes': []\n }, '%s' % (proposal_id))\n event('FunctionProposal', [proposal_id, func_names])\n\n\ndef function_vote(info, args):\n assert args['f'] == 'function_vote'\n sender = info['sender']\n addr = handle_lookup(sender)\n committee_members, _ = get('committee', 'members', [])\n committee_members = set(committee_members)\n assert addr in committee_members\n\n proposal_id = args['a'][0]\n proposal, _ = get('function', 'proposal', None, '%s' % proposal_id)\n assert proposal\n votes = set(proposal['votes'])\n votes.add(addr)\n proposal['votes'] = list(votes)\n\n # print(len(votes), len(committee_members), len(committee_members)*2//3)\n if len(votes) >= len(committee_members)*2//3:\n assert len(proposal['snippets']) > 0\n for snippet_hash in proposal['snippets']:\n assert set(snippet_hash) <= set(string.ascii_lowercase+string.digits)\n snippet, snippet_owner = get('function', 'snippet', None, snippet_hash)\n assert snippet, \"Snippet not found: %s\" % snippet_hash\n functions = snippet['functions']\n functions.extend(proposal['functions'])\n snippet['functions'] = list(set(functions))\n put(snippet_owner, 'function', 'snippet', snippet, snippet_hash)\n\n assert len(proposal['functions']) > 0\n for func_name in proposal['functions']:\n # Unbind the function from any snippet it was previously bound to\n # (other than the ones in this proposal). This leaves the old\n # snippet empty so it can be safely cleared later instead of\n # occupying global state forever.\n old_code, _ = get('function', 'code', None, func_name)\n if old_code:\n for old_hash in old_code.get('snippets', []):\n if old_hash in proposal['snippets']:\n continue\n old_snippet, old_snippet_owner = get('function', 'snippet', None, old_hash)\n if not old_snippet:\n continue\n functions = old_snippet['functions']\n if func_name in functions:\n functions.remove(func_name)\n old_snippet['functions'] = functions\n put(old_snippet_owner, 'function', 'snippet', old_snippet, old_hash)\n\n put(addr, 'function', 'code', {\n 'snippets': proposal['snippets']\n }, func_name)\n\n event('NewFunctions', [proposal_id, proposal['functions']])\n funcs_reload(proposal['functions'])\n else:\n put(addr, 'function', 'proposal', proposal, '%s' % proposal_id)\n event('FunctionVote', [proposal_id, addr])\n\n\ndef function_delete_proposal(info, args):\n assert args['f'] == 'function_delete_proposal'\n sender = info['sender']\n addr = handle_lookup(sender)\n func_names = args['a'][0]\n for func_name in func_names:\n assert set(func_name) <= set(string.ascii_lowercase+string.digits+'_')\n assert not func_name.startswith('_')\n code, _ = get('function', 'code', None, func_name)\n assert code, \"Function not found: %s\" % func_name\n\n proposal_id, _ = get('function', 'delete_proposal_count', 0)\n proposal_id += 1\n put(addr, 'function', 'delete_proposal_count', proposal_id)\n\n put(addr, 'function', 'delete_proposal', {\n 'functions': func_names,\n 'votes': []\n }, '%s' % (proposal_id))\n event('FunctionDeleteProposal', [proposal_id, func_names])\n\n\ndef function_delete_vote(info, args):\n assert args['f'] == 'function_delete_vote'\n sender = info['sender']\n addr = handle_lookup(sender)\n committee_members, _ = get('committee', 'members', [])\n committee_members = set(committee_members)\n assert addr in committee_members\n\n proposal_id = args['a'][0]\n proposal, _ = get('function', 'delete_proposal', None, '%s' % proposal_id)\n assert proposal\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 assert len(proposal['functions']) > 0\n for func_name in proposal['functions']:\n code, _ = get('function', 'code', None, func_name)\n if code:\n for snippet_hash in code.get('snippets', []):\n snippet, snippet_owner = get('function', 'snippet', None, snippet_hash)\n if not snippet:\n continue\n functions = snippet['functions']\n if func_name in functions:\n functions.remove(func_name)\n snippet['functions'] = functions\n if functions:\n put(snippet_owner, 'function', 'snippet', snippet, snippet_hash)\n else:\n put(snippet_owner, 'function', 'snippet', None, snippet_hash)\n event('RemoveFunctionSnippet', [snippet_hash])\n put(addr, 'function', 'code', None, func_name)\n\n event('RemoveFunctions', [proposal_id, proposal['functions']])\n funcs_reload(proposal['functions'])\n else:\n put(addr, 'function', 'delete_proposal', proposal, '%s' % proposal_id)\n event('FunctionDeleteVote', [proposal_id, addr])\n\n"}
{"votes": [], "snippets": ["68496ed0d6485836e2ae3d2c09039c42a86e020677e608ab65bb75cdcd7719e0"], "functions": ["function_snippet", "function_snippet_clear", "function_proposal", "function_vote", "function_delete_proposal", "function_delete_vote"]}
{"snippets": ["68496ed0d6485836e2ae3d2c09039c42a86e020677e608ab65bb75cdcd7719e0"]}
{"snippets": ["68496ed0d6485836e2ae3d2c09039c42a86e020677e608ab65bb75cdcd7719e0"]}
{"votes": [], "functions": ["predict_set_quote_token"]}
2
{"functions": ["predict_market_order", "predict_vote_manager", "predict_set_quote_tokens", "predict_mint", "predict_create", "predict_limit_order", "predict_limit_order_cancel", "predict_submit"], "snippet": "\ndef _decimal(tick):\n dec, _ = get(tick, 'decimal', None)\n assert dec is not None, f'{tick} has no registered decimals'\n return int(dec)\n\ndef _insert_order(addr, pair, order_type, order_start, order_new, quote_value, base_value, quote_scale):\n assert order_type in ['buy', 'sell']\n price = - quote_value * quote_scale // base_value\n assert 0 < price < quote_scale, \"price must be between 0 and 1\"\n order_id = order_start\n while True:\n order, _ = get('predict', f'{pair}_{order_type}', None, str(order_id))\n\n if order is None:\n put(addr, 'predict', f'{pair}_{order_type}',\n [addr, base_value, quote_value, price, None, None], str(order_new))\n order_new += 1\n put(addr, 'predict', f'{pair}_{order_type}_new', order_new)\n break\n\n if order_type == 'buy':\n cond = price > order[3]\n else:\n cond = price < order[3]\n\n if cond:\n next_order_id = order[5]\n put(addr, 'predict', f'{pair}_{order_type}',\n [addr, base_value, quote_value, price, order_id, next_order_id], str(order_new))\n if next_order_id is None:\n order_start = order_new\n put(addr, 'predict', f'{pair}_{order_type}_start', order_new)\n order[5] = order_new\n order_new += 1\n put(addr, 'predict', f'{pair}_{order_type}_new', order_new)\n\n put(addr, 'predict', f'{pair}_{order_type}', order, str(order_id))\n if next_order_id is not None:\n next_order, _ = get('predict', f'{pair}_{order_type}', None, str(next_order_id))\n if next_order is not None:\n next_order[4] = order[5]\n put(addr, 'predict', f'{pair}_{order_type}', next_order, str(next_order_id))\n break\n\n if order[4] is None:\n put(addr, 'predict', f'{pair}_{order_type}',\n [addr, base_value, quote_value, price, None, order_id], str(order_new))\n put(addr, 'predict', f'{pair}_{order_type}',\n [order[0], order[1], order[2], order[3], order_new, order[5]], str(order_id))\n order_new += 1\n put(addr, 'predict', f'{pair}_{order_type}_new', order_new)\n break\n\n order_id = order[4]\n return order_start, order_new\n\ndef _remove_order(addr, pair, order, order_start, buy_or_sell):\n assert buy_or_sell in ['buy', 'sell']\n if order[4]:\n prev_order, _ = get('predict', f'{pair}_{buy_or_sell}', None, str(order[4]))\n prev_order[5] = order[5]\n put(prev_order[0], 'predict', f'{pair}_{buy_or_sell}', prev_order, str(order[4]))\n\n if order[5]:\n next_order, _ = get('predict', f'{pair}_{buy_or_sell}', None, str(order[5]))\n next_order[4] = order[4]\n put(next_order[0], 'predict', f'{pair}_{buy_or_sell}', next_order, str(order[5]))\n\n if order[4] is not None and order[5] is None:\n order_start = order[4]\n put(addr, 'predict', f'{pair}_{buy_or_sell}_start', order_start)\n\n elif order[4] is None and order[5] is None:\n order_new, _ = get('predict', f'{pair}_{buy_or_sell}_new', 1)\n order_start = order_new\n put(addr, 'predict', f'{pair}_{buy_or_sell}_start', order_start)\n\n return order_start\n\ndef _update_slug_balance(addr, slug, tick, delta):\n prev, manager = get('predict', f'{slug}_{tick}_balance_new', None)\n balance_tuple, _ = get('predict', f'{slug}_{tick}_balance', None, addr)\n if balance_tuple is None:\n balance = 0\n put(manager, 'predict', f'{slug}_{tick}_balance_new', addr)\n else:\n balance = balance_tuple[0]\n prev = balance_tuple[1]\n balance += delta\n assert balance >= 0\n put(addr, 'predict', f'{slug}_{tick}_balance', [balance, prev], addr)\n\ndef _update_quote_balance(addr, quote_tick, delta):\n balance, _ = get(quote_tick, 'balance', 0, addr)\n balance += delta\n assert balance >= 0\n put(addr, quote_tick, 'balance', balance, addr)\n\ndef _update_pot(slug, quote_tick, delta):\n pot = f'pot_predict:{slug}'\n balance, _ = get(quote_tick, 'balance', 0, pot)\n balance += delta\n assert balance >= 0, \"Escrow pot underfunded\"\n manager, _ = get('predict', 'manager', None)\n put(manager, quote_tick, 'balance', balance, pot)\n\n\ndef predict_limit_order(info, args):\n assert args['f'] == 'predict_limit_order'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n slug = args['a'][0]\n yes_or_no = args['a'][2]\n assert set(slug) <= set(string.ascii_lowercase+string.digits+'_')\n assert yes_or_no in set(['yes', 'no'])\n\n pair = f'{slug}_{yes_or_no}'\n base_value = int(args['a'][1])\n quote_value = int(args['a'][3])\n assert base_value * quote_value < 0\n\n quote_tick, _ = get('predict', f'{slug}_quote_token', None)\n assert quote_tick, \"Slug not exists\"\n quote_scale = 10 ** _decimal(quote_tick)\n\n predict_buy_start, _ = get('predict', f'{pair}_buy_start', 1)\n predict_buy_new, _ = get('predict', f'{pair}_buy_new', 1)\n predict_sell_start, _ = get('predict', f'{pair}_sell_start', 1)\n predict_sell_new, _ = get('predict', f'{pair}_sell_new', 1)\n\n if base_value < 0 and quote_value > 0:\n buy_or_sell = 'sell'\n _update_slug_balance(addr, slug, yes_or_no, base_value)\n make_base = - base_value\n\n order_id = predict_sell_new\n predict_sell_start, predict_sell_new = _insert_order(addr, pair, 'sell', predict_sell_start, predict_sell_new, quote_value, base_value, quote_scale)\n\n elif base_value > 0 and quote_value < 0:\n buy_or_sell = 'buy'\n _update_quote_balance(addr, quote_tick, quote_value)\n make_base = base_value\n\n order_id = predict_buy_new\n predict_buy_start, predict_buy_new = _insert_order(addr, pair, 'buy', predict_buy_start, predict_buy_new, quote_value, base_value, quote_scale)\n\n predict_sell_id = predict_sell_start\n highest_buy_price = None\n\n take_base = 0\n take_quote = 0\n while True:\n sell, _ = get('predict', f'{pair}_sell', None, str(predict_sell_id))\n if not sell:\n break\n sell_price = sell[3]\n if highest_buy_price and sell_price > highest_buy_price:\n break\n\n predict_buy_id = predict_buy_start\n while True:\n buy, _ = get('predict', f'{pair}_buy', None, str(predict_buy_id))\n if not buy:\n break\n buy_price = buy[3]\n if highest_buy_price is None:\n highest_buy_price = buy_price\n if sell_price > buy_price:\n predict_buy_id = buy[4]\n continue\n\n matched_price = sell_price\n dx_base = min(-sell[1], buy[1])\n dx_quote = dx_base * matched_price // quote_scale\n sell[1] += dx_base\n sell[2] -= dx_quote\n buy[1] -= dx_base\n buy[2] += dx_quote\n take_base += dx_base\n take_quote += dx_quote\n\n _update_slug_balance(buy[0], slug, yes_or_no, dx_base)\n _update_quote_balance(sell[0], quote_tick, dx_quote)\n if buy[1] == 0:\n predict_buy_start = _remove_order(addr, pair, buy, predict_buy_start, 'buy')\n if buy[2] < 0:\n _update_quote_balance(buy[0], quote_tick, -buy[2])\n\n put(buy[0], 'predict', f'{pair}_buy', None, str(predict_buy_id))\n else:\n put(buy[0], 'predict', f'{pair}_buy', buy, str(predict_buy_id))\n\n if sell[1] == 0:\n break\n if buy[4] is None:\n break\n predict_buy_id = buy[4]\n\n if sell[1] == 0:\n predict_sell_start = _remove_order(addr, pair, sell, predict_sell_start, 'sell')\n if sell[1] < 0:\n _update_slug_balance(sell[0], slug, yes_or_no, -sell[1])\n\n put(sell[0], 'predict', f'{pair}_sell', None, str(predict_sell_id))\n else:\n put(sell[0], 'predict', f'{pair}_sell', sell, str(predict_sell_id))\n\n if sell[4] is None:\n break\n predict_sell_id = sell[4]\n\n make_base -= take_base\n assert make_base >= 0\n make_price = - quote_value * quote_scale // base_value\n event('PredictLimitMake', [pair, buy_or_sell, addr, make_base, make_price, order_id])\n if take_base > 0:\n take_price = take_quote * quote_scale // take_base\n event('PredictLimitTake', [pair, buy_or_sell, addr, take_base, take_price, order_id])\n\n\ndef predict_market_order(info, args):\n assert args['f'] == 'predict_market_order'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n slug = args['a'][0]\n yes_or_no = args['a'][2]\n assert set(slug) <= set(string.ascii_lowercase+string.digits+'_')\n assert yes_or_no in set(['yes', 'no'])\n\n quote_tick, _ = get('predict', f'{slug}_quote_token', None)\n assert quote_tick, \"Slug not exists\"\n quote_scale = 10 ** _decimal(quote_tick)\n pair = f'{slug}_{yes_or_no}'\n\n base_value = args['a'][1]\n quote_value = args['a'][3]\n predict_sell_start, _ = get('predict', f'{pair}_sell_start', 1)\n predict_buy_start, _ = get('predict', f'{pair}_buy_start', 1)\n\n take_base = 0\n take_quote = 0\n if quote_value is None and int(base_value) < 0:\n buy_or_sell = 'sell'\n base_value = int(args['a'][1])\n [base_balance, _], _ = get('predict', f'{pair}_balance', [0, None], addr)\n\n predict_buy_id = predict_buy_start\n while True:\n buy, _ = get('predict', f'{pair}_buy', None, str(predict_buy_id))\n if buy is None:\n break\n\n price = buy[3]\n dx_base = min(buy[1], -buy[2] * quote_scale // price, -base_value)\n dx_quote = dx_base * price // quote_scale\n if dx_base == 0 or dx_quote == 0:\n break\n if base_balance - dx_base < 0:\n break\n buy[1] -= dx_base\n buy[2] += dx_quote\n take_base += dx_base\n take_quote += dx_quote\n base_balance -= dx_base\n\n if buy[1] == 0 or buy[1] * quote_scale // price == 0:\n predict_buy_start = _remove_order(addr, pair, buy, predict_buy_start, 'buy')\n if buy[2] < 0:\n _update_quote_balance(buy[0], quote_tick, -buy[2])\n\n put(buy[0], 'predict', f'{pair}_buy', None, str(predict_buy_id))\n else:\n put(buy[0], 'predict', f'{pair}_buy', buy, str(predict_buy_id))\n\n _update_slug_balance(buy[0], slug, yes_or_no, dx_base)\n base_value += dx_base\n assert base_value <= 0\n _update_quote_balance(addr, quote_tick, dx_quote)\n if buy[4] is None:\n break\n predict_buy_id = buy[4]\n\n _update_slug_balance(addr, slug, yes_or_no, -take_base)\n\n elif quote_value is None and int(base_value) > 0:\n buy_or_sell = 'buy'\n base_value = int(args['a'][1])\n quote_balance, _ = get(quote_tick, 'balance', 0, addr)\n\n predict_sell_id = predict_sell_start\n while True:\n sell, _ = get('predict', f'{pair}_sell', None, str(predict_sell_id))\n if sell is None:\n break\n\n price = sell[3]\n dx_base = min(-sell[1], quote_balance * quote_scale // price, base_value)\n dx_quote = dx_base * price // quote_scale\n if dx_base == 0 or dx_quote == 0:\n break\n if quote_balance - dx_quote < 0:\n break\n\n sell[1] += dx_base\n sell[2] -= dx_quote\n take_base += dx_base\n take_quote += dx_quote\n quote_balance -= dx_quote\n\n if sell[1] == 0 or sell[1] * quote_scale // price == 0:\n predict_sell_start = _remove_order(addr, pair, sell, predict_sell_start, 'sell')\n if sell[1] < 0:\n _update_slug_balance(sell[0], slug, yes_or_no, -sell[1])\n\n put(sell[0], 'predict', f'{pair}_sell', None, str(predict_sell_id))\n else:\n put(sell[0], 'predict', f'{pair}_sell', sell, str(predict_sell_id))\n\n _update_quote_balance(sell[0], quote_tick, dx_quote)\n base_value -= dx_base\n assert base_value >= 0\n _update_slug_balance(addr, slug, yes_or_no, dx_base)\n if sell[4] is None:\n break\n predict_sell_id = sell[4]\n\n _update_quote_balance(addr, quote_tick, -take_quote)\n\n elif base_value is None and int(quote_value) < 0:\n buy_or_sell = 'buy'\n quote_value = int(args['a'][3])\n quote_balance, _ = get(quote_tick, 'balance', 0, addr)\n\n predict_sell_id = predict_sell_start\n while True:\n sell, _ = get('predict', f'{pair}_sell', None, str(predict_sell_id))\n if sell is None:\n break\n\n price = sell[3]\n dx_base = min(-sell[1], -quote_value * quote_scale // price)\n dx_quote = dx_base * price // quote_scale\n if dx_base == 0 or dx_quote == 0:\n break\n if quote_balance - dx_quote < 0:\n break\n\n sell[1] += dx_base\n sell[2] -= dx_quote\n take_base += dx_base\n take_quote += dx_quote\n quote_balance -= dx_quote\n\n if sell[1] == 0 or sell[1] * quote_scale // price == 0:\n predict_sell_start = _remove_order(addr, pair, sell, predict_sell_start, 'sell')\n if sell[1] < 0:\n _update_slug_balance(sell[0], slug, yes_or_no, -sell[1])\n\n put(sell[0], 'predict', f'{pair}_sell', None, str(predict_sell_id))\n else:\n put(sell[0], 'predict', f'{pair}_sell', sell, str(predict_sell_id))\n\n _update_quote_balance(sell[0], quote_tick, dx_quote)\n quote_value += dx_quote\n assert quote_value <= 0\n _update_slug_balance(addr, slug, yes_or_no, dx_base)\n if sell[4] is None:\n break\n predict_sell_id = sell[4]\n\n _update_quote_balance(addr, quote_tick, -take_quote)\n\n elif base_value is None and int(quote_value) > 0:\n buy_or_sell = 'sell'\n quote_value = int(args['a'][3])\n [base_balance, _], _ = get('predict', f'{pair}_balance', [0, None], addr)\n\n predict_buy_id = predict_buy_start\n while True:\n buy, _ = get('predict', f'{pair}_buy', None, str(predict_buy_id))\n if buy is None:\n break\n\n price = buy[3]\n dx_base = min(buy[1], base_balance, quote_value * quote_scale // price)\n dx_quote = dx_base * price // quote_scale\n if dx_base == 0 or dx_quote == 0:\n break\n if base_balance - dx_base < 0:\n break\n\n buy[1] -= dx_base\n buy[2] += dx_quote\n take_base += dx_base\n take_quote += dx_quote\n base_balance -= dx_base\n\n if buy[1] == 0 or buy[1] * quote_scale // price == 0:\n predict_buy_start = _remove_order(addr, pair, buy, predict_buy_start, 'buy')\n if buy[2] < 0:\n _update_quote_balance(buy[0], quote_tick, -buy[2])\n\n put(buy[0], 'predict', f'{pair}_buy', None, str(predict_buy_id))\n else:\n put(buy[0], 'predict', f'{pair}_buy', buy, str(predict_buy_id))\n\n _update_slug_balance(buy[0], slug, yes_or_no, dx_base)\n quote_value -= dx_quote\n assert quote_value >= 0\n _update_quote_balance(addr, quote_tick, dx_quote)\n if buy[4] is None:\n break\n predict_buy_id = buy[4]\n\n _update_slug_balance(addr, slug, yes_or_no, -take_base)\n\n if take_base > 0:\n price = take_quote * quote_scale // take_base\n event('PredictMarketTake', [pair, buy_or_sell, addr, take_base, price])\n\n\ndef predict_limit_order_cancel(info, args):\n assert args['f'] == 'predict_limit_order_cancel'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n slug = args['a'][0]\n yes_or_no = args['a'][1]\n buy_or_sell = args['a'][2]\n predict_order_id = int(args['a'][3])\n assert set(slug) <= set(string.ascii_lowercase+string.digits+'_')\n assert yes_or_no in set(['yes', 'no'])\n assert buy_or_sell in ['buy', 'sell']\n assert predict_order_id > 0\n\n pair = f'{slug}_{yes_or_no}'\n order_key = f'{pair}_{buy_or_sell}'\n quote_tick, _ = get('predict', f'{slug}_quote_token', None)\n order, _ = get('predict', order_key, None, str(predict_order_id))\n\n if order is None:\n return\n\n assert order[0] == addr, \"Sender is not the owner of the order\"\n prev_order_id = order[4]\n next_order_id = order[5]\n\n if prev_order_id is not None:\n prev_order, _ = get('predict', order_key, None, str(prev_order_id))\n if prev_order:\n prev_order[5] = next_order_id\n put(prev_order[0], 'predict', order_key, prev_order, str(prev_order_id))\n\n if next_order_id is not None:\n next_order, _ = get('predict', order_key, None, str(next_order_id))\n if next_order:\n next_order[4] = prev_order_id\n put(next_order[0], 'predict', order_key, next_order, str(next_order_id))\n\n start_key = f'{pair}_{buy_or_sell}_start'\n current_start, _ = get('predict', start_key, 1)\n if current_start == predict_order_id:\n if prev_order_id is not None:\n put(addr, 'predict', start_key, prev_order_id)\n else:\n new_start_key = f'{pair}_{buy_or_sell}_new'\n new_start_val, _ = get('predict', new_start_key, 1)\n put(addr, 'predict', start_key, new_start_val)\n\n if buy_or_sell == 'sell':\n if order[1] < 0:\n _update_slug_balance(addr, slug, yes_or_no, -order[1])\n elif buy_or_sell == 'buy':\n if order[2] < 0:\n _update_quote_balance(addr, quote_tick, -order[2])\n\n put(addr, 'predict', order_key, None, str(predict_order_id))\n event('PredictOrderCancel', [predict_order_id, buy_or_sell, pair])\n\n\ndef predict_create(info, args):\n assert args['f'] == 'predict_create'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n slug = args['a'][0]\n quote_tick = args['a'][1]\n assert set(slug) <= set(string.ascii_lowercase+string.digits+'_')\n\n quote_tokens, _ = get('predict', 'quote_tokens', [])\n assert quote_tick in quote_tokens, f'{quote_tick} is not a designated quote token'\n\n manager, _ = get('predict', 'manager', None)\n assert manager == addr, f\"Sender must be the owner of predict system\"\n created, _ = get('predict', f'{slug}_quote_token', None)\n assert created is None, \"Slug already exists\"\n put(addr, 'predict', f'{slug}_quote_token', quote_tick)\n\n put(addr, 'predict', f'{slug}_yes_buy_start', 1)\n put(addr, 'predict', f'{slug}_yes_buy_new', 1)\n put(addr, 'predict', f'{slug}_yes_sell_start', 1)\n put(addr, 'predict', f'{slug}_yes_sell_new', 1)\n put(addr, 'predict', f'{slug}_yes_balance_new', None)\n\n put(addr, 'predict', f'{slug}_no_buy_start', 1)\n put(addr, 'predict', f'{slug}_no_buy_new', 1)\n put(addr, 'predict', f'{slug}_no_sell_start', 1)\n put(addr, 'predict', f'{slug}_no_sell_new', 1)\n put(addr, 'predict', f'{slug}_no_balance_new', None)\n\n event('PredictCreate', [slug, quote_tick, addr])\n\n\ndef predict_mint(info, args):\n assert args['f'] == 'predict_mint'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n slug = args['a'][0]\n assert set(slug) <= set(string.ascii_lowercase+string.digits+'_')\n\n quote_tick, _ = get('predict', f'{slug}_quote_token', None)\n assert quote_tick, \"Slug is not created\"\n\n quote_value = int(args['a'][1])\n assert quote_value > 0\n\n _update_quote_balance(addr, quote_tick, -quote_value)\n _update_pot(slug, quote_tick, quote_value)\n\n for tick in ['yes', 'no']:\n _update_slug_balance(addr, slug, tick, quote_value)\n\n event('PredictMint', [slug, addr, quote_value])\n\n\ndef predict_submit(info, args):\n assert args['f'] == 'predict_submit'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n manager, _ = get('predict', 'manager', None)\n assert manager is not None, \"Manager not set\"\n assert addr == manager, \"Only the manager can submit result\"\n\n slug = args['a'][0]\n yes_or_no = args['a'][1]\n assert set(slug) <= set(string.ascii_lowercase+string.digits+'_')\n assert yes_or_no in set(['yes', 'no'])\n lose_tick = 'no' if yes_or_no == 'yes' else 'yes'\n\n quote_tick, _ = get('predict', f'{slug}_quote_token', None)\n assert quote_tick, \"Slug not exists\"\n\n win_pair = f'{slug}_{yes_or_no}'\n win_sell_start, _ = get('predict', f'{win_pair}_sell_start', 1)\n win_buy_start, _ = get('predict', f'{win_pair}_buy_start', 1)\n\n predict_sell_id = win_sell_start\n while True:\n sell, _ = get('predict', f'{win_pair}_sell', None, str(predict_sell_id))\n if not sell:\n break\n next_id = sell[4]\n if sell[1] < 0:\n _update_slug_balance(sell[0], slug, yes_or_no, -sell[1])\n put(sell[0], 'predict', f'{win_pair}_sell', None, str(predict_sell_id))\n if next_id is None:\n break\n predict_sell_id = next_id\n\n predict_buy_id = win_buy_start\n while True:\n buy, _ = get('predict', f'{win_pair}_buy', None, str(predict_buy_id))\n if not buy:\n break\n next_id = buy[4]\n if buy[2] < 0:\n _update_quote_balance(buy[0], quote_tick, -buy[2])\n put(buy[0], 'predict', f'{win_pair}_buy', None, str(predict_buy_id))\n if next_id is None:\n break\n predict_buy_id = next_id\n\n put(addr, 'predict', f'{win_pair}_sell_start', None)\n put(addr, 'predict', f'{win_pair}_sell_new', None)\n put(addr, 'predict', f'{win_pair}_buy_start', None)\n put(addr, 'predict', f'{win_pair}_buy_new', None)\n\n win_balance_new, _ = get('predict', f'{win_pair}_balance_new', None)\n current_addr = win_balance_new\n while current_addr is not None:\n balance_tuple, _ = get('predict', f'{win_pair}_balance', None, current_addr)\n if balance_tuple is None:\n break\n balance, prev = balance_tuple\n assert balance >= 0\n # Pay winners out of the escrow pot, never by minting quote.\n _update_pot(slug, quote_tick, -balance)\n _update_quote_balance(current_addr, quote_tick, balance)\n put(current_addr, 'predict', f'{win_pair}_balance', None, current_addr)\n current_addr = prev\n put(addr, 'predict', f'{win_pair}_balance_new', None)\n\n lose_pair = f'{slug}_{lose_tick}'\n lose_sell_start, _ = get('predict', f'{lose_pair}_sell_start', 1)\n lose_buy_start, _ = get('predict', f'{lose_pair}_buy_start', 1)\n\n predict_sell_id = lose_sell_start\n while True:\n sell, _ = get('predict', f'{lose_pair}_sell', None, str(predict_sell_id))\n if not sell:\n break\n next_id = sell[4]\n put(sell[0], 'predict', f'{lose_pair}_sell', None, str(predict_sell_id))\n if next_id is None:\n break\n predict_sell_id = next_id\n\n predict_buy_id = lose_buy_start\n while True:\n buy, _ = get('predict', f'{lose_pair}_buy', None, str(predict_buy_id))\n if not buy:\n break\n next_id = buy[4]\n put(buy[0], 'predict', f'{lose_pair}_buy', None, str(predict_buy_id))\n if next_id is None:\n break\n predict_buy_id = next_id\n\n put(addr, 'predict', f'{lose_pair}_sell_start', None)\n put(addr, 'predict', f'{lose_pair}_sell_new', None)\n put(addr, 'predict', f'{lose_pair}_buy_start', None)\n put(addr, 'predict', f'{lose_pair}_buy_new', None)\n\n balance_new, _ = get('predict', f'{lose_pair}_balance_new', None)\n current_addr = balance_new\n while current_addr is not None:\n balance_tuple, _ = get('predict', f'{lose_pair}_balance', None, current_addr)\n if balance_tuple is None:\n break\n _, prev = balance_tuple\n put(current_addr, 'predict', f'{lose_pair}_balance', None, current_addr)\n current_addr = prev\n put(addr, 'predict', f'{lose_pair}_balance_new', None)\n\n pot_quote, _ = get(quote_tick, 'balance', 0, f'pot_predict:{slug}')\n assert pot_quote == 0, \"Escrow pot not fully drained\"\n put(addr, 'predict', f'{slug}_quote_token', None)\n event('PredictSubmit', [slug, yes_or_no])\n\n\ndef predict_set_quote_tokens(info, args):\n assert args['f'] == 'predict_set_quote_tokens'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n manager, _ = get('predict', 'manager', None)\n assert manager is not None, \"Manager not set\"\n assert addr == manager, \"Only the manager can add quote tokens\"\n\n new_tokens = args['a'][0]\n assert isinstance(new_tokens, list), \"Quote tokens must be a list\"\n\n quote_tokens, _ = get('predict', 'quote_tokens', [])\n\n for token in new_tokens:\n assert isinstance(token, str), \"Token ticker must be a string\"\n assert len(token) > 0 and len(token) < 42, \"Invalid token ticker length\"\n assert token[0] in string.ascii_uppercase, \"Token ticker must start with an uppercase letter\"\n assert set(token) <= set(string.ascii_uppercase+string.digits+'_'), \"Invalid characters in token ticker\"\n if token not in quote_tokens:\n quote_tokens.append(token)\n\n put(addr, 'predict', 'quote_tokens', quote_tokens)\n\n\ndef predict_update_manager(info, args):\n assert args['f'] == 'predict_update_manager'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n manager, _ = get('predict', 'manager', None)\n if manager is not None:\n assert addr == manager, \"Only the current manager can change manager\"\n\n user = args['a'][0]\n assert isinstance(user, str), \"User address must be a string\"\n put(addr, 'predict', 'manager', user)\n event('PredictUpdateManager', [addr, user])\n\n\ndef predict_vote_manager(info, args):\n assert args['f'] == 'predict_vote_manager'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n manager, _ = get('predict', 'manager', None)\n assert manager is None, \"Manager already set, use predict_set_manager instead\"\n\n committee_members, _ = get('committee', 'members', [])\n committee_members = set(committee_members)\n assert addr in committee_members, \"Only committee members can vote\"\n\n user = args['a'][0]\n assert isinstance(user, str), \"User address must be a string\"\n\n proposal_key = f'predict_manager:{user}'\n votes, _ = get('committee', 'proposal', [], proposal_key)\n votes = set(votes)\n votes.add(addr)\n\n if len(votes) >= len(committee_members) * 2 // 3:\n put(addr, 'predict', 'manager', user)\n put(addr, 'committee', 'proposal', [], proposal_key)\n event('PredictUpdateManager', [list(votes), user])\n else:\n put(addr, 'committee', 'proposal', list(votes), proposal_key)\n\n"}
{"votes": [], "snippets": ["82af9e0d5f67dfb7710641c11b9fc7429ea740934fb7b77fa79fb0f4f445f7b3"], "functions": ["predict_create", "predict_mint", "predict_submit", "predict_limit_order", "predict_market_order", "predict_limit_order_cancel", "predict_set_quote_tokens", "predict_vote_manager"]}
{"snippets": ["82af9e0d5f67dfb7710641c11b9fc7429ea740934fb7b77fa79fb0f4f445f7b3"]}
{"functions": [], "snippet": "\ndef _decimal(tick):\n dec, _ = get(tick, 'decimal', None)\n if dec is None:\n dec = 0\n return dec\n\ndef _insert_order(addr, pair, order_type, order_start, order_new, quote_value, base_value, quote_scale):\n assert order_type in ['buy', 'sell']\n order_id = order_start\n price = - quote_value * quote_scale // base_value\n while True:\n order, _ = get('spot', f'{pair}_{order_type}', None, str(order_id))\n\n if order is None:\n put(addr, 'spot', f'{pair}_{order_type}',\n [addr, base_value, quote_value, price, None, None], str(order_new))\n order_new += 1\n put(addr, 'spot', f'{pair}_{order_type}_new', order_new)\n break\n\n if order_type == 'buy':\n cond = price > order[3]\n else:\n cond = price < order[3]\n\n if cond:\n next_order_id = order[5]\n put(addr, 'spot', f'{pair}_{order_type}',\n [addr, base_value, quote_value, price, order_id, next_order_id], str(order_new))\n if next_order_id is None:\n order_start = order_new\n put(addr, 'spot', f'{pair}_{order_type}_start', order_new)\n order[5] = order_new\n order_new += 1\n put(addr, 'spot', f'{pair}_{order_type}_new', order_new)\n\n put(addr, 'spot', f'{pair}_{order_type}', order, str(order_id))\n if next_order_id is not None:\n next_order, _ = get('spot', f'{pair}_{order_type}', None, str(next_order_id))\n if next_order is not None:\n next_order[4] = order[5]\n put(addr, 'spot', f'{pair}_{order_type}', next_order, str(next_order_id))\n break\n\n if order[4] is None:\n put(addr, 'spot', f'{pair}_{order_type}',\n [addr, base_value, quote_value, price, None, order_id], str(order_new))\n put(addr, 'spot', f'{pair}_{order_type}',\n [order[0], order[1], order[2], order[3], order_new, order[5]], str(order_id))\n order_new += 1\n put(addr, 'spot', f'{pair}_{order_type}_new', order_new)\n break\n\n order_id = order[4]\n return order_start, order_new\n\n\ndef _remove_order(addr, pair, order, order_start, buy_or_sell):\n assert buy_or_sell in ['buy', 'sell']\n if order[4]:\n prev_order, _ = get('spot', f'{pair}_{buy_or_sell}', None, str(order[4]))\n prev_order[5] = order[5]\n put(prev_order[0], 'spot', f'{pair}_{buy_or_sell}', prev_order, str(order[4]))\n\n if order[5]:\n next_order, _ = get('spot', f'{pair}_{buy_or_sell}', None, str(order[5]))\n next_order[4] = order[4]\n put(next_order[0], 'spot', f'{pair}_{buy_or_sell}', next_order, str(order[5]))\n\n if order[4] is not None and order[5] is None:\n order_start = order[4]\n put(addr, 'spot', f'{pair}_{buy_or_sell}_start', order_start)\n\n elif order[4] is None and order[5] is None:\n order_new, _ = get('spot', f'{pair}_{buy_or_sell}_new', 1)\n order_start = order_new\n put(addr, 'spot', f'{pair}_{buy_or_sell}_start', order_start)\n\n return order_start\n\n\ndef spot_limit_order(info, args):\n assert args['f'] == 'spot_limit_order'\n sender = info['sender']\n addr = handle_lookup(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\n pair = '%s_%s' % tuple([base_tick, quote_tick])\n quote_scale = 10 ** _decimal(quote_tick)\n base_value = int(args['a'][1])\n quote_value = int(args['a'][3])\n assert base_value * quote_value < 0\n\n spot_buy_start, _ = get('spot', f'{pair}_buy_start', 1)\n spot_buy_new, _ = get('spot', f'{pair}_buy_new', 1)\n spot_sell_start, _ = get('spot', f'{pair}_sell_start', 1)\n spot_sell_new, _ = get('spot', f'{pair}_sell_new', 1)\n\n if base_value < 0 and quote_value > 0:\n buy_or_sell = 'sell'\n balance, _ = get(base_tick, 'balance', 0, addr)\n balance += base_value\n make_base = - base_value\n assert balance >= 0\n put(addr, base_tick, 'balance', balance, addr)\n\n order_id = spot_sell_new\n spot_sell_start, spot_sell_new = _insert_order(addr, pair, 'sell', spot_sell_start, spot_sell_new, quote_value, base_value, quote_scale)\n\n elif base_value > 0 and quote_value < 0:\n buy_or_sell = 'buy'\n balance, _ = get(quote_tick, 'balance', 0, addr)\n balance += quote_value\n make_base = base_value\n assert balance >= 0\n put(addr, quote_tick, 'balance', balance, addr)\n\n order_id = spot_buy_new\n spot_buy_start, spot_buy_new = _insert_order(addr, pair, 'buy', spot_buy_start, spot_buy_new, quote_value, base_value, quote_scale)\n\n spot_sell_id = spot_sell_start\n highest_buy_price = None\n\n # take_amount = 0\n take_base = 0\n take_quote = 0\n while True:\n sell, _ = get('spot', f'{pair}_sell', None, str(spot_sell_id))\n if not sell:\n break\n sell_price = sell[3]\n if highest_buy_price and sell_price > highest_buy_price:\n break\n\n spot_buy_id = spot_buy_start\n while True:\n buy, _ = get('spot', f'{pair}_buy', None, str(spot_buy_id))\n if not buy:\n break\n buy_price = buy[3]\n if highest_buy_price is None:\n highest_buy_price = buy_price\n if sell_price > buy_price:\n spot_buy_id = buy[4]\n continue\n\n matched_price = sell_price\n dx_base = min(-sell[1], buy[1])\n dx_quote = dx_base * matched_price // quote_scale\n sell[1] += dx_base\n sell[2] -= dx_quote\n buy[1] -= dx_base\n buy[2] += dx_quote\n take_base += dx_base\n take_quote += dx_quote\n # if buy_or_sell == 'buy':\n # take_amount += dx_quote\n # else:\n # take_amount += dx_base\n balance, _ = get(base_tick, 'balance', 0, buy[0])\n balance += dx_base\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_quote\n assert balance >= 0\n put(sell[0], quote_tick, 'balance', balance, sell[0])\n\n if buy[1] == 0:\n spot_buy_start = _remove_order(addr, pair, buy, spot_buy_start, 'buy')\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], 'spot', f'{pair}_buy', None, str(spot_buy_id))\n else:\n put(buy[0], 'spot', f'{pair}_buy', buy, str(spot_buy_id))\n\n if sell[1] == 0:\n break\n if buy[4] is None:\n break\n spot_buy_id = buy[4]\n\n if sell[1] == 0:\n spot_sell_start = _remove_order(addr, pair, sell, spot_sell_start, 'sell')\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], 'spot', f'{pair}_sell', None, str(spot_sell_id))\n else:\n put(sell[0], 'spot', f'{pair}_sell', sell, str(spot_sell_id))\n\n if sell[4] is None:\n break\n spot_sell_id = sell[4]\n\n make_base -= take_base\n assert make_base >= 0\n make_price = - quote_value * quote_scale // base_value\n event('SpotLimitMake', [pair, buy_or_sell, addr, make_base, make_price, order_id])\n if take_base > 0:\n take_price = take_quote * quote_scale // take_base\n event('SpotLimitTake', [pair, buy_or_sell, addr, take_base, take_price, order_id])\n\n\ndef spot_market_order(info, args):\n assert args['f'] == 'spot_market_order'\n sender = info['sender']\n addr = handle_lookup(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 quote_scale = 10 ** _decimal(quote_tick)\n spot_sell_start, _ = get('spot', f'{pair}_sell_start', 1)\n spot_buy_start, _ = get('spot', f'{pair}_buy_start', 1)\n\n take_base = 0\n take_quote = 0\n if quote_value is None and int(base_value) < 0:\n buy_or_sell = 'sell'\n base_value = int(args['a'][1])\n base_balance, _ = get(base_tick, 'balance', 0, addr)\n # base_sum = 0\n\n spot_buy_id = spot_buy_start\n while True:\n buy, _ = get('spot', f'{pair}_buy', None, str(spot_buy_id))\n if buy is None:\n break\n\n price = buy[3]\n dx_base = min(buy[1], -buy[2] * quote_scale // price, -base_value)\n dx_quote = dx_base * price // quote_scale\n if dx_base == 0 or dx_quote == 0:\n break\n if base_balance - dx_base < 0:\n break\n buy[1] -= dx_base\n buy[2] += dx_quote\n take_base += dx_base\n take_quote += dx_quote\n base_balance -= dx_base\n # base_sum += dx_base\n\n if buy[1] == 0 or buy[1] // price == 0:\n spot_buy_start = _remove_order(addr, pair, buy, spot_buy_start, 'buy')\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], 'spot', f'{pair}_buy', None, str(spot_buy_id))\n else:\n put(buy[0], 'spot', f'{pair}_buy', buy, str(spot_buy_id))\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 spot_buy_id = buy[4]\n\n balance, _ = get(base_tick, 'balance', 0, addr)\n balance -= take_base\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 buy_or_sell = 'buy'\n base_value = int(args['a'][1])\n quote_balance, _ = get(quote_tick, 'balance', 0, addr)\n # quote_sum = 0\n\n spot_sell_id = spot_sell_start\n while True:\n sell, _ = get('spot', f'{pair}_sell', None, str(spot_sell_id))\n if sell is None:\n break\n\n price = sell[3]\n dx_base = min(-sell[1], quote_balance * quote_scale // price, base_value)\n dx_quote = dx_base * price // quote_scale\n if dx_base == 0 or dx_quote == 0:\n break\n if quote_balance - dx_quote < 0:\n break\n\n sell[1] += dx_base\n sell[2] -= dx_quote\n take_base += dx_base\n take_quote += dx_quote\n quote_balance -= dx_quote\n # quote_sum += dx_quote\n\n if sell[1] == 0 or sell[1] // price == 0:\n spot_sell_start = _remove_order(addr, pair, sell, spot_sell_start, 'sell')\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], 'spot', f'{pair}_sell', None, str(spot_sell_id))\n else:\n put(sell[0], 'spot', f'{pair}_sell', sell, str(spot_sell_id))\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 spot_sell_id = sell[4]\n\n balance, _ = get(quote_tick, 'balance', 0, addr)\n balance -= take_quote\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 buy_or_sell = 'buy'\n quote_value = int(args['a'][3])\n quote_balance, _ = get(quote_tick, 'balance', 0, addr)\n # quote_sum = 0\n\n spot_sell_id = spot_sell_start\n while True:\n sell, _ = get('spot', f'{pair}_sell', None, str(spot_sell_id))\n if sell is None:\n break\n\n price = sell[3]\n dx_base = min(-sell[1], -quote_value * quote_scale // price)\n dx_quote = dx_base * price // quote_scale\n if dx_base == 0 or dx_quote == 0:\n break\n if quote_balance - dx_quote < 0:\n break\n\n sell[1] += dx_base\n sell[2] -= dx_quote\n take_base += dx_base\n take_quote += dx_quote\n quote_balance -= dx_quote\n # quote_sum += dx_quote\n\n if sell[1] == 0 or sell[1] // price == 0:\n spot_sell_start = _remove_order(addr, pair, sell, spot_sell_start, 'sell')\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], 'spot', f'{pair}_sell', None, str(spot_sell_id))\n else:\n put(sell[0], 'spot', f'{pair}_sell', sell, str(spot_sell_id))\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 spot_sell_id = sell[4]\n\n balance, _ = get(quote_tick, 'balance', 0, addr)\n balance -= take_quote\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 buy_or_sell = 'sell'\n quote_value = int(args['a'][3])\n base_balance, _ = get(base_tick, 'balance', 0, addr)\n # base_sum = 0\n\n spot_buy_id = spot_buy_start\n while True:\n buy, _ = get('spot', f'{pair}_buy', None, str(spot_buy_id))\n if buy is None:\n break\n\n price = buy[3]\n dx_base = min(buy[1], base_balance, quote_value * quote_scale // price)\n dx_quote = dx_base * price // quote_scale\n if dx_base == 0 or dx_quote == 0:\n break\n if base_balance - dx_base < 0:\n break\n\n buy[1] -= dx_base\n buy[2] += dx_quote\n take_base += dx_base\n take_quote += dx_quote\n base_balance -= dx_base\n # base_sum += dx_base\n\n if buy[1] == 0 or buy[1] // price == 0:\n spot_buy_start = _remove_order(addr, pair, buy, spot_buy_start, 'buy')\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], 'spot', f'{pair}_buy', None, str(spot_buy_id))\n else:\n put(buy[0], 'spot', f'{pair}_buy', buy, str(spot_buy_id))\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 spot_buy_id = buy[4]\n\n balance, _ = get(base_tick, 'balance', 0, addr)\n balance -= take_base\n assert balance >= 0\n put(addr, base_tick, 'balance', balance, addr)\n\n if take_base > 0:\n price = take_quote * quote_scale // take_base\n event('SpotMarketTake', [pair, buy_or_sell, addr, take_base, price])\n\n\ndef spot_limit_order_cancel(info, args):\n assert args['f'] == 'spot_limit_order_cancel'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n base_tick = args['a'][0]\n assert set(base_tick) <= set(string.ascii_uppercase + '_')\n quote_tick = args['a'][1]\n assert set(quote_tick) <= set(string.ascii_uppercase + '_')\n buy_or_sell = args['a'][2]\n assert buy_or_sell in ['buy', 'sell']\n spot_order_id = int(args['a'][3])\n\n pair = '%s_%s' % (base_tick, quote_tick)\n order_key = f'{pair}_{buy_or_sell}'\n order, _ = get('spot', order_key, None, str(spot_order_id))\n\n if order is None:\n return\n\n assert order[0] == addr, \"Sender is not the owner of the order\"\n prev_order_id = order[4]\n next_order_id = order[5]\n\n if prev_order_id is not None:\n prev_order, _ = get('spot', order_key, None, str(prev_order_id))\n if prev_order:\n prev_order[5] = next_order_id\n put(prev_order[0], 'spot', order_key, prev_order, str(prev_order_id))\n\n if next_order_id is not None:\n next_order, _ = get('spot', order_key, None, str(next_order_id))\n if next_order:\n next_order[4] = prev_order_id\n put(next_order[0], 'spot', order_key, next_order, str(next_order_id))\n\n start_key = f'{pair}_{buy_or_sell}_start'\n current_start, _ = get('spot', start_key, 1)\n if current_start == spot_order_id:\n if prev_order_id is not None:\n put(addr, 'spot', start_key, prev_order_id)\n else:\n new_start_key = f'{pair}_{buy_or_sell}_new'\n new_start_val, _ = get('spot', new_start_key, 1)\n put(addr, 'spot', start_key, new_start_val)\n\n if buy_or_sell == 'sell':\n if order[1] < 0:\n balance, _ = get(base_tick, 'balance', 0, addr)\n balance -= order[1]\n put(addr, base_tick, 'balance', balance, addr)\n elif buy_or_sell == 'buy':\n if order[2] < 0:\n balance, _ = get(quote_tick, 'balance', 0, addr)\n balance -= order[2]\n put(addr, quote_tick, 'balance', balance, addr)\n\n put(addr, 'spot', order_key, None, str(spot_order_id))\n event('SpotOrderCancel', [spot_order_id, buy_or_sell, pair])\n\n\ndef spot_pair_create(info, args):\n assert args['f'] == 'spot_pair_create'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n base_tick = args['a'][0]\n quote_tick = args['a'][1]\n\n quote_tokens, _ = get('spot', 'quote_tokens', [])\n assert quote_tick in quote_tokens, f\"{quote_tick} is not a designated quote token\"\n\n owner, _ = get('asset', 'owner', None, base_tick)\n assert owner == addr, f\"Sender must be the owner of the base token ({base_tick})\"\n pair = f'{base_tick}_{quote_tick}'\n enable, _ = get('spot', f'{pair}_enable', None)\n assert enable is None, \"Pair already exists\"\n\n put(addr, 'spot', f'{pair}_enable', True)\n put(addr, 'spot', f'{pair}_buy_start', 1)\n put(addr, 'spot', f'{pair}_buy_new', 1)\n put(addr, 'spot', f'{pair}_sell_start', 1)\n put(addr, 'spot', f'{pair}_sell_new', 1)\n\n\ndef spot_pair_enable(info, args):\n assert args['f'] == 'spot_pair_enable'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n base_tick = args['a'][0]\n quote_tick = args['a'][1]\n pair = f'{base_tick}_{quote_tick}'\n\n owner, _ = get('asset', 'owner', None, base_tick)\n assert owner == addr, f\"Sender must be the owner of the base token ({base_tick})\"\n\n put(addr, 'spot', f'{pair}_enable', True)\n\n\ndef spot_pair_disable(info, args):\n assert args['f'] == 'spot_pair_disable'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n base_tick = args['a'][0]\n quote_tick = args['a'][1]\n pair = f'{base_tick}_{quote_tick}'\n\n owner, _ = get('asset', 'owner', None, base_tick)\n assert owner == addr, f\"Sender must be the owner of the base token ({base_tick})\"\n\n put(addr, 'spot', f'{pair}_enable', False)\n\n\ndef spot_set_quote_tokens(info, args):\n assert args['f'] == 'spot_set_quote_tokens'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n manager, _ = get('spot', 'manager', None)\n assert manager is not None, \"Manager not set\"\n assert addr == manager, \"Only the manager can add quote tokens\"\n\n new_tokens = args['a'][0]\n assert isinstance(new_tokens, list), \"Quote tokens must be a list\"\n\n quote_tokens, _ = get('spot', 'quote_tokens', [])\n\n for token in new_tokens:\n assert isinstance(token, str), \"Token ticker must be a string\"\n assert set(token) <= set(string.ascii_uppercase+'_'), \"Invalid characters in token ticker\"\n if token not in quote_tokens:\n quote_tokens.append(token)\n\n put(addr, 'spot', 'quote_tokens', quote_tokens)\n\n\ndef spot_vote_manager(info, args):\n assert args['f'] == 'spot_vote_manager'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n committee_members, _ = get('committee', 'members', [])\n committee_members = set(committee_members)\n assert addr in committee_members, \"Only committee members can vote\"\n\n user = args['a'][0]\n assert isinstance(user, str), \"User address must be a string\"\n\n proposal_key = f'spot_manager:{user}'\n votes, _ = get('committee', 'proposal', [], proposal_key)\n votes = set(votes)\n votes.add(addr)\n\n if len(votes) >= len(committee_members) * 2 // 3:\n put(addr, 'spot', 'manager', user)\n put(addr, 'committee', 'proposal', [], proposal_key)\n else:\n put(addr, 'committee', 'proposal', list(votes), proposal_key)\n"}
{"votes": [], "snippets": ["2b8ccbd08a20f05d04f0566cd3f0c9a5422d22e8d7783e77cc91a3c8ffc38fa3"], "functions": ["spot_limit_order", "spot_market_order", "spot_limit_order_cancel", "spot_pair_create", "spot_pair_enable", "spot_pair_disable", "spot_set_quote_tokens", "spot_vote_manager"]}
{"snippets": ["57350e141510e1ae60ff8b12fb66674b46c66f15faf128cec37936c58c513e7a"]}
{"snippets": ["57350e141510e1ae60ff8b12fb66674b46c66f15faf128cec37936c58c513e7a"]}
{"snippets": ["57350e141510e1ae60ff8b12fb66674b46c66f15faf128cec37936c58c513e7a"]}
{"snippets": ["57350e141510e1ae60ff8b12fb66674b46c66f15faf128cec37936c58c513e7a"]}
{"snippets": ["57350e141510e1ae60ff8b12fb66674b46c66f15faf128cec37936c58c513e7a"]}
{"snippets": ["57350e141510e1ae60ff8b12fb66674b46c66f15faf128cec37936c58c513e7a"]}
{"snippets": ["57350e141510e1ae60ff8b12fb66674b46c66f15faf128cec37936c58c513e7a"]}
{"snippets": ["57350e141510e1ae60ff8b12fb66674b46c66f15faf128cec37936c58c513e7a"]}
{"votes": [], "functions": ["trade_limit_order", "trade_market_order", "trade_limit_order_cancel", "trade_pair_create", "trade_pair_enable", "trade_pair_disable", "trade_set_quote_token", "trade_vote_treasure_manager"]}
null
6
null
null
5
3
{"functions": ["spot_limit_order", "spot_pair_disable", "spot_pair_create", "spot_limit_order_cancel", "spot_vote_manager", "spot_set_quote_tokens", "spot_pair_enable", "spot_market_order"], "snippet": "\ndef _decimal(tick):\n dec, _ = get(tick, 'decimal', None)\n if dec is None:\n dec = 0\n return dec\n\ndef _insert_order(addr, pair, order_type, order_start, order_new, quote_value, base_value, base_scale):\n assert order_type in ['buy', 'sell']\n order_id = order_start\n price = - quote_value * base_scale // base_value\n while True:\n order, _ = get('spot', f'{pair}_{order_type}', None, str(order_id))\n\n if order is None:\n put(addr, 'spot', f'{pair}_{order_type}',\n [addr, base_value, quote_value, price, None, None], str(order_new))\n order_new += 1\n put(addr, 'spot', f'{pair}_{order_type}_new', order_new)\n break\n\n if order_type == 'buy':\n cond = price > order[3]\n else:\n cond = price < order[3]\n\n if cond:\n next_order_id = order[5]\n put(addr, 'spot', f'{pair}_{order_type}',\n [addr, base_value, quote_value, price, order_id, next_order_id], str(order_new))\n if next_order_id is None:\n order_start = order_new\n put(addr, 'spot', f'{pair}_{order_type}_start', order_new)\n order[5] = order_new\n order_new += 1\n put(addr, 'spot', f'{pair}_{order_type}_new', order_new)\n\n put(addr, 'spot', f'{pair}_{order_type}', order, str(order_id))\n if next_order_id is not None:\n next_order, _ = get('spot', f'{pair}_{order_type}', None, str(next_order_id))\n if next_order is not None:\n next_order[4] = order[5]\n put(addr, 'spot', f'{pair}_{order_type}', next_order, str(next_order_id))\n break\n\n if order[4] is None:\n put(addr, 'spot', f'{pair}_{order_type}',\n [addr, base_value, quote_value, price, None, order_id], str(order_new))\n put(addr, 'spot', f'{pair}_{order_type}',\n [order[0], order[1], order[2], order[3], order_new, order[5]], str(order_id))\n order_new += 1\n put(addr, 'spot', f'{pair}_{order_type}_new', order_new)\n break\n\n order_id = order[4]\n return order_start, order_new\n\n\ndef _remove_order(addr, pair, order, order_start, buy_or_sell):\n assert buy_or_sell in ['buy', 'sell']\n if order[4]:\n prev_order, _ = get('spot', f'{pair}_{buy_or_sell}', None, str(order[4]))\n prev_order[5] = order[5]\n put(prev_order[0], 'spot', f'{pair}_{buy_or_sell}', prev_order, str(order[4]))\n\n if order[5]:\n next_order, _ = get('spot', f'{pair}_{buy_or_sell}', None, str(order[5]))\n next_order[4] = order[4]\n put(next_order[0], 'spot', f'{pair}_{buy_or_sell}', next_order, str(order[5]))\n\n if order[4] is not None and order[5] is None:\n order_start = order[4]\n put(addr, 'spot', f'{pair}_{buy_or_sell}_start', order_start)\n\n elif order[4] is None and order[5] is None:\n order_new, _ = get('spot', f'{pair}_{buy_or_sell}_new', 1)\n order_start = order_new\n put(addr, 'spot', f'{pair}_{buy_or_sell}_start', order_start)\n\n return order_start\n\n\ndef spot_limit_order(info, args):\n assert args['f'] == 'spot_limit_order'\n sender = info['sender']\n addr = handle_lookup(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\n pair = '%s_%s' % tuple([base_tick, quote_tick])\n base_scale = 10 ** _decimal(base_tick)\n base_value = int(args['a'][1])\n quote_value = int(args['a'][3])\n assert base_value * quote_value < 0\n\n spot_buy_start, _ = get('spot', f'{pair}_buy_start', 1)\n spot_buy_new, _ = get('spot', f'{pair}_buy_new', 1)\n spot_sell_start, _ = get('spot', f'{pair}_sell_start', 1)\n spot_sell_new, _ = get('spot', f'{pair}_sell_new', 1)\n\n if base_value < 0 and quote_value > 0:\n buy_or_sell = 'sell'\n balance, _ = get(base_tick, 'balance', 0, addr)\n balance += base_value\n make_base = - base_value\n assert balance >= 0\n put(addr, base_tick, 'balance', balance, addr)\n\n order_id = spot_sell_new\n spot_sell_start, spot_sell_new = _insert_order(addr, pair, 'sell', spot_sell_start, spot_sell_new, quote_value, base_value, base_scale)\n\n elif base_value > 0 and quote_value < 0:\n buy_or_sell = 'buy'\n balance, _ = get(quote_tick, 'balance', 0, addr)\n balance += quote_value\n make_base = base_value\n assert balance >= 0\n put(addr, quote_tick, 'balance', balance, addr)\n\n order_id = spot_buy_new\n spot_buy_start, spot_buy_new = _insert_order(addr, pair, 'buy', spot_buy_start, spot_buy_new, quote_value, base_value, base_scale)\n\n spot_sell_id = spot_sell_start\n highest_buy_price = None\n\n # take_amount = 0\n take_base = 0\n take_quote = 0\n while True:\n sell, _ = get('spot', f'{pair}_sell', None, str(spot_sell_id))\n if not sell:\n break\n sell_price = sell[3]\n if highest_buy_price and sell_price > highest_buy_price:\n break\n\n spot_buy_id = spot_buy_start\n while True:\n buy, _ = get('spot', f'{pair}_buy', None, str(spot_buy_id))\n if not buy:\n break\n buy_price = buy[3]\n if highest_buy_price is None:\n highest_buy_price = buy_price\n if sell_price > buy_price:\n spot_buy_id = buy[4]\n continue\n\n matched_price = sell_price\n dx_base = min(-sell[1], buy[1])\n dx_quote = dx_base * matched_price // base_scale\n sell[1] += dx_base\n sell[2] -= dx_quote\n buy[1] -= dx_base\n buy[2] += dx_quote\n take_base += dx_base\n take_quote += dx_quote\n # if buy_or_sell == 'buy':\n # take_amount += dx_quote\n # else:\n # take_amount += dx_base\n balance, _ = get(base_tick, 'balance', 0, buy[0])\n balance += dx_base\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_quote\n assert balance >= 0\n put(sell[0], quote_tick, 'balance', balance, sell[0])\n\n if buy[1] == 0:\n spot_buy_start = _remove_order(addr, pair, buy, spot_buy_start, 'buy')\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], 'spot', f'{pair}_buy', None, str(spot_buy_id))\n else:\n put(buy[0], 'spot', f'{pair}_buy', buy, str(spot_buy_id))\n\n if sell[1] == 0:\n break\n if buy[4] is None:\n break\n spot_buy_id = buy[4]\n\n if sell[1] == 0:\n spot_sell_start = _remove_order(addr, pair, sell, spot_sell_start, 'sell')\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], 'spot', f'{pair}_sell', None, str(spot_sell_id))\n else:\n put(sell[0], 'spot', f'{pair}_sell', sell, str(spot_sell_id))\n\n if sell[4] is None:\n break\n spot_sell_id = sell[4]\n\n make_base -= take_base\n assert make_base >= 0\n make_price = - quote_value * base_scale // base_value\n event('SpotLimitMake', [pair, buy_or_sell, addr, make_base, make_price, order_id])\n if take_base > 0:\n take_price = take_quote * base_scale // take_base\n event('SpotLimitTake', [pair, buy_or_sell, addr, take_base, take_price, order_id])\n\n\ndef spot_market_order(info, args):\n assert args['f'] == 'spot_market_order'\n sender = info['sender']\n addr = handle_lookup(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 base_scale = 10 ** _decimal(base_tick)\n spot_sell_start, _ = get('spot', f'{pair}_sell_start', 1)\n spot_buy_start, _ = get('spot', f'{pair}_buy_start', 1)\n\n take_base = 0\n take_quote = 0\n if quote_value is None and int(base_value) < 0:\n buy_or_sell = 'sell'\n base_value = int(args['a'][1])\n base_balance, _ = get(base_tick, 'balance', 0, addr)\n # base_sum = 0\n\n spot_buy_id = spot_buy_start\n while True:\n buy, _ = get('spot', f'{pair}_buy', None, str(spot_buy_id))\n if buy is None:\n break\n\n price = buy[3]\n dx_base = min(buy[1], -buy[2] * base_scale // price, -base_value)\n dx_quote = dx_base * price // base_scale\n if dx_base == 0 or dx_quote == 0:\n break\n if base_balance - dx_base < 0:\n break\n buy[1] -= dx_base\n buy[2] += dx_quote\n take_base += dx_base\n take_quote += dx_quote\n base_balance -= dx_base\n # base_sum += dx_base\n\n if buy[1] == 0 or buy[1] * price // base_scale == 0:\n spot_buy_start = _remove_order(addr, pair, buy, spot_buy_start, 'buy')\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], 'spot', f'{pair}_buy', None, str(spot_buy_id))\n else:\n put(buy[0], 'spot', f'{pair}_buy', buy, str(spot_buy_id))\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 spot_buy_id = buy[4]\n\n balance, _ = get(base_tick, 'balance', 0, addr)\n balance -= take_base\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 buy_or_sell = 'buy'\n base_value = int(args['a'][1])\n quote_balance, _ = get(quote_tick, 'balance', 0, addr)\n # quote_sum = 0\n\n spot_sell_id = spot_sell_start\n while True:\n sell, _ = get('spot', f'{pair}_sell', None, str(spot_sell_id))\n if sell is None:\n break\n\n price = sell[3]\n dx_base = min(-sell[1], quote_balance * base_scale // price, base_value)\n dx_quote = dx_base * price // base_scale\n if dx_base == 0 or dx_quote == 0:\n break\n if quote_balance - dx_quote < 0:\n break\n\n sell[1] += dx_base\n sell[2] -= dx_quote\n take_base += dx_base\n take_quote += dx_quote\n quote_balance -= dx_quote\n # quote_sum += dx_quote\n\n if sell[1] == 0 or sell[1] * price // base_scale == 0:\n spot_sell_start = _remove_order(addr, pair, sell, spot_sell_start, 'sell')\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], 'spot', f'{pair}_sell', None, str(spot_sell_id))\n else:\n put(sell[0], 'spot', f'{pair}_sell', sell, str(spot_sell_id))\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 spot_sell_id = sell[4]\n\n balance, _ = get(quote_tick, 'balance', 0, addr)\n balance -= take_quote\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 buy_or_sell = 'buy'\n quote_value = int(args['a'][3])\n quote_balance, _ = get(quote_tick, 'balance', 0, addr)\n # quote_sum = 0\n\n spot_sell_id = spot_sell_start\n while True:\n sell, _ = get('spot', f'{pair}_sell', None, str(spot_sell_id))\n if sell is None:\n break\n\n price = sell[3]\n dx_base = min(-sell[1], -quote_value * base_scale // price)\n dx_quote = dx_base * price // base_scale\n if dx_base == 0 or dx_quote == 0:\n break\n if quote_balance - dx_quote < 0:\n break\n\n sell[1] += dx_base\n sell[2] -= dx_quote\n take_base += dx_base\n take_quote += dx_quote\n quote_balance -= dx_quote\n # quote_sum += dx_quote\n\n if sell[1] == 0 or sell[1] * price // base_scale == 0:\n spot_sell_start = _remove_order(addr, pair, sell, spot_sell_start, 'sell')\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], 'spot', f'{pair}_sell', None, str(spot_sell_id))\n else:\n put(sell[0], 'spot', f'{pair}_sell', sell, str(spot_sell_id))\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 spot_sell_id = sell[4]\n\n balance, _ = get(quote_tick, 'balance', 0, addr)\n balance -= take_quote\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 buy_or_sell = 'sell'\n quote_value = int(args['a'][3])\n base_balance, _ = get(base_tick, 'balance', 0, addr)\n # base_sum = 0\n\n spot_buy_id = spot_buy_start\n while True:\n buy, _ = get('spot', f'{pair}_buy', None, str(spot_buy_id))\n if buy is None:\n break\n\n price = buy[3]\n dx_base = min(buy[1], base_balance, quote_value * base_scale // price)\n dx_quote = dx_base * price // base_scale\n if dx_base == 0 or dx_quote == 0:\n break\n if base_balance - dx_base < 0:\n break\n\n buy[1] -= dx_base\n buy[2] += dx_quote\n take_base += dx_base\n take_quote += dx_quote\n base_balance -= dx_base\n # base_sum += dx_base\n\n if buy[1] == 0 or buy[1] * price // base_scale == 0:\n spot_buy_start = _remove_order(addr, pair, buy, spot_buy_start, 'buy')\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], 'spot', f'{pair}_buy', None, str(spot_buy_id))\n else:\n put(buy[0], 'spot', f'{pair}_buy', buy, str(spot_buy_id))\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 spot_buy_id = buy[4]\n\n balance, _ = get(base_tick, 'balance', 0, addr)\n balance -= take_base\n assert balance >= 0\n put(addr, base_tick, 'balance', balance, addr)\n\n if take_base > 0:\n price = take_quote * base_scale // take_base\n event('SpotMarketTake', [pair, buy_or_sell, addr, take_base, price])\n\n\ndef spot_limit_order_cancel(info, args):\n assert args['f'] == 'spot_limit_order_cancel'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n base_tick = args['a'][0]\n assert set(base_tick) <= set(string.ascii_uppercase + '_')\n quote_tick = args['a'][1]\n assert set(quote_tick) <= set(string.ascii_uppercase + '_')\n buy_or_sell = args['a'][2]\n assert buy_or_sell in ['buy', 'sell']\n spot_order_id = int(args['a'][3])\n\n pair = '%s_%s' % (base_tick, quote_tick)\n order_key = f'{pair}_{buy_or_sell}'\n order, _ = get('spot', order_key, None, str(spot_order_id))\n\n if order is None:\n return\n\n assert order[0] == addr, \"Sender is not the owner of the order\"\n prev_order_id = order[4]\n next_order_id = order[5]\n\n if prev_order_id is not None:\n prev_order, _ = get('spot', order_key, None, str(prev_order_id))\n if prev_order:\n prev_order[5] = next_order_id\n put(prev_order[0], 'spot', order_key, prev_order, str(prev_order_id))\n\n if next_order_id is not None:\n next_order, _ = get('spot', order_key, None, str(next_order_id))\n if next_order:\n next_order[4] = prev_order_id\n put(next_order[0], 'spot', order_key, next_order, str(next_order_id))\n\n start_key = f'{pair}_{buy_or_sell}_start'\n current_start, _ = get('spot', start_key, 1)\n if current_start == spot_order_id:\n if prev_order_id is not None:\n put(addr, 'spot', start_key, prev_order_id)\n else:\n new_start_key = f'{pair}_{buy_or_sell}_new'\n new_start_val, _ = get('spot', new_start_key, 1)\n put(addr, 'spot', start_key, new_start_val)\n\n if buy_or_sell == 'sell':\n if order[1] < 0:\n balance, _ = get(base_tick, 'balance', 0, addr)\n balance -= order[1]\n put(addr, base_tick, 'balance', balance, addr)\n elif buy_or_sell == 'buy':\n if order[2] < 0:\n balance, _ = get(quote_tick, 'balance', 0, addr)\n balance -= order[2]\n put(addr, quote_tick, 'balance', balance, addr)\n\n put(addr, 'spot', order_key, None, str(spot_order_id))\n event('SpotOrderCancel', [spot_order_id, buy_or_sell, pair])\n\n\ndef spot_pair_create(info, args):\n assert args['f'] == 'spot_pair_create'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n base_tick = args['a'][0]\n quote_tick = args['a'][1]\n\n quote_tokens, _ = get('spot', 'quote_tokens', [])\n assert quote_tick in quote_tokens, f\"{quote_tick} is not a designated quote token\"\n\n owner, _ = get('asset', 'owner', None, base_tick)\n assert owner == addr, f\"Sender must be the owner of the base token ({base_tick})\"\n pair = f'{base_tick}_{quote_tick}'\n enable, _ = get('spot', f'{pair}_enable', None)\n assert enable is None, \"Pair already exists\"\n\n put(addr, 'spot', f'{pair}_enable', True)\n put(addr, 'spot', f'{pair}_buy_start', 1)\n put(addr, 'spot', f'{pair}_buy_new', 1)\n put(addr, 'spot', f'{pair}_sell_start', 1)\n put(addr, 'spot', f'{pair}_sell_new', 1)\n\n\ndef spot_pair_enable(info, args):\n assert args['f'] == 'spot_pair_enable'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n base_tick = args['a'][0]\n quote_tick = args['a'][1]\n pair = f'{base_tick}_{quote_tick}'\n\n owner, _ = get('asset', 'owner', None, base_tick)\n assert owner == addr, f\"Sender must be the owner of the base token ({base_tick})\"\n\n put(addr, 'spot', f'{pair}_enable', True)\n\n\ndef spot_pair_disable(info, args):\n assert args['f'] == 'spot_pair_disable'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n base_tick = args['a'][0]\n quote_tick = args['a'][1]\n pair = f'{base_tick}_{quote_tick}'\n\n owner, _ = get('asset', 'owner', None, base_tick)\n assert owner == addr, f\"Sender must be the owner of the base token ({base_tick})\"\n\n put(addr, 'spot', f'{pair}_enable', False)\n\n\ndef spot_set_quote_tokens(info, args):\n assert args['f'] == 'spot_set_quote_tokens'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n manager, _ = get('spot', 'manager', None)\n assert manager is not None, \"Manager not set\"\n assert addr == manager, \"Only the manager can add quote tokens\"\n\n new_tokens = args['a'][0]\n assert isinstance(new_tokens, list), \"Quote tokens must be a list\"\n\n quote_tokens, _ = get('spot', 'quote_tokens', [])\n\n for token in new_tokens:\n assert isinstance(token, str), \"Token ticker must be a string\"\n assert set(token) <= set(string.ascii_uppercase+'_'), \"Invalid characters in token ticker\"\n if token not in quote_tokens:\n quote_tokens.append(token)\n\n put(addr, 'spot', 'quote_tokens', quote_tokens)\n\n\ndef spot_vote_manager(info, args):\n assert args['f'] == 'spot_vote_manager'\n sender = info['sender']\n addr = handle_lookup(sender)\n\n committee_members, _ = get('committee', 'members', [])\n committee_members = set(committee_members)\n assert addr in committee_members, \"Only committee members can vote\"\n\n user = args['a'][0]\n assert isinstance(user, str), \"User address must be a string\"\n\n proposal_key = f'spot_manager:{user}'\n votes, _ = get('committee', 'proposal', [], proposal_key)\n votes = set(votes)\n votes.add(addr)\n\n if len(votes) >= len(committee_members) * 2 // 3:\n put(addr, 'spot', 'manager', user)\n put(addr, 'committee', 'proposal', [], proposal_key)\n else:\n put(addr, 'committee', 'proposal', list(votes), proposal_key)\n\n"}
{"votes": [], "snippets": ["57350e141510e1ae60ff8b12fb66674b46c66f15faf128cec37936c58c513e7a"], "functions": ["spot_limit_order", "spot_market_order", "spot_limit_order_cancel", "spot_pair_create", "spot_pair_enable", "spot_pair_disable", "spot_set_quote_tokens", "spot_vote_manager"]}
4
["0x719c8d75faf8f1b117ea56205414892caab4a1b7", 10000000000000000, -680000000, 68000000000, 4, null]
["0x719c8d75faf8f1b117ea56205414892caab4a1b7", 20000000000000000, -1340000000, 67000000000, null, 3]
["0x719c8d75faf8f1b117ea56205414892caab4a1b7", -10000000000000000, 700000000, 70000000000, 5, null]
["0x719c8d75faf8f1b117ea56205414892caab4a1b7", -30000000000000000, 2190000000, 73000000000, null, 4]