-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpycmt.pyx
More file actions
140 lines (125 loc) · 5.99 KB
/
Copy pathpycmt.pyx
File metadata and controls
140 lines (125 loc) · 5.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
from libc.stdint cimport uint64_t, uint8_t
cimport libcmt
cdef class Rollup:
cdef libcmt.cmt_rollup_t _c_rollup[1]
def __cinit__(self):
libcmt.cmt_rollup_init(self._c_rollup)
def __dealloc__(self):
libcmt.cmt_rollup_fini(self._c_rollup)
cpdef str finish(self, bint last_request_status):
cdef libcmt.cmt_rollup_finish_t finish[1]
finish[0].accept_previous_request = last_request_status
err = libcmt.cmt_rollup_finish(self._c_rollup, finish)
if err != 0:
raise Exception(f"Failed to finish rollup ({err})")
if finish[0].next_request_type == libcmt.HTIF_YIELD_REASON_ADVANCE:
return "advance"
if finish[0].next_request_type == libcmt.HTIF_YIELD_REASON_INSPECT:
return "inspect"
raise Exception(f"Unknown next request type ({finish[0].next_request_type})")
cpdef object read_advance_state(self):
cdef libcmt.cmt_rollup_advance_t input[1]
err = libcmt.cmt_rollup_read_advance_state(self._c_rollup, input)
if err != 0:
raise Exception(f"Failed to read advance ({err})")
payload = input[0].payload.data[:input[0].payload.length]
app_contract = input[0].app_contract.data[:libcmt.CMT_ABI_ADDRESS_LENGTH]
msg_sender = input[0].msg_sender.data[:libcmt.CMT_ABI_ADDRESS_LENGTH]
prev_randao = input[0].prev_randao.data[:libcmt.CMT_ABI_U256_LENGTH]
ret = dict(input[0])
ret['payload']['data'] = payload
ret['app_contract'] = app_contract
ret['msg_sender'] = msg_sender
ret['prev_randao'] = prev_randao
return ret
cpdef object read_inspect_state(self):
cdef libcmt.cmt_rollup_inspect_t input[1]
err = libcmt.cmt_rollup_read_inspect_state(self._c_rollup, input)
if err != 0:
raise Exception(f"Failed to read inspect ({err})")
payload = input[0].payload.data[:input[0].payload.length]
ret = dict(input[0])
ret['payload']['data'] = payload
return ret
cpdef int emit_voucher(self, str address, object value, bytes payload):
if address.startswith("0x"):
address = address[2:]
cdef libcmt.cmt_abi_address_t address_ptr[1]
address_ptr[0].data = bytes.fromhex(address[:(2*libcmt.CMT_ABI_ADDRESS_LENGTH)])[:libcmt.CMT_ABI_ADDRESS_LENGTH]
cdef libcmt.cmt_abi_u256_t value_ptr[1]
value_ptr[0].data = bytes.fromhex(f"{value:064x}")[:libcmt.CMT_ABI_U256_LENGTH]
cdef libcmt.cmt_abi_bytes_t payload_ptr[1]
payload_ptr[0].data = payload
payload_ptr[0].length = len(payload)
cdef uint64_t cindex[1]
err = libcmt.cmt_rollup_emit_voucher(self._c_rollup, address_ptr, value_ptr, payload_ptr, cindex)
if err != 0:
raise Exception(f"Failed to emit voucher ({err})")
return cindex[0]
cpdef int emit_delegate_call_voucher(self, str address, bytes payload):
if address.startswith("0x"):
address = address[2:]
cdef libcmt.cmt_abi_address_t address_ptr[1]
address_ptr[0].data = bytes.fromhex(address[:(2*libcmt.CMT_ABI_ADDRESS_LENGTH)])[:libcmt.CMT_ABI_ADDRESS_LENGTH]
cdef libcmt.cmt_abi_bytes_t payload_ptr[1]
payload_ptr[0].data = payload
payload_ptr[0].length = len(payload)
cdef uint64_t cindex[1]
err = libcmt.cmt_rollup_emit_delegate_call_voucher(self._c_rollup, address_ptr, payload_ptr, cindex)
if err != 0:
raise Exception(f"Failed to emit delegate call voucher ({err})")
return cindex[0]
cpdef int emit_notice(self, bytes payload):
cdef libcmt.cmt_abi_bytes_t payload_ptr[1]
payload_ptr[0].data = payload
payload_ptr[0].length = len(payload)
cdef uint64_t cindex[1]
err = libcmt.cmt_rollup_emit_notice(self._c_rollup, payload_ptr, cindex)
if err != 0:
raise Exception(f"Failed to emit notice ({err})")
return cindex[0]
cpdef emit_report(self, bytes payload):
cdef libcmt.cmt_abi_bytes_t payload_ptr[1]
payload_ptr[0].data = payload
payload_ptr[0].length = len(payload)
err = libcmt.cmt_rollup_emit_report(self._c_rollup, payload_ptr)
if err != 0:
raise Exception(f"Failed to emit report ({err})")
cpdef emit_exception(self, bytes payload):
cdef libcmt.cmt_abi_bytes_t payload_ptr[1]
payload_ptr[0].data = payload
payload_ptr[0].length = len(payload)
err = libcmt.cmt_rollup_emit_exception(self._c_rollup, payload_ptr)
if err != 0:
raise Exception(f"Failed to emit exception ({err})")
cpdef load_merkle(self, str merkle_path):
b_merkle_path = merkle_path.encode('UTF-8')
cdef char *c_merkle_path = b_merkle_path
err = libcmt.cmt_rollup_load_merkle(self._c_rollup, c_merkle_path)
if err != 0:
raise Exception(f"Failed to load merkle ({err})")
cpdef save_merkle(self, str merkle_path):
b_merkle_path = merkle_path.encode('UTF-8')
cdef char *c_merkle_path = b_merkle_path
err = libcmt.cmt_rollup_save_merkle(self._c_rollup, c_merkle_path)
if err != 0:
raise Exception(f"Failed to save merkle ({err})")
cpdef reset_merkle(self):
err = libcmt.cmt_rollup_reset_merkle(self._c_rollup)
if err != 0:
raise Exception(f"Failed to reset merkle ({err})")
cpdef object gio_request(self, int domain, bytes id):
cdef libcmt.cmt_gio_t req_ptr[1]
req_ptr[0].domain = domain
req_ptr[0].id = <void *>id
req_ptr[0].id_length = len(id)
err = libcmt.cmt_gio_request(self._c_rollup, req_ptr)
if err != 0:
raise Exception(f"Failed to request gio ({err})")
response = (<uint8_t *>req_ptr[0].response_data)[:req_ptr[0].response_data_length]
ret = {
"response_data_length": req_ptr[0].response_data_length,
"response_data": response,
"response_code": req_ptr[0].response_code
}
return ret