State at Block #29766163


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
29765916
5
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
29451886
{"snippets": ["3e4584c9f89cb04b4b9cc79182892e02c4de65883a0d70e9dee033303c445c5d"]}
function-code:function_snippet
29451886
{"snippets": ["3e4584c9f89cb04b4b9cc79182892e02c4de65883a0d70e9dee033303c445c5d"]}
function-code:function_snippet_clear
29451886
{"snippets": ["3e4584c9f89cb04b4b9cc79182892e02c4de65883a0d70e9dee033303c445c5d"]}
function-code:function_vote
29451886
{"snippets": ["3e4584c9f89cb04b4b9cc79182892e02c4de65883a0d70e9dee033303c445c5d"]}
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
29452128
{"snippets": ["6999a31be16784d6ee05ef0c5cf310e2c92394c6d3a7b8eec662d3044352de24"]}
function-code:asset_update_functions
29452128
{"snippets": ["6999a31be16784d6ee05ef0c5cf310e2c92394c6d3a7b8eec662d3044352de24"]}
function-code:asset_update_ownership
29452128
{"snippets": ["6999a31be16784d6ee05ef0c5cf310e2c92394c6d3a7b8eec662d3044352de24"]}
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
29765931
{"snippets": ["2f364fa5ebb7de5ea49c6d5b882b4a0928ca90d3658e383d25350d69ab777a8a"]}
function-code:token_create
29765931
{"snippets": ["2f364fa5ebb7de5ea49c6d5b882b4a0928ca90d3658e383d25350d69ab777a8a"]}
function-code:token_mint
29765931
{"snippets": ["2f364fa5ebb7de5ea49c6d5b882b4a0928ca90d3658e383d25350d69ab777a8a"]}
function-code:token_mint_once
29765931
{"snippets": ["2f364fa5ebb7de5ea49c6d5b882b4a0928ca90d3658e383d25350d69ab777a8a"]}
function-code:token_transfer
29765931
{"snippets": ["2f364fa5ebb7de5ea49c6d5b882b4a0928ca90d3658e383d25350d69ab777a8a"]}