Transaction Details
Transaction Hash
05f0e79565d650a9c9a794c63170882b36e9b48976c7c6e2cb82f1d2cfaea449
↗ Base Sepolia
From
0xe1288759446298f250c3bce5616706d25525ba7f
Transaction Data
{'p': 'zentest3', 'f': 'function_snippet', 'a': ['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 order_id = order_start\n while True:\n order, _ = get(\'predict\', f\'{pair}_{order_type}\', None, str(order_id))\n price = - quote_value * K // base_value\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] // 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] // 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] // 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] // 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\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 #TODO: add event\n\n\ndef predict_submit(info, args):\n assert args[\'f\'] == \'predict_submit\'\n sender = info[\'sender\']\n addr = handle_lookup(sender)\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_vote_manager(info, args):\n assert args[\'f\'] == \'predict_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\'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 else:\n put(addr, \'committee\', \'proposal\', list(votes), proposal_key)\n']}
Events
[['function_snippet', 'NewFunctionSnippet', '59c0543f0dfbe84c6c3a3f2836fd89b8eff4bfa7c5ec0bc86106a292e0f80034']]