chainlib-eth/chainlib/eth/nonce.py

64 lines
1.3 KiB
Python

# third-party imports
from hexathon import (
add_0x,
strip_0x,
)
# local imports
from chainlib.jsonrpc import JSONRPCRequest
def nonce(address, id_generator=None):
j = JSONRPCRequest(id_generator)
o = j.template()
o['method'] = 'eth_getTransactionCount'
o['params'].append(address)
o['params'].append('pending')
return j.finalize(o)
class NonceOracle:
def __init__(self, address, id_generator=None):
self.address = address
self.id_generator = id_generator
self.nonce = self.get_nonce()
def get_nonce(self):
raise NotImplementedError('Class must be extended')
def next_nonce(self):
n = self.nonce
self.nonce += 1
return n
class RPCNonceOracle(NonceOracle):
def __init__(self, address, conn, id_generator=None):
self.conn = conn
super(RPCNonceOracle, self).__init__(address, id_generator=id_generator)
def get_nonce(self):
o = nonce(self.address, id_generator=self.id_generator)
r = self.conn.do(o)
n = strip_0x(r)
return int(n, 16)
class OverrideNonceOracle(NonceOracle):
def __init__(self, address, nonce):
self.nonce = nonce
super(OverrideNonceOracle, self).__init__(address)
def get_nonce(self):
return self.nonce
DefaultNonceOracle = RPCNonceOracle