-
Notifications
You must be signed in to change notification settings - Fork 265
Expand file tree
/
Copy pathmap_entry.py
More file actions
59 lines (53 loc) · 1.73 KB
/
map_entry.py
File metadata and controls
59 lines (53 loc) · 1.73 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
from enum import IntEnum
from typing import Optional
from .tlv import TlvSerializable
from .signing_partners import CALLDATA_PARTNER
class Tag(IntEnum):
VERSION = 0x00
CHAIN_ID = 0x01
CONTRACT_ADDR = 0x02
SELECTOR = 0x03
ID = 0x04
KEY = 0x05
VALUE = 0x06
SIGNATURE = 0xff
class MapEntry(TlvSerializable):
version: int
chain_id: int
contract_addr: bytes
selector: bytes
id: int
key: bytes
value: bytes
signature: Optional[bytes] = None
def __init__(self,
version: int,
chain_id: int,
contract_addr: bytes,
selector: bytes,
id: int,
key: bytes,
value: bytes,
signature: Optional[bytes] = None):
self.version = version
self.chain_id = chain_id
self.contract_addr = contract_addr
self.selector = selector
self.id = id
self.key = key
self.value = value
self.signature = signature
def serialize(self) -> bytes:
payload = bytearray()
payload += self.serialize_field(Tag.VERSION, self.version)
payload += self.serialize_field(Tag.CHAIN_ID, self.chain_id)
payload += self.serialize_field(Tag.CONTRACT_ADDR, self.contract_addr)
payload += self.serialize_field(Tag.SELECTOR, self.selector)
payload += self.serialize_field(Tag.ID, self.id)
payload += self.serialize_field(Tag.KEY, self.key)
payload += self.serialize_field(Tag.VALUE, self.value)
sig = self.signature
if sig is None:
sig = CALLDATA_PARTNER.sign(bytes(payload))
payload += self.serialize_field(Tag.SIGNATURE, sig)
return bytes(payload)