seal.py (1825B)
1 # standard imports 2 import enum 3 4 # external imports 5 from chainlib.eth.constant import ZERO_ADDRESS 6 from chainlib.jsonrpc import JSONRPCRequest 7 from chainlib.eth.tx import ( 8 TxFactory, 9 TxFormat, 10 ) 11 from chainlib.eth.contract import ( 12 ABIContractEncoder, 13 ABIContractType, 14 abi_decode_single, 15 ) 16 from hexathon import ( 17 add_0x, 18 ) 19 20 class ContractState(enum.IntEnum): 21 MINTER_STATE = 1 22 SINK_STATE = 2 23 EXPIRY_STATE = 4 24 CAP_STATE = 8 25 26 CONTRACT_SEAL_STATE_MAX = 0 27 28 for v in dir(ContractState): 29 if len(v) > 6 and v[-6:] == '_STATE': 30 CONTRACT_SEAL_STATE_MAX += getattr(ContractState, v).value 31 32 33 class SealedContract(TxFactory): 34 35 def seal(self, contract_address, sender_address, seal, tx_format=TxFormat.JSONRPC): 36 enc = ABIContractEncoder() 37 enc.method('seal') 38 enc.typ(ABIContractType.UINT256) 39 enc.uint256(seal) 40 data = enc.get() 41 tx = self.template(sender_address, contract_address, use_nonce=True) 42 tx = self.set_code(tx, data) 43 tx = self.finalize(tx, tx_format) 44 return tx 45 46 47 def is_sealed(self, contract_address, v, sender_address=ZERO_ADDRESS, id_generator=None): 48 j = JSONRPCRequest(id_generator) 49 o = j.template() 50 o['method'] = 'eth_call' 51 enc = ABIContractEncoder() 52 enc.method('isSealed') 53 enc.typ(ABIContractType.UINT256) 54 enc.uint256(v) 55 data = add_0x(enc.get()) 56 tx = self.template(sender_address, contract_address) 57 tx = self.set_code(tx, data) 58 o['params'].append(self.normalize(tx)) 59 o['params'].append('latest') 60 o = j.finalize(o) 61 return o 62 63 64 @classmethod 65 def parse_is_sealed(self, v): 66 return abi_decode_single(ABIContractType.BOOLEAN, v)