2022-01-20 13:39:37 +00:00
|
|
|
import ./basics
|
2022-01-24 11:12:52 +00:00
|
|
|
import ./provider
|
2022-01-20 13:39:37 +00:00
|
|
|
|
|
|
|
export basics
|
|
|
|
|
|
|
|
type Signer* = ref object of RootObj
|
2022-01-25 09:25:09 +00:00
|
|
|
type SignerError* = object of EthersError
|
|
|
|
|
|
|
|
template raiseSignerError(message: string) =
|
|
|
|
raise newException(SignerError, message)
|
2022-01-20 13:39:37 +00:00
|
|
|
|
2022-01-24 11:12:52 +00:00
|
|
|
method provider*(signer: Signer): Provider {.base.} =
|
2022-01-20 13:39:37 +00:00
|
|
|
doAssert false, "not implemented"
|
2022-01-24 11:12:52 +00:00
|
|
|
|
|
|
|
method getAddress*(signer: Signer): Future[Address] {.base.} =
|
|
|
|
doAssert false, "not implemented"
|
|
|
|
|
2022-01-25 16:17:43 +00:00
|
|
|
method sendTransaction*(signer: Signer,
|
|
|
|
transaction: Transaction) {.base, async.} =
|
|
|
|
doAssert false, "not implemented"
|
|
|
|
|
2022-01-24 11:12:52 +00:00
|
|
|
method getGasPrice*(signer: Signer): Future[UInt256] {.base.} =
|
|
|
|
signer.provider.getGasPrice()
|
2022-01-24 11:14:31 +00:00
|
|
|
|
|
|
|
method getTransactionCount*(signer: Signer,
|
|
|
|
blockTag = BlockTag.latest):
|
|
|
|
Future[UInt256] {.base, async.} =
|
|
|
|
let address = await signer.getAddress()
|
|
|
|
return await signer.provider.getTransactionCount(address, blockTag)
|
2022-01-24 13:40:47 +00:00
|
|
|
|
|
|
|
method estimateGas*(signer: Signer,
|
|
|
|
transaction: Transaction): Future[UInt256] {.base, async.} =
|
|
|
|
var transaction = transaction
|
|
|
|
transaction.sender = some(await signer.getAddress)
|
|
|
|
return await signer.provider.estimateGas(transaction)
|
2022-01-24 16:29:25 +00:00
|
|
|
|
|
|
|
method getChainId*(signer: Signer): Future[UInt256] {.base.} =
|
|
|
|
signer.provider.getChainId()
|
2022-01-25 09:25:09 +00:00
|
|
|
|
|
|
|
method populateTransaction*(signer: Signer,
|
|
|
|
transaction: Transaction):
|
|
|
|
Future[Transaction] {.base, async.} =
|
|
|
|
|
|
|
|
if sender =? transaction.sender and sender != await signer.getAddress():
|
|
|
|
raiseSignerError("from address mismatch")
|
|
|
|
if chainId =? transaction.chainId and chainId != await signer.getChainId():
|
|
|
|
raiseSignerError("chain id mismatch")
|
|
|
|
|
|
|
|
var populated = transaction
|
|
|
|
|
|
|
|
if transaction.sender.isNone:
|
|
|
|
populated.sender = some(await signer.getAddress())
|
|
|
|
if transaction.nonce.isNone:
|
|
|
|
populated.nonce = some(await signer.getTransactionCount(BlockTag.pending))
|
|
|
|
if transaction.chainId.isNone:
|
|
|
|
populated.chainId = some(await signer.getChainId())
|
|
|
|
if transaction.gasPrice.isNone:
|
|
|
|
populated.gasPrice = some(await signer.getGasPrice())
|
|
|
|
if transaction.gasLimit.isNone:
|
|
|
|
populated.gasLimit = some(await signer.estimateGas(populated))
|
|
|
|
|
|
|
|
return populated
|