State at Block #42026679


committee-members
29450134
["0xe1288759446298f250c3bce5616706d25525ba7f"]
function-snippet:e5fb2b11848ff75c932891620723b60c8b1c8f3305c5307bf5a90e173d0911bd
29451464
{"snippet": "def committee_init(info, args):\n    assert args['f'] == 'committee_init'\n    sender = info['sender']\n    addr = handle_lookup(sender)\n    committee_members, _ = get('committee', 'members', [])\n    assert not committee_members\n    put(addr, 'committee', 'members', [addr])\n    event('CommitteeInit', [addr])\n\n\ndef committee_add_member(info, args):\n    assert args['f'] == 'committee_add_member'\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    user = args['a'][0]\n    votes, _ = get('committee', 'proposal_add', [], user)\n    votes = set(votes)\n    votes.add(addr)\n    votes = list(votes)\n    event('CommitteeAddVote', [user, addr])\n\n    if len(votes) >= len(committee_members) * 2 // 3:\n        committee_members.add(user)\n        put(addr, 'committee', 'members', list(committee_members))\n        event('CommitteeAddMember', [user])\n        votes = None\n    put(addr, 'committee', 'proposal_add', votes, user)\n\n\ndef committee_remove_member(info, args):\n    assert args['f'] == 'committee_remove_member'\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    user = args['a'][0]\n    votes, _ = get('committee', 'proposal_remove', [], user)\n    votes = set(votes)\n    votes.add(addr)\n    votes = list(votes)\n    event('CommitteeRemoveVote', [user, addr])\n\n    if len(votes) >= len(committee_members)*2//3:\n        committee_members.remove(user)\n        put(addr, 'committee', 'members', list(committee_members))\n        event('CommitteeRemoveMember', [user])\n        votes = None\n    put(addr, 'committee', 'proposal_remove', votes, user)\n", "functions": ["committee_init", "committee_add_member", "committee_remove_member"]}
function-proposal:1
29450337
{"functions": ["committee_init", "committee_add_member", "committee_remove_member"], "snippets": ["e5fb2b11848ff75c932891620723b60c8b1c8f3305c5307bf5a90e173d0911bd"], "votes": []}
function-proposal_count
41687869
39
function-code:committee_add_member
29451464
{"snippets": ["e5fb2b11848ff75c932891620723b60c8b1c8f3305c5307bf5a90e173d0911bd"]}
function-code:committee_init
29451464
{"snippets": ["e5fb2b11848ff75c932891620723b60c8b1c8f3305c5307bf5a90e173d0911bd"]}
function-code:committee_remove_member
29451464
{"snippets": ["e5fb2b11848ff75c932891620723b60c8b1c8f3305c5307bf5a90e173d0911bd"]}
function-snippet:3e4584c9f89cb04b4b9cc79182892e02c4de65883a0d70e9dee033303c445c5d
29451886
{"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    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    sender = info['sender']\n    addr = handle_lookup(sender)\n    snippet_digest = args['a'][0]\n    snippet, _ = 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(addr, 'function', 'snippet', None, snippet_digest)\n    event('RemoveFunctionSnippet', [snippet_digest, True])\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+'_')\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    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, _ = get('function', 'snippet', None, snippet_hash)\n            assert snippet, \"Snippet not found: %s\" % snippet_hash\n            snippet['functions'].extend(proposal['functions'])\n            put('', 'function', 'snippet', snippet, snippet_hash)\n\n        assert len(proposal['functions']) > 0\n        for func_name in proposal['functions']:\n            put(addr, 'function', 'code', {\n                'snippets': proposal['snippets']\n            }, func_name)\n        event('NewFunctions', [proposal_id, proposal['functions']])\n    else:\n        put(addr, 'function', 'proposal', proposal, '%s' % proposal_id)\n        event('FunctionVote', [proposal_id, addr])\n", "functions": ["function_vote", "function_snippet_clear", "function_snippet", "function_proposal"]}
function-proposal:2
29451534
{"functions": ["committee_init", "committee_add_member", "committee_remove_member"], "snippets": ["e5fb2b11848ff75c932891620723b60c8b1c8f3305c5307bf5a90e173d0911bd"], "votes": []}
function-proposal:3
29451807
{"functions": ["function_snippet", "function_snippet_clear", "function_proposal", "function_vote"], "snippets": ["3e4584c9f89cb04b4b9cc79182892e02c4de65883a0d70e9dee033303c445c5d"], "votes": []}
function-code:function_proposal
34300552
{"snippets": ["8be00fa9c0aec95de31b282add46b619baf359c556f41d06c1ef90eb5320fa49"]}
function-code:function_snippet
34300552
{"snippets": ["8be00fa9c0aec95de31b282add46b619baf359c556f41d06c1ef90eb5320fa49"]}
function-code:function_snippet_clear
34300552
{"snippets": ["8be00fa9c0aec95de31b282add46b619baf359c556f41d06c1ef90eb5320fa49"]}
function-code:function_vote
34300552
{"snippets": ["8be00fa9c0aec95de31b282add46b619baf359c556f41d06c1ef90eb5320fa49"]}
function-snippet:6999a31be16784d6ee05ef0c5cf310e2c92394c6d3a7b8eec662d3044352de24
29452128
{"functions": ["asset_create", "asset_update_ownership", "asset_update_functions"], "snippet": "def asset_create(info, args):\n    assert args['f'] == 'asset_create'\n    sender = info['sender']\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    addr = handle_lookup(sender)\n    owner, _ = get('asset', 'owner', None, tick)\n    assert not owner\n\n    put(addr, 'asset', 'owner', addr, tick)\n    put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n\ndef asset_update_ownership(info, args):\n    assert args['f'] == 'asset_update_ownership'\n    sender = info['sender']\n    tick = args['a'][0]\n    receiver = args['a'][1]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    addr = handle_lookup(sender)\n\n    owner, _ = get('asset', 'owner', None, tick)\n    assert owner == addr\n    functions, _ = get('asset', 'functions', None, tick)\n    assert type(functions) is list\n    assert functions\n    put(receiver, 'asset', 'owner', receiver, tick)\n    put(receiver, 'asset', 'functions', functions, tick)\n\n\ndef asset_update_functions(info, args):\n    assert args['f'] == 'asset_update_functions'\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    functions = args['a'][1]\n    assert type(functions) is list\n    assert functions\n"}
function-proposal:4
29452108
{"votes": [], "snippets": ["6999a31be16784d6ee05ef0c5cf310e2c92394c6d3a7b8eec662d3044352de24"], "functions": ["asset_create", "asset_update_ownership", "asset_update_functions"]}
function-code:asset_create
36595608
{"snippets": ["427754609975ef08e86f59023f8ef035e51b4c42df41c6a4325781f63d9fd92e"]}
function-code:asset_update_functions
36595608
{"snippets": ["427754609975ef08e86f59023f8ef035e51b4c42df41c6a4325781f63d9fd92e"]}
function-code:asset_update_ownership
36595608
{"snippets": ["427754609975ef08e86f59023f8ef035e51b4c42df41c6a4325781f63d9fd92e"]}
function-snippet:2f364fa5ebb7de5ea49c6d5b882b4a0928ca90d3658e383d25350d69ab777a8a
29765931
{"functions": ["token_create", "token_mint_once", "token_mint", "token_burn", "token_transfer"], "snippet": "def token_create(info, args):\n    assert args['f'] == 'token_create'\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    name = args['a'][1]\n    assert type(name) is str\n    decimal = int(args['a'][2])\n    assert type(decimal) is int\n    assert decimal >= 0 and decimal <= 18\n\n    functions = ['token_transfer', 'token_mint_once', 'asset_update_ownership', 'asset_update_functions']\n    if len(args['a']) == 4:\n        functions = args['a'][3]\n        assert type(functions) is list\n\n    put(addr, tick, 'name', name)\n    put(addr, tick, 'decimal', decimal)\n    put(addr, 'asset', 'functions', functions, tick)\n\n\ndef token_mint_once(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    value = int(args['a'][1])\n    assert value > 0\n\n    assert args['f'] == 'token_mint_once'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    total, _ = get(tick, 'total', None)\n    assert total is None, \"Token already minted\"\n    put(addr, tick, 'total', value)\n\n    balance, _ = get(tick, 'balance', 0, addr)\n    balance += value\n    put(addr, tick, 'balance', balance, addr)\n\n\ndef token_mint(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    assert args['f'] == 'token_mint'\n\n    value = int(args['a'][1])\n    assert value > 0\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    balance, _ = get(tick, 'balance', 0, addr)\n    balance += value\n    put(addr, tick, 'balance', balance, addr)\n\n    total, _ = get(tick, 'total', 0)\n    total += value\n    put(addr, tick, 'total', total)\n\n\ndef token_burn(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'token_burn'\n    assert args['f'] in get('asset', 'functions', [], tick)\n\n    value = int(args['a'][1])\n    assert value > 0\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    balance = get(tick, 'balance', 0, addr)\n    balance -= value\n    assert balance >= 0\n\n    total = get(tick, 'total', 0, addr)\n    total -= value\n    assert total >= 0\n\n    put(addr, tick, 'balance', balance, addr)\n    put(addr, tick, 'total', total)\n\n\ndef token_transfer(info, args):\n    tick = args['a'][0]\n    assert set(tick) <= set(string.ascii_uppercase+'_')\n\n    assert args['f'] == 'token_transfer'\n    assert args['f'] in get('asset', 'functions', [], tick)\n\n    receiver = args['a'][1].lower()\n    assert len(receiver) <= 42\n    assert type(receiver) is str\n    if len(receiver) == 42:\n        assert receiver.startswith('0x')\n        assert set(receiver[2:]) <= set(string.digits+'abcdef')\n    else:\n        assert len(receiver) > 4\n\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    value = int(args['a'][2])\n    assert value > 0\n\n    sender_balance, _ = get(tick, 'balance', 0, addr)\n    assert sender_balance >= value\n    sender_balance -= value\n    put(addr, tick, 'balance', sender_balance, addr)\n    receiver_balance, _ = get(tick, 'balance', 0, receiver)\n    receiver_balance += value\n    put(receiver, tick, 'balance', receiver_balance, receiver)\n    event('Transfer', [tick, addr, receiver, value])\n\n\ndef token_send(info, args):\n    assert args['f'] == 'token_send'\n\n\ndef token_accept(info, args):\n    assert args['f'] == 'token_accept'\n"}
function-proposal:5
29765916
{"votes": [], "snippets": ["2f364fa5ebb7de5ea49c6d5b882b4a0928ca90d3658e383d25350d69ab777a8a"], "functions": ["token_create", "token_mint_once", "token_mint", "token_burn", "token_transfer"]}
function-code:token_burn
34991287
{"snippets": ["df4ca4d9b0709e5e6d1ccbee9b13f8ad98ee91e19be89791ce5f469fd5253b3a", "5efa1f2df9ee471ea1e7eeffb22b9bb42d0749b7f9afe2398422776ec63c1826"]}
function-code:token_create
34991287
{"snippets": ["df4ca4d9b0709e5e6d1ccbee9b13f8ad98ee91e19be89791ce5f469fd5253b3a", "5efa1f2df9ee471ea1e7eeffb22b9bb42d0749b7f9afe2398422776ec63c1826"]}
function-code:token_mint
34991287
{"snippets": ["df4ca4d9b0709e5e6d1ccbee9b13f8ad98ee91e19be89791ce5f469fd5253b3a", "5efa1f2df9ee471ea1e7eeffb22b9bb42d0749b7f9afe2398422776ec63c1826"]}
function-code:token_mint_once
34991287
{"snippets": ["df4ca4d9b0709e5e6d1ccbee9b13f8ad98ee91e19be89791ce5f469fd5253b3a", "5efa1f2df9ee471ea1e7eeffb22b9bb42d0749b7f9afe2398422776ec63c1826"]}
function-code:token_transfer
34991287
{"snippets": ["df4ca4d9b0709e5e6d1ccbee9b13f8ad98ee91e19be89791ce5f469fd5253b3a", "5efa1f2df9ee471ea1e7eeffb22b9bb42d0749b7f9afe2398422776ec63c1826"]}
function-snippet:7ede21d83bfa2f120f1dfe100b202f39985421e0617ed81956c96fd851080730
29766214
{"functions": ["bridge_incoming_process", "bridge_incoming", "bridge_outgoing", "bridge_set_operator", "bridge_remove_operator", "bridge_set_outgoing_price"], "snippet": "\n# Elliptic Curve parameters for secp256k1\nP = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F\nA = 0\nB = 7\nGx = 55066263022277343669578718895168534326250603453777594175500187360389116729240\nGy = 32670510020758816978083085130507043184471273380659243275938904335757337482424\nG = (Gx, Gy)\nN = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141\nK = 10**18\n\ndef _inverse_mod(k, p):\n    if k == 0:\n        raise\n    return pow(k, p - 2, p)\n\ndef _is_on_curve(point):\n    if point is None:\n        return True\n    x, y = point\n    return (y * y - (x * x * x + A * x + B)) % P == 0\n\ndef _point_add(point1, point2):\n    if point1 is None:\n        return point2\n    if point2 is None:\n        return point1\n    x1, y1 = point1\n    x2, y2 = point2\n    if x1 == x2 and y1 != y2:\n        return None\n    if x1 == x2:\n        m = (3 * x1 * x1 + A) * _inverse_mod(2 * y1, P)\n    else:\n        m = (y2 - y1) * _inverse_mod(x2 - x1, P)\n    m %= P\n    x3 = (m * m - x1 - x2) % P\n    y3 = (m * (x1 - x3) - y1) % P\n    return (x3, y3)\n\ndef _scalar_mult(k, point):\n    result = None\n    addend = point\n    while k:\n        if k & 1:\n            result = _point_add(result, addend)\n        addend = _point_add(addend, addend)\n        k >>= 1\n    return result\n\ndef _ecdsa_verify(msg_hash_hex, signature_hex, public_key_hex):\n    assert msg_hash_hex.startswith('0x')\n    assert signature_hex.startswith('0x')\n    assert public_key_hex.startswith('0x')\n    r = int(signature_hex[2:66], 16)\n    s = int(signature_hex[66:130], 16)\n    if not (1 <= r < N and 1 <= s < N):\n        return False\n    point = (int(public_key_hex[2:66], 16), int(public_key_hex[66:], 16))\n    # print(type(msg_hash_hex), msg_hash_hex)\n    e = int(msg_hash_hex[2:], 16)\n    w = _inverse_mod(s, N)\n    u1 = (e * w) % N\n    u2 = (r * w) % N\n    q = _point_add(_scalar_mult(u1, G), _scalar_mult(u2, point))\n    if q is None:\n        return False\n    x, y = q\n    return r == x % N\n\ndef _ecdsa_recover(msg_hash_hex, signature_hex):\n    assert msg_hash_hex.startswith('0x')\n    assert signature_hex.startswith('0x')\n    r = int(signature_hex[2:66], 16)\n    s = int(signature_hex[66:130], 16)\n    z = int(msg_hash_hex[2:], 16)\n\n    if len(signature_hex[2:]) == 130:\n        v = int(signature_hex[130:], 16)\n        if v >= 27:\n            recovery_id = v - 27\n        else:\n            recovery_id = v\n        recovery_ids = [recovery_id]\n    else:\n        recovery_ids = [0, 1]\n\n    for recovery_id in recovery_ids:\n        for j in range(2):\n            x = r + j * N\n            if x >= P:\n                continue\n\n            y_squared = (pow(x, 3, P) + A * x + B) % P\n            y = pow(y_squared, (P + 1) // 4, P)\n\n            if y % 2 != recovery_id:\n                y = P - y\n\n            point = (x, y)\n            if not _is_on_curve(point):\n                continue\n\n            r_inv = _inverse_mod(r, N)\n            u1 = (-z * r_inv) % N\n            u2 = (s * r_inv) % N\n\n            q = _point_add(_scalar_mult(u1, G), _scalar_mult(u2, point))\n            if q is None:\n                continue\n\n            public_key_hex = f\"0x{q[0]:064x}{q[1]:064x}\"\n            if _ecdsa_verify(msg_hash_hex, signature_hex, public_key_hex):\n                return public_key_hex\n\n    return None\n\n\ndef _encode_uint256(value):\n    return value.to_bytes(32, 'big')\n\ndef _encode_address(address_str):\n    address_bytes = bytes.fromhex(address_str[2:])\n    return b'\\x00' * (32 - len(address_bytes)) + address_bytes\n\ndef _encode_dynamic_bytes(data_hex):\n    data_bytes = bytes.fromhex(data_hex)\n    length = len(data_bytes)\n    padded_length = (length + 31) // 32 * 32 # Calculate padded length for data\n    return length.to_bytes(32, 'big') + data_bytes + b'\\x00' * (padded_length - length)\n\n# '{\"a\": [845300000000000000000000002, 8453, 43114, \"0x51055892893c17ae7db48a0c0f760145bfe9f1e5\", \"0x09ace2d19b0273a762b0fe22b9e5199505c778de\", 0, \"000000000000000000000000490537058bdddaae99dd4da8b5db5675936bfedf0000000000000000000000000000000000000000000000008ac7230489e80000\", \"0000000000000000000000000000000000000000000000000000000000000000\", \"034da1308a53b6586fed90af2bd4e48cc863913551cc41d6148f43441691e4fd1ea27a1e3daf2b4c1386d0426cc37a4423729204177740768970937c93d648961c\"], \"f\": \"bridge_incoming_process\", \"p\": \"zentest\"}'\ndef bridge_incoming_process(info, args):\n    assert args['f'] == 'bridge_incoming_process'\n    sender = info['sender']\n    addr = handle_lookup(sender)\n    print('bridge_incoming_process')\n\n    txid = args['a'][0]\n    source_chain_id = args['a'][1]\n    dest_chain_id = args['a'][2]\n    source_chain_sender = args['a'][3]\n    dest_chain_recipient = args['a'][4]\n    gas = args['a'][5]\n    user_payload = args['a'][6]\n    exsig = args['a'][7]\n    signature = args['a'][8]\n\n    encoded_txid = _encode_uint256(txid)\n    encoded_source_chain_id = _encode_uint256(source_chain_id)\n    encoded_dest_chain_id = _encode_uint256(dest_chain_id)\n    encoded_source_chain_sender = _encode_address(source_chain_sender)\n    encoded_dest_chain_recipient = _encode_address(dest_chain_recipient)\n    offset_user_payload = 6 * 32\n    encoded_offset_user_payload = _encode_uint256(offset_user_payload)\n\n    header = b''.join([\n        encoded_txid,\n        encoded_source_chain_id,\n        encoded_dest_chain_id,\n        encoded_source_chain_sender,\n        encoded_dest_chain_recipient,\n        encoded_offset_user_payload,\n    ])\n    encoded_user_payload_data = _encode_dynamic_bytes(user_payload)\n\n    encoded_data = b''.join([\n        header,\n        encoded_user_payload_data,\n    ])\n    print(f\"ABI Encoded Data (Pure Python): 0x{encoded_data.hex()}\")\n\n    encoded_data_hash = keccak(encoded_data)\n    x19_msg_prefix = b\"\\x19Ethereum Signed Message:\\n\" + str(len(encoded_data_hash)).encode('utf-8')\n    x19_msg_hash = keccak(x19_msg_prefix + encoded_data_hash)\n    print(f\"x19_msg (Pure Python): 0x{x19_msg_hash.hex()}\")\n\n    print('x19', '0x'+x19_msg_hash.hex())\n    print('signature', '0x'+signature)\n    recovered_public_key = _ecdsa_recover('0x'+x19_msg_hash.hex(), '0x'+signature)\n    print(f\"recovered public key: {recovered_public_key}\")\n    if recovered_public_key:\n        public_key_bytes = bytes.fromhex(recovered_public_key[2:])\n        address_bytes = keccak(public_key_bytes)[-20:]\n        address = '0x' + address_bytes.hex()\n        print(f\"Recovered Ethereum address: {address}\")\n\n\ndef bridge_incoming(info, args):\n    assert args['f'] == 'bridge_incoming'\n    print('bridge_incoming', args)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    operator, _ = get(tick, 'incoming_operator', None)\n    assert operator is not None, \"Bridge is not initialized\"\n    sender = info['sender']\n    assert sender == operator, \"Only the operator can perform this operation\"\n\n    amount = int(args['a'][1])\n    assert amount > 0\n\n    receiver = args['a'][2].lower()\n    assert len(receiver) <= 42\n    assert type(receiver) is str\n    if len(receiver) == 42:\n        assert receiver.startswith('0x')\n        assert set(receiver[2:]) <= set(string.digits+'abcdef')\n    else:\n        assert len(receiver) > 4\n\n    balance, _ = get(tick, 'balance', 0, receiver)\n    balance = int(balance)\n    balance += amount\n    put(receiver, tick, 'balance', balance, receiver)\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    total, _ = get(tick, 'total', 0)\n    total = int(total)\n    total += amount\n    put(asset_owner, tick, 'total', total)\n\n    # call('trade_market_order', ['USDC', None, 'ZENT', 50 * 10**18 // 1000])\n    # sender_balance, _ = get(tick_1, 'balance', 0, addr)\n    print('tick', tick, 'balance', balance)\n    # print('quote_value > 0', quote_value)\n\n    if tick != 'USDC':\n        return\n\n    base_tick = 'ZENT'\n    quote_tick = tick\n    pair = '%s_%s' % (base_tick, quote_tick)\n    addr = receiver\n    quote_sum = 0\n    quote_balance = balance\n    base_value = 10**18 // 1000 * 50 # 50 bytes\n    trade_sell_start, _ = get('trade', f'{pair}_sell_start', 1)\n    # trade_buy_start, _ = get('trade', f'{pair}_buy_start', 1)\n\n    # break until the base balance is enough\n    trade_sell_id = trade_sell_start\n    while True:\n        sell, _ = get('trade', f'{pair}_sell', None, str(trade_sell_id))\n        if sell is None:\n            break\n\n        price = sell[3]\n        print(-sell[1], quote_balance * K // price, base_value)\n        dx_base = min(-sell[1], quote_balance * K // price, base_value)\n        dx_quote = dx_base * price // K\n        if dx_base == 0 or dx_quote == 0:\n            break\n        sell[1] += dx_base\n        sell[2] -= dx_quote\n\n        if quote_balance - dx_quote < 0:\n            break\n        quote_balance -= dx_quote\n        quote_sum += dx_quote\n\n        if sell[1] == 0 or sell[1] // price == 0:\n            if sell[4]:\n                prev_sell, _ = get('trade', f'{pair}_sell', None, str(sell[4]))\n                prev_sell[5] = sell[5]\n                put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n            if sell[5]:\n                next_sell, _ = get('trade', f'{pair}_sell', None, str(sell[5]))\n                next_sell[4] = sell[4]\n                put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n            if sell[4] is not None and sell[5] is None:\n                trade_sell_start = sell[4]\n                put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n            elif sell[4] is None and sell[5] is None:\n                trade_sell_new, _ = get('trade', f'{pair}_sell_new', 1)\n                trade_sell_start = trade_sell_new\n                put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n\n            print(f'{pair}_sell_to_refund', sell)\n            if sell[1] < 0:\n                balance, _ = get(base_tick, 'balance', 0, sell[0])\n                balance -= sell[1]\n                assert balance >= 0\n                put(sell[0], base_tick, 'balance', balance, sell[0])\n\n            put(sell[0], 'trade', f'{pair}_sell', None, str(trade_sell_id))\n        else:\n            put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_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        trade_sell_id = sell[4]\n\n    balance, _ = get(quote_tick, 'balance', 0, addr)\n    balance -= quote_sum\n    assert balance >= 0\n    put(addr, quote_tick, 'balance', balance, addr)\n\n\ndef bridge_outgoing(info, args):\n    assert args['f'] == 'bridge_outgoing'\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    amount = int(args['a'][1])\n    assert amount > 0\n\n    chain = args['a'][2]\n    assert chain in ['op-sepolia']\n\n    sender = info['sender']\n\n\ndef bridge_set_operator(info, args):\n    assert args['f'] == 'bridge_set_operator'\n    print('bridge_set_operator', args)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    sender = info['sender']\n    addr = handle_lookup(sender)\n    print('bridge_set_operator', asset_owner, addr)\n    assert addr == asset_owner, \"Only the asset owner can perform this operation\"\n\n    operator = args['a'][1].lower()\n    assert type(operator) is str\n    assert len(operator) == 42\n    assert operator.startswith('0x')\n    assert set(operator[2:]) <= set(string.digits+'abcdef')\n\n    put(addr, tick, 'incoming_operator', operator)\n\n\ndef bridge_remove_operator(info, args):\n    assert args['f'] == 'bridge_remove_operator'\n    print('bridge_remove_operator', args)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    sender = info['sender']\n    addr = handle_lookup(sender)\n    # print('bridge_remove_operator', asset_owner, addr)\n    assert addr == asset_owner, \"Only the asset owner can perform this operation\"\n\n    # operator = args['a'][1].lower()\n    # assert type(operator) is str\n    # assert len(operator) == 42\n    # assert operator.startswith('0x')\n    # assert set(operator[2:]) <= set(string.digits+'abcdef')\n\n    put(addr, tick, 'incoming_operator', None)\n\ndef bridge_set_outgoing_price(info, args):\n    assert args['f'] == 'bridge_set_outgoing_price'\n    print('bridge_set_outgoing_price', args)\n"}
function-proposal:6
29766204
{"votes": [], "snippets": ["7ede21d83bfa2f120f1dfe100b202f39985421e0617ed81956c96fd851080730"], "functions": ["bridge_incoming_process", "bridge_incoming", "bridge_outgoing", "bridge_set_operator", "bridge_remove_operator", "bridge_set_outgoing_price"]}
function-code:bridge_incoming
34467132
{"snippets": ["820fab69a582b09490a6f161b7921556a9e75364849e542c256c043fff11cd78"]}
function-code:bridge_incoming_process
34339528
{"snippets": ["3d07512b7230a4038a4a3f9db793fb9b4c05dc87635e0263621ff38870958112"]}
function-code:bridge_outgoing
34467132
{"snippets": ["820fab69a582b09490a6f161b7921556a9e75364849e542c256c043fff11cd78"]}
function-code:bridge_remove_operator
30178416
{"snippets": ["974f8a6375317f63a3da19c10d15d1f6d2a64ea40c63681ba41ee297938d4f62"]}
function-code:bridge_set_operator
34467132
{"snippets": ["820fab69a582b09490a6f161b7921556a9e75364849e542c256c043fff11cd78"]}
function-code:bridge_set_outgoing_price
30178416
{"snippets": ["974f8a6375317f63a3da19c10d15d1f6d2a64ea40c63681ba41ee297938d4f62"]}
function-snippet:974f8a6375317f63a3da19c10d15d1f6d2a64ea40c63681ba41ee297938d4f62
30178416
{"functions": ["bridge_incoming_process", "bridge_incoming", "bridge_outgoing", "bridge_set_operator", "bridge_remove_operator", "bridge_set_outgoing_price"], "snippet": "\n# Elliptic Curve parameters for secp256k1\nP = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F\nA = 0\nB = 7\nGx = 55066263022277343669578718895168534326250603453777594175500187360389116729240\nGy = 32670510020758816978083085130507043184471273380659243275938904335757337482424\nG = (Gx, Gy)\nN = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141\nK = 10**18\n\ndef _inverse_mod(k, p):\n    if k == 0:\n        raise\n    return pow(k, p - 2, p)\n\ndef _is_on_curve(point):\n    if point is None:\n        return True\n    x, y = point\n    return (y * y - (x * x * x + A * x + B)) % P == 0\n\ndef _point_add(point1, point2):\n    if point1 is None:\n        return point2\n    if point2 is None:\n        return point1\n    x1, y1 = point1\n    x2, y2 = point2\n    if x1 == x2 and y1 != y2:\n        return None\n    if x1 == x2:\n        m = (3 * x1 * x1 + A) * _inverse_mod(2 * y1, P)\n    else:\n        m = (y2 - y1) * _inverse_mod(x2 - x1, P)\n    m %= P\n    x3 = (m * m - x1 - x2) % P\n    y3 = (m * (x1 - x3) - y1) % P\n    return (x3, y3)\n\ndef _scalar_mult(k, point):\n    result = None\n    addend = point\n    while k:\n        if k & 1:\n            result = _point_add(result, addend)\n        addend = _point_add(addend, addend)\n        k >>= 1\n    return result\n\ndef _ecdsa_verify(msg_hash_hex, signature_hex, public_key_hex):\n    assert msg_hash_hex.startswith('0x')\n    assert signature_hex.startswith('0x')\n    assert public_key_hex.startswith('0x')\n    r = int(signature_hex[2:66], 16)\n    s = int(signature_hex[66:130], 16)\n    if not (1 <= r < N and 1 <= s < N):\n        return False\n    point = (int(public_key_hex[2:66], 16), int(public_key_hex[66:], 16))\n    # print(type(msg_hash_hex), msg_hash_hex)\n    e = int(msg_hash_hex[2:], 16)\n    w = _inverse_mod(s, N)\n    u1 = (e * w) % N\n    u2 = (r * w) % N\n    q = _point_add(_scalar_mult(u1, G), _scalar_mult(u2, point))\n    if q is None:\n        return False\n    x, y = q\n    return r == x % N\n\ndef _ecdsa_recover(msg_hash_hex, signature_hex):\n    assert msg_hash_hex.startswith('0x')\n    assert signature_hex.startswith('0x')\n    r = int(signature_hex[2:66], 16)\n    s = int(signature_hex[66:130], 16)\n    z = int(msg_hash_hex[2:], 16)\n\n    if len(signature_hex[2:]) == 130:\n        v = int(signature_hex[130:], 16)\n        if v >= 27:\n            recovery_id = v - 27\n        else:\n            recovery_id = v\n        recovery_ids = [recovery_id]\n    else:\n        recovery_ids = [0, 1]\n\n    for recovery_id in recovery_ids:\n        for j in range(2):\n            x = r + j * N\n            if x >= P:\n                continue\n\n            y_squared = (pow(x, 3, P) + A * x + B) % P\n            y = pow(y_squared, (P + 1) // 4, P)\n\n            if y % 2 != recovery_id:\n                y = P - y\n\n            point = (x, y)\n            if not _is_on_curve(point):\n                continue\n\n            r_inv = _inverse_mod(r, N)\n            u1 = (-z * r_inv) % N\n            u2 = (s * r_inv) % N\n\n            q = _point_add(_scalar_mult(u1, G), _scalar_mult(u2, point))\n            if q is None:\n                continue\n\n            public_key_hex = f\"0x{q[0]:064x}{q[1]:064x}\"\n            if _ecdsa_verify(msg_hash_hex, signature_hex, public_key_hex):\n                return public_key_hex\n\n    return None\n\n\ndef _encode_uint256(value):\n    return value.to_bytes(32, 'big')\n\ndef _encode_address(address_str):\n    address_bytes = bytes.fromhex(address_str[2:])\n    return b'\\x00' * (32 - len(address_bytes)) + address_bytes\n\ndef _encode_dynamic_bytes(data_hex):\n    data_bytes = bytes.fromhex(data_hex)\n    length = len(data_bytes)\n    padded_length = (length + 31) // 32 * 32 # Calculate padded length for data\n    return length.to_bytes(32, 'big') + data_bytes + b'\\x00' * (padded_length - length)\n\n# '{\"a\": [845300000000000000000000002, 8453, 43114, \"0x51055892893c17ae7db48a0c0f760145bfe9f1e5\", \"0x09ace2d19b0273a762b0fe22b9e5199505c778de\", 0, \"000000000000000000000000490537058bdddaae99dd4da8b5db5675936bfedf0000000000000000000000000000000000000000000000008ac7230489e80000\", \"0000000000000000000000000000000000000000000000000000000000000000\", \"034da1308a53b6586fed90af2bd4e48cc863913551cc41d6148f43441691e4fd1ea27a1e3daf2b4c1386d0426cc37a4423729204177740768970937c93d648961c\"], \"f\": \"bridge_incoming_process\", \"p\": \"zentest\"}'\ndef bridge_incoming_process(info, args):\n    assert args['f'] == 'bridge_incoming_process'\n    sender = info['sender']\n    addr = handle_lookup(sender)\n    print('bridge_incoming_process')\n\n    txid = args['a'][0]\n    source_chain_id = args['a'][1]\n    dest_chain_id = args['a'][2]\n    source_chain_sender = args['a'][3]\n    dest_chain_recipient = args['a'][4]\n    gas = args['a'][5]\n    user_payload = args['a'][6]\n    exsig = args['a'][7]\n    signature = args['a'][8]\n\n    encoded_txid = _encode_uint256(txid)\n    encoded_source_chain_id = _encode_uint256(source_chain_id)\n    encoded_dest_chain_id = _encode_uint256(dest_chain_id)\n    encoded_source_chain_sender = _encode_address(source_chain_sender)\n    encoded_dest_chain_recipient = _encode_address(dest_chain_recipient)\n    offset_user_payload = 6 * 32\n    encoded_offset_user_payload = _encode_uint256(offset_user_payload)\n\n    header = b''.join([\n        encoded_txid,\n        encoded_source_chain_id,\n        encoded_dest_chain_id,\n        encoded_source_chain_sender,\n        encoded_dest_chain_recipient,\n        encoded_offset_user_payload,\n    ])\n    encoded_user_payload_data = _encode_dynamic_bytes(user_payload)\n\n    encoded_data = b''.join([\n        header,\n        encoded_user_payload_data,\n    ])\n    print(f\"ABI Encoded Data (Pure Python): 0x{encoded_data.hex()}\")\n\n    encoded_data_hash = keccak(encoded_data)\n    x19_msg_prefix = b\"\\x19Ethereum Signed Message:\\n\" + str(len(encoded_data_hash)).encode('utf-8')\n    x19_msg_hash = keccak(x19_msg_prefix + encoded_data_hash)\n    print(f\"x19_msg (Pure Python): 0x{x19_msg_hash.hex()}\")\n\n    print('x19', '0x'+x19_msg_hash.hex())\n    print('signature', '0x'+signature)\n    recovered_public_key = _ecdsa_recover('0x'+x19_msg_hash.hex(), '0x'+signature)\n    print(f\"recovered public key: {recovered_public_key}\")\n    if recovered_public_key:\n        public_key_bytes = bytes.fromhex(recovered_public_key[2:])\n        address_bytes = keccak(public_key_bytes)[-20:]\n        address = '0x' + address_bytes.hex()\n        print(f\"Recovered Ethereum address: {address}\")\n        event('BridgeProcess', [address])\n\n\ndef bridge_incoming(info, args):\n    assert args['f'] == 'bridge_incoming'\n    print('bridge_incoming', args)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    operator, _ = get(tick, 'incoming_operator', None)\n    assert operator is not None, \"Bridge is not initialized\"\n    sender = info['sender']\n    assert sender == operator, \"Only the operator can perform this operation\"\n\n    amount = int(args['a'][1])\n    assert amount > 0\n\n    receiver = args['a'][2].lower()\n    assert len(receiver) <= 42\n    assert type(receiver) is str\n    if len(receiver) == 42:\n        assert receiver.startswith('0x')\n        assert set(receiver[2:]) <= set(string.digits+'abcdef')\n    else:\n        assert len(receiver) > 4\n\n    balance, _ = get(tick, 'balance', 0, receiver)\n    balance = int(balance)\n    balance += amount\n    put(receiver, tick, 'balance', balance, receiver)\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    total, _ = get(tick, 'total', 0)\n    total = int(total)\n    total += amount\n    put(asset_owner, tick, 'total', total)\n\n    # call('trade_market_order', ['USDC', None, 'ZENT', 50 * 10**18 // 1000])\n    # sender_balance, _ = get(tick_1, 'balance', 0, addr)\n    print('tick', tick, 'balance', balance)\n    # print('quote_value > 0', quote_value)\n\n    if tick != 'USDC':\n        return\n\n    base_tick = 'ZENT'\n    quote_tick = tick\n    pair = '%s_%s' % (base_tick, quote_tick)\n    addr = receiver\n    quote_sum = 0\n    quote_balance = balance\n    base_value = 10**18 // 1000 * 50 # 50 bytes\n    trade_sell_start, _ = get('trade', f'{pair}_sell_start', 1)\n    # trade_buy_start, _ = get('trade', f'{pair}_buy_start', 1)\n\n    # break until the base balance is enough\n    trade_sell_id = trade_sell_start\n    while True:\n        sell, _ = get('trade', f'{pair}_sell', None, str(trade_sell_id))\n        if sell is None:\n            break\n\n        price = sell[3]\n        print(-sell[1], quote_balance * K // price, base_value)\n        dx_base = min(-sell[1], quote_balance * K // price, base_value)\n        dx_quote = dx_base * price // K\n        if dx_base == 0 or dx_quote == 0:\n            break\n        sell[1] += dx_base\n        sell[2] -= dx_quote\n\n        if quote_balance - dx_quote < 0:\n            break\n        quote_balance -= dx_quote\n        quote_sum += dx_quote\n\n        if sell[1] == 0 or sell[1] // price == 0:\n            if sell[4]:\n                prev_sell, _ = get('trade', f'{pair}_sell', None, str(sell[4]))\n                prev_sell[5] = sell[5]\n                put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n            if sell[5]:\n                next_sell, _ = get('trade', f'{pair}_sell', None, str(sell[5]))\n                next_sell[4] = sell[4]\n                put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n            if sell[4] is not None and sell[5] is None:\n                trade_sell_start = sell[4]\n                put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n            elif sell[4] is None and sell[5] is None:\n                trade_sell_new, _ = get('trade', f'{pair}_sell_new', 1)\n                trade_sell_start = trade_sell_new\n                put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n\n            print(f'{pair}_sell_to_refund', sell)\n            if sell[1] < 0:\n                balance, _ = get(base_tick, 'balance', 0, sell[0])\n                balance -= sell[1]\n                assert balance >= 0\n                put(sell[0], base_tick, 'balance', balance, sell[0])\n\n            put(sell[0], 'trade', f'{pair}_sell', None, str(trade_sell_id))\n        else:\n            put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_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        trade_sell_id = sell[4]\n\n    balance, _ = get(quote_tick, 'balance', 0, addr)\n    balance -= quote_sum\n    assert balance >= 0\n    put(addr, quote_tick, 'balance', balance, addr)\n\n\ndef bridge_outgoing(info, args):\n    assert args['f'] == 'bridge_outgoing'\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    amount = int(args['a'][1])\n    assert amount > 0\n\n    chain = args['a'][2]\n    assert chain in ['op-sepolia']\n\n    sender = info['sender']\n\n\ndef bridge_set_operator(info, args):\n    assert args['f'] == 'bridge_set_operator'\n    print('bridge_set_operator', args)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    sender = info['sender']\n    addr = handle_lookup(sender)\n    print('bridge_set_operator', asset_owner, addr)\n    assert addr == asset_owner, \"Only the asset owner can perform this operation\"\n\n    operator = args['a'][1].lower()\n    assert type(operator) is str\n    assert len(operator) == 42\n    assert operator.startswith('0x')\n    assert set(operator[2:]) <= set(string.digits+'abcdef')\n\n    put(addr, tick, 'incoming_operator', operator)\n\n\ndef bridge_remove_operator(info, args):\n    assert args['f'] == 'bridge_remove_operator'\n    print('bridge_remove_operator', args)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    sender = info['sender']\n    addr = handle_lookup(sender)\n    # print('bridge_remove_operator', asset_owner, addr)\n    assert addr == asset_owner, \"Only the asset owner can perform this operation\"\n\n    # operator = args['a'][1].lower()\n    # assert type(operator) is str\n    # assert len(operator) == 42\n    # assert operator.startswith('0x')\n    # assert set(operator[2:]) <= set(string.digits+'abcdef')\n\n    put(addr, tick, 'incoming_operator', None)\n\ndef bridge_set_outgoing_price(info, args):\n    assert args['f'] == 'bridge_set_outgoing_price'\n    print('bridge_set_outgoing_price', args)\n"}
function-proposal:7
30178398
{"votes": [], "snippets": ["974f8a6375317f63a3da19c10d15d1f6d2a64ea40c63681ba41ee297938d4f62"], "functions": ["bridge_incoming_process", "bridge_incoming", "bridge_outgoing", "bridge_set_operator", "bridge_remove_operator", "bridge_set_outgoing_price"]}
function-snippet:275453fa7f22675f43408e5470eba7e07625350744a1717e54a9c39ca043c30b
34904957
{"functions": ["trade_market_order", "trade_set_quote_token", "trade_limit_order_cancel", "trade_pair_create", "trade_limit_order"], "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    order_id = order_start\n    while True:\n        order, _ = get('trade', f'{pair}_{order_type}', None, str(order_id))\n        price = - quote_value * K // base_value\n\n        if order is None:\n            put(addr, 'trade', f'{pair}_{order_type}',\n                [addr, base_value, quote_value, price, None, None], str(order_new))\n            order_new += 1\n            put(addr, 'trade', 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, 'trade', 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, 'trade', f'{pair}_{order_type}_start', order_new)\n            order[5] = order_new\n            order_new += 1\n            put(addr, 'trade', f'{pair}_{order_type}_new', order_new)\n\n            put(addr, 'trade', f'{pair}_{order_type}', order, str(order_id))\n            if next_order_id is not None:\n                next_order, _ = get('trade', 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, 'trade', f'{pair}_{order_type}', next_order, str(next_order_id))\n            break\n\n        if order[4] is None:\n            put(addr, 'trade', f'{pair}_{order_type}',\n                [addr, base_value, quote_value, price, None, order_id], str(order_new))\n            put(addr, 'trade', 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, 'trade', 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('trade', f'{pair}_{buy_or_sell}', None, str(order[4]))\n        prev_order[5] = order[5]\n        put(prev_order[0], 'trade', f'{pair}_{buy_or_sell}', prev_order, str(order[4]))\n\n    if order[5]:\n        next_order, _ = get('trade', f'{pair}_{buy_or_sell}', None, str(order[5]))\n        next_order[4] = order[4]\n        put(next_order[0], 'trade', 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, 'trade', f'{pair}_{buy_or_sell}_start', order_start)\n\n    elif order[4] is None and order[5] is None:\n        order_new, _ = get('trade', f'{pair}_{buy_or_sell}_new', 1)\n        order_start = order_new\n        put(addr, 'trade', f'{pair}_{buy_or_sell}_start', order_start)\n\n    return order_start\n\n\ndef trade_limit_order(info, args):\n    assert args['f'] == 'trade_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_value = int(args['a'][1])\n    quote_value = int(args['a'][3])\n    assert base_value * quote_value < 0\n\n    trade_buy_start, _ = get('trade', f'{pair}_buy_start', 1)\n    trade_buy_new, _ = get('trade', f'{pair}_buy_new', 1)\n    trade_sell_start, _ = get('trade', f'{pair}_sell_start', 1)\n    trade_sell_new, _ = get('trade', 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_amount = - base_value\n        assert balance >= 0\n        put(addr, base_tick, 'balance', balance, addr)\n\n        order_id = trade_sell_new\n        trade_sell_start, trade_sell_new = _insert_order(addr, pair, 'sell', trade_sell_start, trade_sell_new, quote_value, base_value)\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_amount = - quote_value\n        assert balance >= 0\n        put(addr, quote_tick, 'balance', balance, addr)\n\n        order_id = trade_buy_new\n        trade_buy_start, trade_buy_new = _insert_order(addr, pair, 'buy', trade_buy_start, trade_buy_new, quote_value, base_value)\n\n    trade_sell_id = trade_sell_start\n    highest_buy_price = None\n    take_amount = 0\n\n    while True:\n        sell, _ = get('trade', f'{pair}_sell', None, str(trade_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        trade_buy_id = trade_buy_start\n        while True:\n            buy, _ = get('trade', f'{pair}_buy', None, str(trade_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                trade_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            if buy_or_sell == 'buy':\n                take_amount += dx_base\n            else:\n                take_amount += dx_quote\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                trade_buy_start = _remove_order(addr, pair, buy, trade_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], 'trade', f'{pair}_buy', None, str(trade_buy_id))\n            else:\n                put(buy[0], 'trade', f'{pair}_buy', buy, str(trade_buy_id))\n\n            if sell[1] == 0:\n                break\n            if buy[4] is None:\n                break\n            trade_buy_id = buy[4]\n\n        if sell[1] == 0:\n            trade_sell_start = _remove_order(addr, pair, sell, trade_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], 'trade', f'{pair}_sell', None, str(trade_sell_id))\n        else:\n            put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_sell_id))\n\n        if sell[4] is None:\n            break\n        trade_sell_id = sell[4]\n\n    make_amount -= take_amount\n    assert make_amount >= 0\n    price = 0\n    event('TradeOrderMake', [pair, buy_or_sell, addr, make_amount, price, order_id])\n    if take_amount > 0:\n        cost = 0\n        event('TradeOrderTake', [pair, buy_or_sell, addr, take_amount, price, cost])\n\n\ndef trade_market_order(info, args):\n    assert args['f'] == 'trade_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    trade_sell_start, _ = get('trade', f'{pair}_sell_start', 1)\n    trade_buy_start, _ = get('trade', f'{pair}_buy_start', 1)\n\n    take_amount = 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        trade_buy_id = trade_buy_start\n        while True:\n            buy, _ = get('trade', f'{pair}_buy', None, str(trade_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            buy[1] -= dx_base\n            buy[2] += dx_quote\n            take_amount += dx_quote\n\n            if base_balance - dx_base < 0:\n                break\n            base_balance -= dx_base\n            base_sum += dx_base\n\n            if buy[1] == 0 or buy[1] // price == 0:\n                trade_buy_start = _remove_order(addr, pair, buy, trade_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], 'trade', f'{pair}_buy', None, str(trade_buy_id))\n            else:\n                put(buy[0], 'trade', f'{pair}_buy', buy, str(trade_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            trade_buy_id = buy[4]\n\n        balance, _ = get(base_tick, 'balance', 0, addr)\n        balance -= base_sum\n        assert balance >= 0\n        put(addr, base_tick, 'balance', balance, addr)\n\n    elif quote_value is None and int(base_value) > 0:\n        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        trade_sell_id = trade_sell_start\n        while True:\n            sell, _ = get('trade', f'{pair}_sell', None, str(trade_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            sell[1] += dx_base\n            sell[2] -= dx_quote\n            take_amount += dx_base\n\n            if quote_balance - dx_quote < 0:\n                break\n            quote_balance -= dx_quote\n            quote_sum += dx_quote\n\n            if sell[1] == 0 or sell[1] // price == 0:\n                trade_sell_start = _remove_order(addr, pair, sell, trade_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], 'trade', f'{pair}_sell', None, str(trade_sell_id))\n            else:\n                put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_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            trade_sell_id = sell[4]\n\n        balance, _ = get(quote_tick, 'balance', 0, addr)\n        balance -= quote_sum\n        assert balance >= 0\n        put(addr, quote_tick, 'balance', balance, addr)\n\n    elif base_value is None and int(quote_value) < 0:\n        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        trade_sell_id = trade_sell_start\n        while True:\n            sell, _ = get('trade', f'{pair}_sell', None, str(trade_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            sell[1] += dx_base\n            sell[2] -= dx_quote\n            take_amount += dx_base\n\n            if quote_balance - dx_quote < 0:\n                break\n            quote_balance -= dx_quote\n            quote_sum += dx_quote\n\n            if sell[1] == 0 or sell[1] // price == 0:\n                trade_sell_start = _remove_order(addr, pair, sell, trade_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], 'trade', f'{pair}_sell', None, str(trade_sell_id))\n            else:\n                put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_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            trade_sell_id = sell[4]\n\n        balance, _ = get(quote_tick, 'balance', 0, addr)\n        balance -= quote_sum\n        assert balance >= 0\n        put(addr, quote_tick, 'balance', balance, addr)\n\n    elif base_value is None and int(quote_value) > 0:\n        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        trade_buy_id = trade_buy_start\n        while True:\n            buy, _ = get('trade', f'{pair}_buy', None, str(trade_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            buy[1] -= dx_base\n            buy[2] += dx_quote\n            take_amount += dx_quote\n\n            if base_balance - dx_base < 0:\n                break\n            base_balance -= dx_base\n            base_sum += dx_base\n\n            if buy[1] == 0 or buy[1] // price == 0:\n                trade_buy_start = _remove_order(addr, pair, buy, trade_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], 'trade', f'{pair}_buy', None, str(trade_buy_id))\n            else:\n                put(buy[0], 'trade', f'{pair}_buy', buy, str(trade_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            trade_buy_id = buy[4]\n\n        balance, _ = get(base_tick, 'balance', 0, addr)\n        balance -= base_sum\n        assert balance >= 0\n        put(addr, base_tick, 'balance', balance, addr)\n\n    if take_amount > 0:\n        cost = 0\n        price = 0\n        event('TradeOrderTake', [pair, buy_or_sell, addr, take_amount, price, cost])\n\n\ndef trade_limit_order_cancel(info, args):\n    assert args['f'] == 'trade_limit_order_cancel'\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    base_tick = args['a'][1]\n    assert set(base_tick) <= set(string.ascii_uppercase + '_')\n    quote_tick = args['a'][2]\n    assert set(quote_tick) <= set(string.ascii_uppercase + '_')\n    buy_or_sell = args['a'][3]\n    assert buy_or_sell in ['buy', 'sell']\n    trade_order_id = int(args['a'][4])\n\n    pair = '%s_%s' % (base_tick, quote_tick)\n    order_key = f'{pair}_{buy_or_sell}'\n    order, _ = get('trade', order_key, None, str(trade_order_id))\n\n    assert order is not None, \"Order does not exist\"\n    assert order[0] == addr, \"Sender is not the owner of the order\"\n\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('trade', order_key, None, str(prev_order_id))\n        if prev_order:\n            prev_order[5] = next_order_id\n            put(prev_order[0], 'trade', order_key, prev_order, str(prev_order_id))\n\n    if next_order_id is not None:\n        next_order, _ = get('trade', order_key, None, str(next_order_id))\n        if next_order:\n            next_order[4] = prev_order_id\n            put(next_order[0], 'trade', order_key, next_order, str(next_order_id))\n\n    start_key = f'{pair}_{buy_or_sell}_start'\n    current_start, _ = get('trade', start_key, 1)\n    if current_start == trade_order_id:\n        if prev_order_id is not None:\n            put(addr, 'trade', start_key, prev_order_id)\n        else:\n            new_start_key = f'{pair}_{buy_or_sell}_new'\n            new_start_val, _ = get('trade', new_start_key, 1)\n            put(addr, 'trade', 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, 'trade', order_key, None, str(trade_order_id))\n    event('TradeOrderCancel', [trade_order_id, buy_or_sell, pair])\n\n\ndef trade_pair_create(info, args):\n    assert args['f'] == 'trade_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('trade', '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('trade', f'{pair}_enable', None)\n    assert enable is None, \"Pair already exists\"\n\n    put(addr, 'trade', f'{pair}_enable', True)\n    put(addr, 'trade', f'{pair}_buy_start', 1)\n    put(addr, 'trade', f'{pair}_buy_new', 1)\n    put(addr, 'trade', f'{pair}_sell_start', 1)\n    put(addr, 'trade', f'{pair}_sell_new', 1)\n\n\ndef trade_pair_enable(info, args):\n    assert args['f'] == 'trade_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, 'trade', f'{pair}_enable', True)\n\n\ndef trade_pair_disable(info, args):\n    assert args['f'] == 'trade_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, 'trade', f'{pair}_enable', False)\n\n\ndef trade_set_quote_token(info, args):\n    assert args['f'] == 'trade_set_quote_token'\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    treasure_manager, _ = get('trade', 'treasure_manager', None)\n    assert treasure_manager is not None, \"Treasure manager not set\"\n    assert addr == treasure_manager, \"Only the treasure 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('trade', '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, 'trade', 'quote_tokens', quote_tokens)\n\n\ndef trade_vote_treasure_manager(info, args):\n    assert args['f'] == 'trade_vote_treasure_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'trade_treasure_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, 'trade', 'treasure_manager', user)\n        put(addr, 'committee', 'proposal', [], proposal_key)\n    else:\n        put(addr, 'committee', 'proposal', list(votes), proposal_key)\n"}
function-proposal:8
30178515
{"votes": [], "snippets": ["275453fa7f22675f43408e5470eba7e07625350744a1717e54a9c39ca043c30b"], "functions": ["bridge_incoming_process", "bridge_incoming", "bridge_outgoing", "bridge_set_operator", "bridge_remove_operator", "bridge_set_outgoing_price"]}
function-proposal:9
30178568
{"votes": [], "snippets": ["275453fa7f22675f43408e5470eba7e07625350744a1717e54a9c39ca043c30b"], "functions": ["trade_limit_order", "trade_market_order", "trade_limit_order_cancel", "trade_pair_create", "trade_set_quote_token"]}
function-code:trade_limit_order
41687897
{"snippets": ["da0d197cc4efeba707139d152f630f81eed98ceebb41f6a9b20d7c20acdbc416"]}
function-code:trade_limit_order_cancel
41687897
{"snippets": ["da0d197cc4efeba707139d152f630f81eed98ceebb41f6a9b20d7c20acdbc416"]}
function-code:trade_market_order
41687897
{"snippets": ["da0d197cc4efeba707139d152f630f81eed98ceebb41f6a9b20d7c20acdbc416"]}
function-code:trade_pair_create
41687897
{"snippets": ["da0d197cc4efeba707139d152f630f81eed98ceebb41f6a9b20d7c20acdbc416"]}
function-code:trade_set_quote_token
41687897
{"snippets": ["da0d197cc4efeba707139d152f630f81eed98ceebb41f6a9b20d7c20acdbc416"]}
asset-functions:USDC
36687755
["token_mint_free", "token_transfer", "token_mint", "token_burn", "token_send", "token_accept", "privacy_init", "privacy_deposit", "privacy_deposit_cancel", "privacy_enter", "privacy_exit", "bridge_incoming", "bridge_outgoing", "bridge_set_operator", "bridge_set_outgoing_fee", "asset_update_ownership", "asset_update_functions"]
asset-owner:USDC
36595621
"0xe1288759446298f250c3bce5616706d25525ba7f"
USDC-decimal
30228145
6
USDC-name
30228145
"Mock USDC"
USDC-balance:0x719c8d75faf8f1b117ea56205414892caab4a1b7
41987422
303526499993
USDC-total
41987357
100000000000000000000000000000000000000000001294305000000
asset-functions:BTC
30228608
["token_transfer", "token_mint_once", "asset_update_ownership", "asset_update_functions"]
asset-owner:BTC
30228593
"0x719c8d75faf8f1b117ea56205414892caab4a1b7"
BTC-decimal
30228608
18
BTC-name
30228608
"Mock BTC"
BTC-balance:0x719c8d75faf8f1b117ea56205414892caab4a1b7
41900582
19999999999999999979999988850000000000000000
BTC-total
30228623
21000000000000000000000000000000000000000000
function-snippet:a02ff1a10108da1a0ab7bf9e5c4ee96b45d5723f5b3775d8a04aee37d09dc67d
30231749
{"functions": ["token_create", "token_mint_once", "token_mint", "token_burn", "token_transfer"], "snippet": "def token_create(info, args):\n    assert args['f'] == 'token_create'\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    name = args['a'][1]\n    assert type(name) is str\n    decimal = int(args['a'][2])\n    assert type(decimal) is int\n    assert decimal >= 0 and decimal <= 18\n\n    functions = ['token_transfer', 'token_mint_once', 'asset_update_ownership', 'asset_update_functions']\n    if len(args['a']) == 4:\n        functions = args['a'][3]\n        assert type(functions) is list\n\n    put(addr, tick, 'name', name)\n    put(addr, tick, 'decimal', decimal)\n    put(addr, 'asset', 'functions', functions, tick)\n\n\ndef token_mint_once(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    value = int(args['a'][1])\n    assert value > 0\n\n    assert args['f'] == 'token_mint_once'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    total, _ = get(tick, 'total', None)\n    assert total is None, \"Token already minted\"\n    put(addr, tick, 'total', value)\n\n    balance, _ = get(tick, 'balance', 0, addr)\n    balance += value\n    put(addr, tick, 'balance', balance, addr)\n\n\ndef token_mint(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    assert args['f'] == 'token_mint'\n\n    value = int(args['a'][1])\n    assert value > 0\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    balance, _ = get(tick, 'balance', 0, addr)\n    balance += value\n    put(addr, tick, 'balance', balance, addr)\n\n    total, _ = get(tick, 'total', 0)\n    total += value\n    put(addr, tick, 'total', total)\n\n\ndef token_burn(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'token_burn'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    value = int(args['a'][1])\n    assert value > 0\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    balance, _ = get(tick, 'balance', 0, addr)\n    balance -= value\n    assert balance >= 0\n\n    total, _ = get(tick, 'total', 0, addr)\n    total -= value\n    assert total >= 0\n\n    put(addr, tick, 'balance', balance, addr)\n    put(addr, tick, 'total', total)\n\n\ndef token_transfer(info, args):\n    tick = args['a'][0]\n    assert set(tick) <= set(string.ascii_uppercase+'_')\n\n    assert args['f'] == 'token_transfer'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    receiver = args['a'][1].lower()\n    assert len(receiver) <= 42\n    assert type(receiver) is str\n    if len(receiver) == 42:\n        assert receiver.startswith('0x')\n        assert set(receiver[2:]) <= set(string.digits+'abcdef')\n    else:\n        assert len(receiver) > 4\n\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    value = int(args['a'][2])\n    assert value > 0\n\n    sender_balance, _ = get(tick, 'balance', 0, addr)\n    assert sender_balance >= value\n    sender_balance -= value\n    put(addr, tick, 'balance', sender_balance, addr)\n    receiver_balance, _ = get(tick, 'balance', 0, receiver)\n    receiver_balance += value\n    put(receiver, tick, 'balance', receiver_balance, receiver)\n    event('Transfer', [tick, addr, receiver, value])\n\n\ndef token_send(info, args):\n    assert args['f'] == 'token_send'\n\n\ndef token_accept(info, args):\n    assert args['f'] == 'token_accept'\n"}
function-proposal:10
30231718
{"votes": [], "snippets": ["a02ff1a10108da1a0ab7bf9e5c4ee96b45d5723f5b3775d8a04aee37d09dc67d"], "functions": ["token_create", "token_mint_once", "token_mint", "token_burn", "token_transfer"]}
BTC-balance:0x376d3737da2a540318bba02a98f03a97d1dd8f6d
34347178
20000009000000000000000000
USDC-balance:0x376d3737da2a540318bba02a98f03a97d1dd8f6d
36627194
89999900500000
trade-BTC_USDC_buy:1
41900582
null
trade-BTC_USDC_buy_new
41900856
11
trade-BTC_USDC_sell:1
41987222
null
trade-BTC_USDC_sell_new
41900582
8
function-snippet:450391cfb7d02cb4e8f3d94e0108f8734e39e2cbba7aacda8c466fa38356d7d2
34290242
{"functions": ["asset_create", "asset_update_ownership", "asset_update_functions", "asset_batch_create"], "snippet": "def asset_create(info, args):\n    assert args['f'] == 'asset_create'\n    sender = info['sender']\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    addr = handle_lookup(sender)\n    owner, _ = get('asset', 'owner', None, tick)\n    assert not owner\n\n    put(addr, 'asset', 'owner', addr, tick)\n    put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n\ndef asset_update_ownership(info, args):\n    assert args['f'] == 'asset_update_ownership'\n    sender = info['sender']\n    tick = args['a'][0]\n    receiver = args['a'][1]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    addr = handle_lookup(sender)\n    owner, _ = get('asset', 'owner', None, tick)\n    assert owner == addr\n\n    # DO THIS to change the owner using receiver's Zentra token\n    functions, _ = get('asset', 'functions', None, tick)\n    assert type(functions) is list\n    assert functions\n    put(receiver, 'asset', 'owner', receiver, tick)\n    put(receiver, 'asset', 'functions', functions, tick)\n\n\ndef asset_update_functions(info, args):\n    assert args['f'] == 'asset_update_functions'\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    owner, _ = get('asset', 'owner', None, tick)\n    assert owner == addr\n\n    functions = args['a'][1]\n    assert type(functions) is list\n    assert functions\n    put(addr, 'asset', 'functions', functions, tick)\n\ndef asset_batch_create(info, args):\n    assert args['f'] == 'asset_batch_create'\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    ticks = args['a'][0]\n    assert type(tick) is list\n    for tick in ticks:\n        assert type(tick) is str\n        assert len(tick) > 0 and len(tick) < 42\n        assert tick[0] in string.ascii_uppercase\n        assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n        addr = handle_lookup(sender)\n        owner, _ = get('asset', 'owner', None, tick)\n        assert not owner\n\n        put(addr, 'asset', 'owner', addr, tick)\n        put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n"}
function-proposal:11
34290212
{"votes": [], "snippets": ["450391cfb7d02cb4e8f3d94e0108f8734e39e2cbba7aacda8c466fa38356d7d2"], "functions": ["asset_create", "asset_update_ownership", "asset_update_functions", "asset_batch_create"]}
function-code:asset_batch_create
36595608
{"snippets": ["427754609975ef08e86f59023f8ef035e51b4c42df41c6a4325781f63d9fd92e"]}
function-snippet:e270bab619761a7012c71813bf7c0f2b207ddd13632156fb3644be5e0b514f03
34303548
{"functions": ["asset_update_functions", "asset_update_ownership", "asset_create", "asset_batch_create"], "snippet": "def asset_create(info, args):\n    assert args['f'] == 'asset_create'\n    sender = info['sender']\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    addr = handle_lookup(sender)\n    owner, _ = get('asset', 'owner', None, tick)\n    assert not owner\n\n    put(addr, 'asset', 'owner', addr, tick)\n    put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n\ndef asset_update_ownership(info, args):\n    assert args['f'] == 'asset_update_ownership'\n    sender = info['sender']\n    tick = args['a'][0]\n    receiver = args['a'][1]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    addr = handle_lookup(sender)\n    owner, _ = get('asset', 'owner', None, tick)\n    assert owner == addr\n\n    # DO THIS to change the owner using receiver's Zentra token\n    functions, _ = get('asset', 'functions', None, tick)\n    assert type(functions) is list\n    assert functions\n    put(receiver, 'asset', 'owner', receiver, tick)\n    put(receiver, 'asset', 'functions', functions, tick)\n\n\ndef asset_update_functions(info, args):\n    assert args['f'] == 'asset_update_functions'\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    owner, _ = get('asset', 'owner', None, tick)\n    assert owner == addr\n\n    functions = args['a'][1]\n    assert type(functions) is list\n    assert functions\n    put(addr, 'asset', 'functions', functions, tick)\n\ndef asset_batch_create(info, args):\n    assert args['f'] == 'asset_batch_create'\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    ticks = args['a'][0]\n    assert type(ticks) is list\n    for tick in ticks:\n        assert type(tick) is str\n        assert len(tick) > 0 and len(tick) < 42\n        assert tick[0] in string.ascii_uppercase\n        assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n        addr = handle_lookup(sender)\n        owner, _ = get('asset', 'owner', None, tick)\n        assert not owner\n\n        put(addr, 'asset', 'owner', addr, tick)\n        put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n"}
function-proposal:12
34297117
{"votes": [], "snippets": ["e270bab619761a7012c71813bf7c0f2b207ddd13632156fb3644be5e0b514f03"], "functions": ["asset_create", "asset_update_ownership", "asset_update_functions", "asset_batch_create"]}
function-snippet:8be00fa9c0aec95de31b282add46b619baf359c556f41d06c1ef90eb5320fa49
34300552
{"functions": ["function_snippet", "function_snippet_clear", "function_proposal", "function_vote"], "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    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    sender = info['sender']\n    addr = handle_lookup(sender)\n    snippet_digest = args['a'][0]\n    snippet, _ = 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(addr, 'function', 'snippet', None, snippet_digest)\n    event('RemoveFunctionSnippet', [snippet_digest, True])\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, _ = 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('', 'function', 'snippet', snippet, snippet_hash)\n\n        assert len(proposal['functions']) > 0\n        for func_name in proposal['functions']:\n            put(addr, 'function', 'code', {\n                'snippets': proposal['snippets']\n            }, func_name)\n\n        funcs_reload(proposal['functions'])\n        event('NewFunctions', [proposal_id, proposal['functions']])\n    else:\n        put(addr, 'function', 'proposal', proposal, '%s' % proposal_id)\n        event('FunctionVote', [proposal_id, addr])\n"}
function-proposal:13
34299199
{"votes": [], "snippets": ["8be00fa9c0aec95de31b282add46b619baf359c556f41d06c1ef90eb5320fa49"], "functions": ["function_snippet", "function_snippet_clear", "function_proposal", "function_vote"]}
function-snippet:f3e19ded26e56bd19d7de9bca70bc83cc9bdf5d53e8270ada052532ff68a2c2f
34303645
{"functions": ["asset_update_functions", "asset_update_ownership", "asset_create", "asset_batch_create"], "snippet": "def asset_create(info, args):\n    assert args['f'] == 'asset_create'\n    sender = info['sender']\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    addr = handle_lookup(sender)\n    owner, _ = get('asset', 'owner', None, tick)\n    assert not owner\n\n    put(addr, 'asset', 'owner', addr, tick)\n    put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n\ndef asset_update_ownership(info, args):\n    assert args['f'] == 'asset_update_ownership'\n    sender = info['sender']\n    tick = args['a'][0]\n    receiver = args['a'][1]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    addr = handle_lookup(sender)\n    owner, _ = get('asset', 'owner', None, tick)\n    assert owner == addr\n\n    # DO THIS to change the owner using receiver's Zentra token\n    functions, _ = get('asset', 'functions', None, tick)\n    assert type(functions) is list\n    assert functions\n    put(receiver, 'asset', 'owner', receiver, tick)\n    put(receiver, 'asset', 'functions', functions, tick)\n\n\ndef asset_update_functions(info, args):\n    assert args['f'] == 'asset_update_functions'\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    owner, _ = get('asset', 'owner', None, tick)\n    assert owner == addr\n\n    functions = args['a'][1]\n    assert type(functions) is list\n    assert functions\n    put(addr, 'asset', 'functions', functions, tick)\n\ndef asset_batch_create(info, args):\n    assert args['f'] == 'asset_batch_create'\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    ticks = args['a'][0]\n    assert type(ticks) is list\n    for tick in ticks:\n        assert type(tick) is str\n        assert len(tick) > 0 and len(tick) < 42\n        assert tick[0] in string.ascii_uppercase\n        assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n        addr = handle_lookup(sender)\n        owner, _ = get('asset', 'owner', None, tick)\n\n        if not owner:\n            put(addr, 'asset', 'owner', addr, tick)\n            put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n"}
function-proposal:14
34303541
{"votes": [], "snippets": ["f3e19ded26e56bd19d7de9bca70bc83cc9bdf5d53e8270ada052532ff68a2c2f"], "functions": ["asset_create", "asset_update_ownership", "asset_update_functions", "asset_batch_create"]}
asset-functions:AAAAAA
34306331
["asset_update_ownership", "asset_update_functions"]
asset-functions:CCCCCC
34306331
["asset_update_ownership", "asset_update_functions"]
asset-owner:AAAAAA
34306331
"0xe1288759446298f250c3bce5616706d25525ba7f"
asset-owner:CCCCCC
34306331
"0xe1288759446298f250c3bce5616706d25525ba7f"
function-snippet:36779d7edd2940ecc0828d6251fb92fba429919fea7a6dcaa042ebd9e84be429
34306580
{"functions": ["asset_update_functions", "asset_update_ownership", "asset_create", "asset_batch_create"], "snippet": "def asset_create(info, args):\n    assert args['f'] == 'asset_create'\n    sender = info['sender']\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    addr = handle_lookup(sender)\n    owner, _ = get('asset', 'owner', None, tick)\n    assert not owner\n\n    put(addr, 'asset', 'owner', addr, tick)\n    put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n\ndef asset_update_ownership(info, args):\n    assert args['f'] == 'asset_update_ownership'\n    sender = info['sender']\n    tick = args['a'][0]\n    receiver = args['a'][1]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    addr = handle_lookup(sender)\n    owner, _ = get('asset', 'owner', None, tick)\n    assert owner == addr\n\n    # DO THIS to change the owner using receiver's Zentra token\n    functions, _ = get('asset', 'functions', None, tick)\n    assert type(functions) is list\n    assert functions\n    put(receiver, 'asset', 'owner', receiver, tick)\n    put(receiver, 'asset', 'functions', functions, tick)\n\n\ndef asset_update_functions(info, args):\n    assert args['f'] == 'asset_update_functions'\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n    owner, _ = get('asset', 'owner', None, tick)\n    assert owner == addr\n\n    functions = args['a'][1]\n    assert type(functions) is list\n    assert functions\n    put(addr, 'asset', 'functions', functions, tick)\n\ndef asset_batch_create(info, args):\n    assert args['f'] == 'asset_batch_create'\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    ticks = args['a'][0]\n    assert type(ticks) is list\n    for tick in ticks:\n        assert type(tick) is str\n        assert len(tick) > 0 and len(tick) < 42\n        assert tick[0] in string.ascii_uppercase\n        assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n        addr = handle_lookup(sender)\n        owner, _ = get('asset', 'owner', None, tick)\n        assert not owner\n\n        if not owner:\n            put(addr, 'asset', 'owner', addr, tick)\n            put(addr, 'asset', 'functions', ['asset_update_ownership', 'asset_update_functions'], tick)\n"}
function-proposal:15
34306497
{"votes": [], "snippets": ["36779d7edd2940ecc0828d6251fb92fba429919fea7a6dcaa042ebd9e84be429"], "functions": ["asset_create", "asset_update_ownership", "asset_update_functions", "asset_batch_create"]}
asset-functions:JJJJJJJ
34308360
["asset_update_ownership", "asset_update_functions"]
asset-functions:KKKKKK
34308360
["asset_update_ownership", "asset_update_functions"]
asset-owner:JJJJJJJ
34308360
"0xe1288759446298f250c3bce5616706d25525ba7f"
asset-owner:KKKKKK
34308360
"0xe1288759446298f250c3bce5616706d25525ba7f"
function-snippet:3d07512b7230a4038a4a3f9db793fb9b4c05dc87635e0263621ff38870958112
34339528
{"functions": ["bridge_unset_operator", "bridge_incoming_process", "bridge_set_operator", "bridge_incoming", "bridge_set_outgoing_fee", "bridge_outgoing"], "snippet": "\n# Elliptic Curve parameters for secp256k1\n# P = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F\n# A = 0\n# B = 7\n# Gx = 55066263022277343669578718895168534326250603453777594175500187360389116729240\n# Gy = 32670510020758816978083085130507043184471273380659243275938904335757337482424\n# G = (Gx, Gy)\n# N = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141\n# K = 10**18\n\n# def _inverse_mod(k, p):\n#     if k == 0:\n#         raise\n#     return pow(k, p - 2, p)\n\n# def _is_on_curve(point):\n#     if point is None:\n#         return True\n#     x, y = point\n#     return (y * y - (x * x * x + A * x + B)) % P == 0\n\n# def _point_add(point1, point2):\n#     if point1 is None:\n#         return point2\n#     if point2 is None:\n#         return point1\n#     x1, y1 = point1\n#     x2, y2 = point2\n#     if x1 == x2 and y1 != y2:\n#         return None\n#     if x1 == x2:\n#         m = (3 * x1 * x1 + A) * _inverse_mod(2 * y1, P)\n#     else:\n#         m = (y2 - y1) * _inverse_mod(x2 - x1, P)\n#     m %= P\n#     x3 = (m * m - x1 - x2) % P\n#     y3 = (m * (x1 - x3) - y1) % P\n#     return (x3, y3)\n\n# def _scalar_mult(k, point):\n#     result = None\n#     addend = point\n#     while k:\n#         if k & 1:\n#             result = _point_add(result, addend)\n#         addend = _point_add(addend, addend)\n#         k >>= 1\n#     return result\n\n# def _ecdsa_verify(msg_hash_hex, signature_hex, public_key_hex):\n#     assert msg_hash_hex.startswith('0x')\n#     assert signature_hex.startswith('0x')\n#     assert public_key_hex.startswith('0x')\n#     r = int(signature_hex[2:66], 16)\n#     s = int(signature_hex[66:130], 16)\n#     if not (1 <= r < N and 1 <= s < N):\n#         return False\n#     point = (int(public_key_hex[2:66], 16), int(public_key_hex[66:], 16))\n#     # print(type(msg_hash_hex), msg_hash_hex)\n#     e = int(msg_hash_hex[2:], 16)\n#     w = _inverse_mod(s, N)\n#     u1 = (e * w) % N\n#     u2 = (r * w) % N\n#     q = _point_add(_scalar_mult(u1, G), _scalar_mult(u2, point))\n#     if q is None:\n#         return False\n#     x, y = q\n#     return r == x % N\n\n# def _ecdsa_recover(msg_hash_hex, signature_hex):\n#     assert msg_hash_hex.startswith('0x')\n#     assert signature_hex.startswith('0x')\n#     r = int(signature_hex[2:66], 16)\n#     s = int(signature_hex[66:130], 16)\n#     z = int(msg_hash_hex[2:], 16)\n\n#     if len(signature_hex[2:]) == 130:\n#         v = int(signature_hex[130:], 16)\n#         if v >= 27:\n#             recovery_id = v - 27\n#         else:\n#             recovery_id = v\n#         recovery_ids = [recovery_id]\n#     else:\n#         recovery_ids = [0, 1]\n\n#     for recovery_id in recovery_ids:\n#         for j in range(2):\n#             x = r + j * N\n#             if x >= P:\n#                 continue\n\n#             y_squared = (pow(x, 3, P) + A * x + B) % P\n#             y = pow(y_squared, (P + 1) // 4, P)\n\n#             if y % 2 != recovery_id:\n#                 y = P - y\n\n#             point = (x, y)\n#             if not _is_on_curve(point):\n#                 continue\n\n#             r_inv = _inverse_mod(r, N)\n#             u1 = (-z * r_inv) % N\n#             u2 = (s * r_inv) % N\n\n#             q = _point_add(_scalar_mult(u1, G), _scalar_mult(u2, point))\n#             if q is None:\n#                 continue\n\n#             public_key_hex = f\"0x{q[0]:064x}{q[1]:064x}\"\n#             if _ecdsa_verify(msg_hash_hex, signature_hex, public_key_hex):\n#                 return public_key_hex\n\n#     return None\n\n\n# def _encode_uint256(value):\n#     return value.to_bytes(32, 'big')\n\n# def _encode_address(address_str):\n#     address_bytes = bytes.fromhex(address_str[2:])\n#     return b'\\x00' * (32 - len(address_bytes)) + address_bytes\n\n# def _encode_dynamic_bytes(data_hex):\n#     data_bytes = bytes.fromhex(data_hex)\n#     length = len(data_bytes)\n#     padded_length = (length + 31) // 32 * 32 # Calculate padded length for data\n#     return length.to_bytes(32, 'big') + data_bytes + b'\\x00' * (padded_length - length)\n\n# # '{\"a\": [845300000000000000000000002, 8453, 43114, \"0x51055892893c17ae7db48a0c0f760145bfe9f1e5\", \"0x09ace2d19b0273a762b0fe22b9e5199505c778de\", 0, \"000000000000000000000000490537058bdddaae99dd4da8b5db5675936bfedf0000000000000000000000000000000000000000000000008ac7230489e80000\", \"0000000000000000000000000000000000000000000000000000000000000000\", \"034da1308a53b6586fed90af2bd4e48cc863913551cc41d6148f43441691e4fd1ea27a1e3daf2b4c1386d0426cc37a4423729204177740768970937c93d648961c\"], \"f\": \"bridge_incoming_process\", \"p\": \"zentest\"}'\n# def bridge_incoming_process(info, args):\n#     assert args['f'] == 'bridge_incoming_process'\n#     sender = info['sender']\n#     addr = handle_lookup(sender)\n#     print('bridge_incoming_process')\n\n#     txid = args['a'][0]\n#     source_chain_id = args['a'][1]\n#     dest_chain_id = args['a'][2]\n#     source_chain_sender = args['a'][3]\n#     dest_chain_recipient = args['a'][4]\n#     gas = args['a'][5]\n#     user_payload = args['a'][6]\n#     exsig = args['a'][7]\n#     signature = args['a'][8]\n\n#     encoded_txid = _encode_uint256(txid)\n#     encoded_source_chain_id = _encode_uint256(source_chain_id)\n#     encoded_dest_chain_id = _encode_uint256(dest_chain_id)\n#     encoded_source_chain_sender = _encode_address(source_chain_sender)\n#     encoded_dest_chain_recipient = _encode_address(dest_chain_recipient)\n#     offset_user_payload = 6 * 32\n#     encoded_offset_user_payload = _encode_uint256(offset_user_payload)\n\n#     header = b''.join([\n#         encoded_txid,\n#         encoded_source_chain_id,\n#         encoded_dest_chain_id,\n#         encoded_source_chain_sender,\n#         encoded_dest_chain_recipient,\n#         encoded_offset_user_payload,\n#     ])\n#     encoded_user_payload_data = _encode_dynamic_bytes(user_payload)\n\n#     encoded_data = b''.join([\n#         header,\n#         encoded_user_payload_data,\n#     ])\n#     print(f\"ABI Encoded Data (Pure Python): 0x{encoded_data.hex()}\")\n\n#     encoded_data_hash = keccak(encoded_data)\n#     x19_msg_prefix = b\"\\x19Ethereum Signed Message:\\n\" + str(len(encoded_data_hash)).encode('utf-8')\n#     x19_msg_hash = keccak(x19_msg_prefix + encoded_data_hash)\n#     print(f\"x19_msg (Pure Python): 0x{x19_msg_hash.hex()}\")\n\n#     print('x19', '0x'+x19_msg_hash.hex())\n#     print('signature', '0x'+signature)\n#     recovered_public_key = _ecdsa_recover('0x'+x19_msg_hash.hex(), '0x'+signature)\n#     print(f\"recovered public key: {recovered_public_key}\")\n#     if recovered_public_key:\n#         public_key_bytes = bytes.fromhex(recovered_public_key[2:])\n#         address_bytes = keccak(public_key_bytes)[-20:]\n#         address = '0x' + address_bytes.hex()\n#         print(f\"Recovered Ethereum address: {address}\")\n#         event('BridgeProcess', [address])\n\n\n# def bridge_incoming2(info, args):\n#     assert args['f'] == 'bridge_incoming'\n#     print('bridge_incoming', args)\n\n#     tick = args['a'][0]\n#     assert type(tick) is str\n#     assert len(tick) > 0 and len(tick) < 42\n#     assert tick[0] in string.ascii_uppercase\n#     assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n#     operator, _ = get(tick, 'incoming_operator', None)\n#     assert operator is not None, \"Bridge is not initialized\"\n#     sender = info['sender']\n#     assert sender == operator, \"Only the operator can perform this operation\"\n\n#     amount = int(args['a'][1])\n#     assert amount > 0\n\n#     receiver = args['a'][2].lower()\n#     assert len(receiver) <= 42\n#     assert type(receiver) is str\n#     if len(receiver) == 42:\n#         assert receiver.startswith('0x')\n#         assert set(receiver[2:]) <= set(string.digits+'abcdef')\n#     else:\n#         assert len(receiver) > 4\n\n#     balance, _ = get(tick, 'balance', 0, receiver)\n#     balance = int(balance)\n#     balance += amount\n#     put(receiver, tick, 'balance', balance, receiver)\n\n#     asset_owner, _ = get('asset', 'owner', None, tick)\n#     total, _ = get(tick, 'total', 0)\n#     total = int(total)\n#     total += amount\n#     put(asset_owner, tick, 'total', total)\n\n#     # call('trade_market_order', ['USDC', None, 'ZENT', 50 * 10**18 // 1000])\n#     # sender_balance, _ = get(tick_1, 'balance', 0, addr)\n#     print('tick', tick, 'balance', balance)\n#     # print('quote_value > 0', quote_value)\n\n#     if tick != 'USDC':\n#         return\n\n#     base_tick = 'ZENT'\n#     quote_tick = tick\n#     pair = '%s_%s' % (base_tick, quote_tick)\n#     addr = receiver\n#     quote_sum = 0\n#     quote_balance = balance\n#     base_value = 10**18 // 1000 * 50 # 50 bytes\n#     trade_sell_start, _ = get('trade', f'{pair}_sell_start', 1)\n#     # trade_buy_start, _ = get('trade', f'{pair}_buy_start', 1)\n\n#     # break until the base balance is enough\n#     trade_sell_id = trade_sell_start\n#     while True:\n#         sell, _ = get('trade', f'{pair}_sell', None, str(trade_sell_id))\n#         if sell is None:\n#             break\n\n#         price = sell[3]\n#         print(-sell[1], quote_balance * K // price, base_value)\n#         dx_base = min(-sell[1], quote_balance * K // price, base_value)\n#         dx_quote = dx_base * price // K\n#         if dx_base == 0 or dx_quote == 0:\n#             break\n#         sell[1] += dx_base\n#         sell[2] -= dx_quote\n\n#         if quote_balance - dx_quote < 0:\n#             break\n#         quote_balance -= dx_quote\n#         quote_sum += dx_quote\n\n#         if sell[1] == 0 or sell[1] // price == 0:\n#             if sell[4]:\n#                 prev_sell, _ = get('trade', f'{pair}_sell', None, str(sell[4]))\n#                 prev_sell[5] = sell[5]\n#                 put(prev_sell[0], 'trade', f'{pair}_sell', prev_sell, str(sell[4]))\n\n#             if sell[5]:\n#                 next_sell, _ = get('trade', f'{pair}_sell', None, str(sell[5]))\n#                 next_sell[4] = sell[4]\n#                 put(next_sell[0], 'trade', f'{pair}_sell', next_sell, str(sell[5]))\n\n#             if sell[4] is not None and sell[5] is None:\n#                 trade_sell_start = sell[4]\n#                 put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n#             elif sell[4] is None and sell[5] is None:\n#                 trade_sell_new, _ = get('trade', f'{pair}_sell_new', 1)\n#                 trade_sell_start = trade_sell_new\n#                 put(addr, 'trade', f'{pair}_sell_start', trade_sell_start)\n\n#             print(f'{pair}_sell_to_refund', sell)\n#             if sell[1] < 0:\n#                 balance, _ = get(base_tick, 'balance', 0, sell[0])\n#                 balance -= sell[1]\n#                 assert balance >= 0\n#                 put(sell[0], base_tick, 'balance', balance, sell[0])\n\n#             put(sell[0], 'trade', f'{pair}_sell', None, str(trade_sell_id))\n#         else:\n#             put(sell[0], 'trade', f'{pair}_sell', sell, str(trade_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#         trade_sell_id = sell[4]\n\n#     balance, _ = get(quote_tick, 'balance', 0, addr)\n#     balance -= quote_sum\n#     assert balance >= 0\n#     put(addr, quote_tick, 'balance', balance, addr)\n\n\ndef bridge_incoming(info, args):\n    assert args['f'] == 'bridge_incoming'\n    print('bridge_incoming', args)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    operator, _ = get(tick, 'incoming_operator', None)\n    assert operator is not None, \"Bridge is not initialized\"\n    sender = info['sender']\n    assert sender == operator, \"Only the operator can perform this operation\"\n\n    amount = int(args['a'][1])\n    assert amount > 0\n\n    receiver = args['a'][2].lower()\n    assert len(receiver) <= 42\n    assert type(receiver) is str\n    if len(receiver) == 42:\n        assert receiver.startswith('0x')\n        assert set(receiver[2:]) <= set(string.digits+'abcdef')\n    else:\n        assert len(receiver) > 4\n\n    balance, _ = get(tick, 'balance', 0, receiver)\n    balance = int(balance)\n    balance += amount\n    put(receiver, tick, 'balance', balance, receiver)\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    total, _ = get(tick, 'total', 0)\n    total = int(total)\n    total += amount\n    put(asset_owner, tick, 'total', total)\n\n\ndef bridge_outgoing(info, args):\n    assert args['f'] == 'bridge_outgoing'\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    amount = int(args['a'][1])\n    assert amount > 0\n\n    chain = args['a'][2]\n    assert chain in ['base', 'base-sepolia', 'op-sepolia']\n\n    sender = info['sender']\n    event('BridgeOutgoing', [tick, amount, chain, sender])\n\n\ndef bridge_set_operator(info, args):\n    assert args['f'] == 'bridge_set_operator'\n    print('bridge_set_operator', args)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    sender = info['sender']\n    addr = handle_lookup(sender)\n    print('bridge_set_operator', asset_owner, addr)\n    assert addr == asset_owner, \"Only the asset owner can perform this operation\"\n\n    operator = args['a'][1].lower()\n    assert type(operator) is str\n    # assert len(operator) == 42\n    assert operator.startswith('0x')\n    assert set(operator[2:]) <= set(string.digits+'abcdef')\n\n    put(addr, tick, 'incoming_operator', operator)\n\n\ndef bridge_unset_operator(info, args):\n    assert args['f'] == 'bridge_unset_operator'\n    print('bridge_unset_operator', args)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    sender = info['sender']\n    addr = handle_lookup(sender)\n    # print('bridge_unset_operator', asset_owner, addr)\n    assert addr == asset_owner, \"Only the asset owner can perform this operation\"\n\n    # operator = args['a'][1].lower()\n    # assert type(operator) is str\n    # assert len(operator) == 42\n    # assert operator.startswith('0x')\n    # assert set(operator[2:]) <= set(string.digits+'abcdef')\n\n    put(addr, tick, 'incoming_operator', None)\n\ndef bridge_set_outgoing_fee(info, args):\n    assert args['f'] == 'bridge_set_outgoing_fee'\n    print('bridge_set_outgoing_fee', args)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    chain = args['a'][1]\n    assert chain in ['base', 'base-sepolia', 'op-sepolia']\n\n    fee = int(args['a'][2])\n    assert fee > 0\n"}
function-proposal:16
34339331
{"votes": [], "snippets": ["3d07512b7230a4038a4a3f9db793fb9b4c05dc87635e0263621ff38870958112"], "functions": ["bridge_incoming_process", "bridge_incoming", "bridge_outgoing", "bridge_set_operator", "bridge_unset_operator", "bridge_set_outgoing_fee"]}
function-code:bridge_set_outgoing_fee
34467132
{"snippets": ["820fab69a582b09490a6f161b7921556a9e75364849e542c256c043fff11cd78"]}
function-code:bridge_unset_operator
34467132
{"snippets": ["820fab69a582b09490a6f161b7921556a9e75364849e542c256c043fff11cd78"]}
BTC-balance:0x82b2ab7c6dd19e0e853dfb5d090b2bbd18ecdcfd
34353678
199999999999999999999999000000000000000000
BTC-balance:0x19b1ea9060937c72eb24bb73ef1fe617c7103511
34374613
199999999999999999999999000000000000000000
BTC-balance:0xfe42dda92a00392f35bb7c804f448a402bba477a
34375037
199999999999999999999999000000000000000000
BTC-balance:0x267a6522bffc76d61a633d231d9ef84059bc3e27
34390848
199999999999999999999999000000000000000000
BTC-balance:0xd38e673b012c1b966d1d4f8702b205a3bd1d2261
34433276
199999999999999999999999990000000000000000
function-snippet:e0fe7978025d6dc254c81cd3406c7eaf4b290ea1752ee031e1c8c3678ec96b1e
34470218
{"functions": ["token_burn", "token_send", "token_mint", "token_mint_once", "token_transfer", "token_accept", "token_create"], "snippet": "def token_create(info, args):\n    assert args['f'] == 'token_create'\n\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    name = args['a'][1]\n    assert type(name) is str\n    decimal = int(args['a'][2])\n    assert type(decimal) is int\n    assert decimal >= 0 and decimal <= 18\n\n    functions = ['token_transfer', 'token_mint_once', 'asset_update_ownership', 'asset_update_functions']\n    if len(args['a']) == 4:\n        functions = args['a'][3]\n        assert type(functions) is list\n\n    put(addr, tick, 'name', name)\n    put(addr, tick, 'decimal', decimal)\n    put(addr, 'asset', 'functions', functions, tick)\n\n\ndef token_mint_once(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'token_mint_once'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    value = int(args['a'][1])\n    assert value > 0\n\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    total, _ = get(tick, 'total', None)\n    assert total is None, \"Token already minted\"\n    put(addr, tick, 'total', value)\n\n    balance, _ = get(tick, 'balance', 0, addr)\n    balance += value\n    put(addr, tick, 'balance', balance, addr)\n\n\ndef token_mint(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'token_mint'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    value = int(args['a'][1])\n    assert value > 0\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    balance, _ = get(tick, 'balance', 0, addr)\n    balance += value\n    put(addr, tick, 'balance', balance, addr)\n\n    total, _ = get(tick, 'total', 0)\n    total += value\n    put(addr, tick, 'total', total)\n\n\ndef token_burn(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'token_burn'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    value = int(args['a'][1])\n    assert value > 0\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    balance, _ = get(tick, 'balance', 0, addr)\n    balance -= value\n    assert balance >= 0\n\n    total, _ = get(tick, 'total', 0, addr)\n    total -= value\n    assert total >= 0\n\n    put(addr, tick, 'balance', balance, addr)\n    put(addr, tick, 'total', total)\n\n\ndef token_transfer(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'token_transfer'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    receiver = args['a'][1].lower()\n    assert len(receiver) <= 42\n    assert type(receiver) is str\n    if len(receiver) == 42:\n        assert receiver.startswith('0x')\n        assert set(receiver[2:]) <= set(string.digits+'abcdef')\n    else:\n        assert len(receiver) > 4\n\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    value = int(args['a'][2])\n    assert value > 0\n\n    sender_balance, _ = get(tick, 'balance', 0, addr)\n    assert sender_balance >= value\n    sender_balance -= value\n    put(addr, tick, 'balance', sender_balance, addr)\n    receiver_balance, _ = get(tick, 'balance', 0, receiver)\n    receiver_balance += value\n    put(receiver, tick, 'balance', receiver_balance, receiver)\n    event('Transfer', [tick, addr, receiver, value])\n\n\ndef token_send(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'token_send'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    sender = info['sender']\n    addr = handle_lookup(sender)\n\n    spender = args['a'][1].lower()  # the address allowed to spend\n    assert len(spender) <= 42\n    assert type(spender) is str\n    if len(spender) == 42:\n        assert spender.startswith('0x')\n        assert set(spender[2:]) <= set(string.digits+'abcdef')\n    else:\n        assert len(spender) > 4\n\n    value = int(args['a'][2])\n    assert value >= 0\n\n    put(addr, tick, 'allowance', value, f'{addr},{spender}')\n    event('SendApproval', [tick, addr, spender, value])\n\n\ndef token_accept(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'token_accept'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    from_addr = args['a'][1].lower()  # the address from which tokens are withdrawn\n    assert len(from_addr) <= 42\n    assert type(from_addr) is str\n    if len(from_addr) == 42:\n        assert from_addr.startswith('0x')\n        assert set(from_addr[2:]) <= set(string.digits+'abcdef')\n    else:\n        assert len(from_addr) > 4\n\n    to_addr = info['sender']\n    to_addr = handle_lookup(to_addr)\n    value = int(args['a'][2])\n    assert value > 0\n\n    allowance, _ = get(tick, 'allowance', 0, f'{from_addr},{to_addr}')\n    from_balance, _ = get(tick, 'balance', 0, from_addr)\n    allowance -= value\n    assert allowance >= 0\n    from_balance -= value\n    assert from_balance >= 0\n    put(from_addr, tick, 'allowance', allowance, f'{from_addr},{to_addr}')\n    put(from_addr, tick, 'balance', from_balance, from_addr)\n\n    to_balance, _ = get(tick, 'balance', 0, to_addr)\n    to_balance += value\n    put(to_addr, tick, 'balance', to_balance, to_addr)\n\n    event('Transfer', [tick, from_addr, to_addr, value])\n\n"}
function-proposal:17
34462810
{"votes": [], "snippets": ["e0fe7978025d6dc254c81cd3406c7eaf4b290ea1752ee031e1c8c3678ec96b1e"], "functions": ["token_create", "token_mint_once", "token_mint", "token_burn", "token_transfer", "token_send", "token_accept"]}
function-code:token_accept
34991287
{"snippets": ["df4ca4d9b0709e5e6d1ccbee9b13f8ad98ee91e19be89791ce5f469fd5253b3a", "5efa1f2df9ee471ea1e7eeffb22b9bb42d0749b7f9afe2398422776ec63c1826"]}
function-code:token_send
34991287
{"snippets": ["df4ca4d9b0709e5e6d1ccbee9b13f8ad98ee91e19be89791ce5f469fd5253b3a", "5efa1f2df9ee471ea1e7eeffb22b9bb42d0749b7f9afe2398422776ec63c1826"]}
function-snippet:4ab60a5271b2eeebb72952ec6fb27ce9dcfc1d49277e86adc900d605d2f471a5
34462916
{"functions": ["bridge_unset_operator", "bridge_set_operator", "bridge_incoming", "bridge_set_outgoing_fee", "bridge_outgoing"], "snippet": "def bridge_incoming(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'bridge_incoming'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    operator, _ = get(tick, 'incoming_operator', None)\n    assert operator is not None, \"Bridge is not initialized\"\n    sender = info['sender']\n    assert sender == operator, \"Only the operator can perform this operation\"\n\n    amount = int(args['a'][1])\n    assert amount > 0\n\n    receiver = args['a'][2].lower()\n    assert len(receiver) <= 42\n    assert type(receiver) is str\n    if len(receiver) == 42:\n        assert receiver.startswith('0x')\n        assert set(receiver[2:]) <= set(string.digits+'abcdef')\n    else:\n        assert len(receiver) > 4\n\n    balance, _ = get(tick, 'balance', 0, receiver)\n    balance = int(balance)\n    balance += amount\n    put(receiver, tick, 'balance', balance, receiver)\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    total, _ = get(tick, 'total', 0)\n    total = int(total)\n    total += amount\n    put(asset_owner, tick, 'total', total)\n\n\ndef bridge_outgoing(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'bridge_outgoing'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    amount = int(args['a'][1])\n    assert amount > 0\n\n    chain = args['a'][2]\n    assert chain in ['base', 'base-sepolia', 'op-sepolia']\n\n    sender = info['sender']\n    event('BridgeOutgoing', [tick, amount, chain, sender])\n\n\ndef bridge_set_operator(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'bridge_set_operator'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    sender = info['sender']\n    addr = handle_lookup(sender)\n    print('bridge_set_operator', asset_owner, addr)\n    assert addr == asset_owner, \"Only the asset owner can perform this operation\"\n\n    operator = args['a'][1].lower()\n    assert type(operator) is str\n    # assert len(operator) == 42\n    assert operator.startswith('0x')\n    assert set(operator[2:]) <= set(string.digits+'abcdef')\n\n    put(addr, tick, 'incoming_operator', operator)\n\n\ndef bridge_unset_operator(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'bridge_unset_operator'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    sender = info['sender']\n    addr = handle_lookup(sender)\n    # print('bridge_unset_operator', asset_owner, addr)\n    assert addr == asset_owner, \"Only the asset owner can perform this operation\"\n\n    # operator = args['a'][1].lower()\n    # assert type(operator) is str\n    # assert len(operator) == 42\n    # assert operator.startswith('0x')\n    # assert set(operator[2:]) <= set(string.digits+'abcdef')\n\n    put(addr, tick, 'incoming_operator', None)\n\ndef bridge_set_outgoing_fee(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'bridge_set_outgoing_fee'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    chain = args['a'][1]\n    assert chain in ['base']\n\n    fee = int(args['a'][2])\n    assert fee > 0\n"}
function-proposal:18
34462913
{"votes": [], "snippets": ["4ab60a5271b2eeebb72952ec6fb27ce9dcfc1d49277e86adc900d605d2f471a5"], "functions": ["bridge_incoming", "bridge_outgoing", "bridge_set_operator", "bridge_unset_operator", "bridge_set_outgoing_fee"]}
function-snippet:16c78e1a080ab6cd6548ad6065d67929ad817d9fd976d680a03adfef2a4a87dd
34465724
{"functions": ["bridge_unset_operator", "bridge_set_operator", "bridge_incoming", "bridge_set_outgoing_fee", "bridge_outgoing"], "snippet": "def bridge_incoming(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'bridge_incoming'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    operator, _ = get(tick, 'bridge_operator', None)\n    assert operator is not None, \"Bridge is not initialized\"\n    sender = info['sender']\n    assert sender == operator, \"Only the operator can perform this operation\"\n\n    amount = int(args['a'][1])\n    assert amount > 0\n\n    receiver = args['a'][2].lower()\n    assert len(receiver) <= 42\n    assert type(receiver) is str\n    if len(receiver) == 42:\n        assert receiver.startswith('0x')\n        assert set(receiver[2:]) <= set(string.digits+'abcdef')\n    else:\n        assert len(receiver) > 4\n\n    chain = args['a'][3].lower()\n    assert chain in ['base']\n    tx_hash = args['a'][4].lower().replace('0x', '')\n    assert len(tx_hash) == 64\n\n    balance, _ = get(tick, 'balance', 0, receiver)\n    balance = int(balance)\n    balance += amount\n    put(receiver, tick, 'balance', balance, receiver)\n\n    total, _ = get(tick, 'total', 0)\n    total = int(total)\n    total += amount\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    assert asset_owner\n    put(asset_owner, tick, 'total', total)\n\n    event('BridgeIn', [tick, amount, sender, chain, tx_hash])\n\n\ndef bridge_outgoing(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'bridge_outgoing'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    amount = int(args['a'][1])\n    assert amount > 0\n\n    # decuct balance and total\n    balance, _ = get(tick, 'balance', 0, receiver)\n    balance = int(balance)\n    assert balance - amount >= 0\n    balance -= amount\n    put(receiver, tick, 'balance', balance, receiver)\n\n    total, _ = get(tick, 'total', 0)\n    total = int(total)\n    assert total - amount >= 0\n    total -= amount\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    assert asset_owner\n    put(asset_owner, tick, 'total', total)\n\n    chain = args['a'][2]\n    assert chain in ['base']\n\n    sender = info['sender']\n    # addr = handle_lookup(sender)\n    event('BridgeOut', [tick, amount, chain, sender])\n\n\ndef bridge_set_operator(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'bridge_set_operator'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    sender = info['sender']\n    addr = handle_lookup(sender)\n    # print('bridge_set_operator', asset_owner, addr)\n    assert sender == asset_owner, \"Only the asset owner can perform this operation\"\n\n    operator = args['a'][1].lower()\n    assert type(operator) is str\n    # assert len(operator) == 42\n    assert operator.startswith('0x')\n    assert set(operator[2:]) <= set(string.digits+'abcdef')\n\n    put(addr, tick, 'bridge_operator', operator)\n    event('BridgeOperaterSet', [tick, operator])\n\n\ndef bridge_unset_operator(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'bridge_unset_operator'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    sender = info['sender']\n    addr = handle_lookup(sender)\n    assert addr == asset_owner, \"Only the asset owner can perform this operation\"\n\n    put(addr, tick, 'bridge_operator', None)\n    event('BridgeOperaterUnset', [tick])\n\ndef bridge_set_outgoing_fee(info, args):\n    tick = args['a'][0]\n    assert type(tick) is str\n    assert len(tick) > 0 and len(tick) < 42\n    assert tick[0] in string.ascii_uppercase\n    assert set(tick) <= set(string.ascii_uppercase+string.digits+'_')\n\n    assert args['f'] == 'bridge_set_outgoing_fee'\n    functions, _ = get('asset', 'functions', [], tick)\n    assert args['f'] in functions\n\n    chain = args['a'][1]\n    assert chain in ['base']\n\n    fee = int(args['a'][2])\n    assert fee > 0\n\n    asset_owner, _ = get('asset', 'owner', None, tick)\n    sender = info['sender']\n    addr = handle_lookup(sender)\n    assert addr == asset_owner, \"Only the asset owner can perform this operation\"\n\n    put(asset_owner, tick, 'bridgeout_fee', fee)\n    event('BridgeOutFeeChanged', [tick, fee])\n"}
function-proposal:19
34465719
{"votes": [], "snippets": ["16c78e1a080ab6cd6548ad6065d67929ad817d9fd976d680a03adfef2a4a87dd"], "functions": ["bridge_incoming", "bridge_outgoing", "bridge_set_operator", "bridge_unset_operator", "bridge_set_outgoing_fee"]}