Commit Graph

150 Commits

Author SHA1 Message Date
Mark Spanbroek 4e4a55b13e Cleanup 2023-07-04 12:58:48 +02:00
Mark Spanbroek cb95cbc15a Make BlockHandler callback synchronous (breaking change)
Refactored the confirm() implementation to work
with a synchronous callback
2023-07-04 12:58:48 +02:00
Mark Spanbroek 82f6449374 Move JsonRpcSubscription type to jsonrpc module
Allows it to insert convertError to ensure that
any errors are re-raised as JsonRpcProviderError
2023-07-03 13:09:09 +02:00
Mark Spanbroek 738c6a87e2 Stop polling when provider is closed 2023-07-03 13:09:09 +02:00
Mark Spanbroek a27c2de41c Close provider by unsubscribing and closing client 2023-07-03 13:09:09 +02:00
Mark Spanbroek 2481bda6e4 Subscribe to logs with polling 2023-07-03 13:09:09 +02:00
Mark Spanbroek 0aea16047c Ignore errors when retrieving block by hash 2023-07-03 13:09:09 +02:00
Mark Spanbroek 1b151d589d Add polling interval to constructor of provider 2023-07-03 13:09:09 +02:00
Mark Spanbroek 0322ae1451 Ignore errors while polling 2023-07-03 13:09:09 +02:00
Mark Spanbroek 50cfd9d9dd `untilCancelled` template 2023-07-03 13:09:09 +02:00
Mark Spanbroek 3a76fa74f1 Make polling interval configurable 2023-07-03 13:09:09 +02:00
Mark Spanbroek 6a034870f8 Polling block subscriptions for non-websocket connections 2023-07-03 13:09:09 +02:00
Mark Spanbroek 127c9c9b0d Formatting 2023-07-03 13:09:09 +02:00
Mark Spanbroek 16fa0cfcf8 Use new subscription handling in JSON RPC provider 2023-07-03 13:09:09 +02:00
Mark Spanbroek a7dc0ac9eb Move subscription handling to its own module 2023-07-03 13:09:09 +02:00
Mark Spanbroek 0b951ce146 Set correct content-type for JSON-RPC 2023-07-03 11:29:31 +02:00
Eric Mastro 34b7a82565 fix: pending blocks may not contains block hash
Pending blocks may not contain a block hash and therefore Block.hash should be optional.
2023-07-03 11:29:09 +02:00
Adam Uhlíř 0321e6d7bd
fix: dont export json conversions of jsonrpc (#44) 2023-06-19 14:13:44 +02:00
Adam Uhlíř 18e225607c
fix: eth_call use signers address (#43) 2023-06-13 16:24:59 +02:00
Mark Spanbroek 1ca90d0b3c Allow contract calls to override the block tag 2023-04-19 10:03:50 +02:00
Adam Uhlíř 3c12a65769
feat: erc20 module (#38)
Co-authored-by: Eric Mastro <github@egonat.me>
2023-03-29 13:41:44 +02:00
Ben Bierens 577e02b8a2
enables stylecheck (#36)
* enables stylecheck

* applies style check

* Applying style check

* uses alias to fix ambiguity
2023-03-09 10:58:54 +01:00
Mark Spanbroek e8592bb922 Remove unnecessary error check 2022-09-21 10:29:31 +02:00
Mark Spanbroek 7d2acd65e8 Fix imports 2022-09-21 10:29:31 +02:00
Mark Spanbroek a62ea4fb8f Ensure that `reverts` works with functions with a return type 2022-09-21 10:29:31 +02:00
Mark Spanbroek c5a40e5f9d Remove dependency on json-rpc provider for `reverts` 2022-09-21 10:29:31 +02:00
Mark Spanbroek f545169331 Remove JSON wrapper from error in JSON RPC provider 2022-09-21 10:29:31 +02:00
Mark Spanbroek cac6026b34 Change `reverts` API
- Enables postfix syntax: `call().reverts(reason)`
- Removes doesNotRevert etc; uses `check not` instead
- Removes waitFor(); return Future instead
2022-09-21 10:29:31 +02:00
Mark Spanbroek d001ee8e01 Use `solidityType()` to check indexed event parameter 2022-09-21 10:27:45 +10:00
Eric Mastro 31ffc8992f Update compile time check to use when 2022-09-21 10:27:45 +10:00
Eric Mastro ae2d33aacd Support 1.2.16 distinctBase compilation error 2022-09-21 10:27:45 +10:00
Eric Mastro 0adf56c65b Support distinct types for Event fields
Add support for indexed (and non-indexed) Event fields types that are distinct `ValueType` or `SmallByteArray`. For example,
```nim
type
  DistinctAlias = distinct array[32, byte]
  MyEvent = object of Event
    a {.indexed.}: DistinctAlias
    b: DistinctAlias # also allowed for non-indexed fields

## The below funcs generally need to be included for ABI
## encoding/decoding purposes when implementing distinct types.

func toArray(value: DistinctAlias): array[32, byte] =
  array[32, byte](value)

func encode*(encoder: var AbiEncoder, value: DistinctAlias) =
  encoder.write(value.toArray)

func decode*(decoder: var AbiDecoder,
             T: type DistinctAlias): ?!T =
  let d = ?decoder.read(type array[32, byte])
  success DistinctAlias(d)
```
2022-09-21 10:27:45 +10:00
Eric Mastro 5fe41a76ab PR comments
1. rename helpers to testing and expose externally via `import pkg/ethers/testing`
2. Change detection of revert from `EthersError` to `JsonRpcProviderError`
3, Remove catch of `CatchableError` from revert detection as this would swallow errors. Update tests accordingly.
2022-09-20 13:15:15 +10:00
Eric Mastro f8ba91a297 Catch ValueError from nim-json-rpc 2022-09-20 13:15:15 +10:00
Mark Spanbroek c72cdc5573 [wallet] cleanup 2022-08-08 15:07:41 +02:00
Mark Spanbroek a2d688e34e [wallet] Avoid Option.get() which can raise UnpackDefect 2022-08-08 15:07:41 +02:00
Mark Spanbroek 1a8ca0bcad [wallet] Use questionable to deal with optionals 2022-08-08 15:07:41 +02:00
Mark Spanbroek 0483e1676a [provider] Rename sendRawTransaction -> sendTransaction
To be consistent with ethers.js
2022-08-08 15:07:41 +02:00
Jackie 1af3ab1a0a Make wallet use Provider not JsonRpcProvider 2022-08-08 12:40:36 +02:00
Jackie b72fbb0ed9 small fixes 2022-08-08 12:40:36 +02:00
Jackie 39005a09be Add TODOs 2022-08-08 12:40:36 +02:00
Jackie 456d454f2f Fix bug in wallet 2022-08-08 12:40:36 +02:00
Jackie ac7785dd04 Add new method to wallet 2022-08-08 12:40:36 +02:00
Jackie 4c047fd997 Changes to TransactionOverrides to support EIP1559 2022-08-08 12:40:36 +02:00
Jackie 2c9eb595d2 Add sendRawTransaction 2022-08-08 12:40:36 +02:00
Jackie 671d42889a Add Wallet functionality 2022-08-08 12:40:36 +02:00
Jackie abda8493b0 Change Transaction type to support EIP1559 2022-08-08 12:40:36 +02:00
Mark Spanbroek 16a3d25419 Remove duplication 2022-08-08 12:26:09 +02:00
Jackie 52f57894f5 Fix block subscription 2022-08-08 12:26:09 +02:00
Mark Spanbroek 083af80dcc Introduce separate type for transaction overrides 2022-07-13 09:04:48 +02:00
Mark Spanbroek a7d1944406 Allow for custom transaction properties 2022-07-13 09:04:48 +02:00
Mark Spanbroek 95c5282b8a Raise EthersError when JSON-RPC fails 2022-06-30 10:52:12 +02:00
Mark Spanbroek 9ef6c08072 Handle multiple return types on a contract call 2022-06-14 16:27:43 +02:00
Mark Spanbroek e61c70f5ba Fix: handle dynamically sized return values
Dynamically sized return values such as strings and
sequences were not decoded as part of a tuple, leading
to a difference in byte representation.
2022-06-08 11:23:01 +02:00
Mark Spanbroek 801bf19157 Remove calls to Option.get 2022-05-25 09:28:15 +02:00
Mark Spanbroek 33df1e759d Move `confirm` from `jsonrpc` to `provider` 2022-05-25 09:28:15 +02:00
Mark Spanbroek 2653610b6b Raise EthersError instead of JsonRpcProviderError 2022-05-25 09:28:15 +02:00
Mark Spanbroek 346053e3f2 Turn `confirm` into proc instead of method 2022-05-25 09:28:15 +02:00
Mark Spanbroek fff0d189a5 Ensure that `confirm` future is only finished once
Should fix CI failure
https://github.com/status-im/nim-ethers/runs/6557104597
2022-05-25 09:13:44 +02:00
Mark Spanbroek 649dc8efd0 Allow types that are equivalent to Confirmable
Allows ?TransactionResponse, Option[TransactionResponse] etc
to be used instead of Confirmable.
2022-05-25 09:13:44 +02:00
Eric Mastro c5c9534876 Refactor based on PR comments
- `TransactionReceipt.blockHash` is optional
- Block.number is optional (in case node doesn’t return this in the event)
- Refactor confirmations waiting such that there is no polling for a receipt at the start
- Make BlockHandler and SubscriptionHandler async
- change casing of constants
- change return type checking of contract method to check for `Confirmable` instead of `?TransactionRepsonse`
- Reduce miner sleep to 10ms
- Change `wait` and `Waitable` to `confirm` and `Confirmable` to avoid conflict with chrono’s `.wait`.
- Update params on `.confirm` so that the compiler can restrict values of the `int` to `Positive` and `Natural`.
- Add `Block` and `TransactionReceipt` conversion tests to test for missing block number and block hash.
- Add tests for confirmation calculations and determining if a tx has been mined from its receipt.
- Assume that blockNumber returned from node will be null or empty string, in which case we can parse as 0 and test for that condition.
2022-05-23 11:27:26 +10:00
Eric Mastro a3e888128c feat: Allow contract transactions to be waited on
Allow waiting for a specified number of confirmations for contract transactions.

This change only requires an optional TransactionResponse return type to be added to the contract function. This allows the transaction hash to be passed to `.wait`.

For example, previously the `mint` method looked like this without a return value:
```
method mint(token: TestToken, holder: Address, amount: UInt256) {.base, contract.}
```
it still works without a return value, but if we want to wait for a 3 confirmations, we can now define it like this:
```
method mint(token: TestToken, holder: Address, amount: UInt256): ?TransactionResponse {.base, contract.}
```
and use like this:
```
let receipt = await token.connect(signer0)
                    .mint(accounts[1], 100.u256)
                    .wait(3) # wait for 3 confirmations
```
2022-05-23 11:27:26 +10:00
Eric Mastro 2f97a03fe2 feat: Can wait for transaction confirmations
Allows specified number of transaction confirmations to be awaited before a transaction is considered finalised. Polls for a transaction receipt then listens for new blocks and calculates the number of blocks between the receipt and the new block.

Notes
1. Only works with websockets currently
2. Replaced transaction not supported yet
2022-05-23 11:27:26 +10:00
Mark Spanbroek fc0d5c4121 Release memory when unsubscribe fails
Ensures that even when a call to the ethereum node to
unsubscribe fails, it will release the memory associated
with the subscription, including the subscription handler
closure.
2022-05-17 19:28:37 +02:00
Mark Spanbroek bbf133725f Subscribe to new blocks 2022-05-17 09:08:02 +02:00
Mark Spanbroek 82043c2fcc Generalize JSON-RPC subscription table
Allows for other types of subscriptions, not just logs.
2022-05-17 09:08:02 +02:00
Mark Spanbroek 60f8749ca3 Fix crash when connection fails
Removes asyncSpawn call to handleSubscriptions(), to ensure
that when the RpcClient can't connect, we don't crash.
2022-04-19 17:57:16 +02:00
Mark Spanbroek e3d5ce5122 Fix decoding of events with dynamic arguments
Such as byte sequences or strings.
2022-04-13 10:10:53 +02:00
Michael Bradley, Jr 073924d3f5 supply block parameter to eth_call, default being BlockTag.latest 2022-04-11 09:56:49 +02:00
Mark Spanbroek c49a9cbae9 Decode indexed event parameters bytes1 up to bytes32 2022-03-29 10:48:00 +02:00
Mark Spanbroek f3cf1c722e Export JSON conversions
Invoking JsonRpcProvider.send() requires
conversion of arguments to JSON and conversion
of result from JSON.
2022-03-17 10:30:42 +01:00
Mark Spanbroek c53d2235e6 Fix method signature 2022-03-17 10:30:42 +01:00
Mark Spanbroek ce435f8791 Add Provider.getBlock()
Only returns hash, number and timestamp for now.
2022-03-16 14:20:00 +01:00
Mark Spanbroek 72ccb57b98 Fix for Nim 1.2.x 2022-02-09 14:50:51 +01:00
Mark Spanbroek 08becf42bf Fix for Nim 1.4.x 2022-02-09 14:50:51 +01:00
Mark Spanbroek 3e507af8cc Move JSON RPC related modules into providers/jsonrpc 2022-02-09 14:50:51 +01:00
Mark Spanbroek ff5a35aac0 Define and subscribe to solidity events 2022-02-09 14:50:51 +01:00
Mark Spanbroek 21f98c4086 Event decoding from data and topics 2022-02-09 14:50:51 +01:00
Mark Spanbroek 3505149381 Remove {.constant.} pragma
Has not been allowed in Solidity since 0.5.0.
2022-01-26 17:58:51 +01:00
Mark Spanbroek 9eee20e49d Add Contract.connect() 2022-01-26 12:23:30 +01:00
Mark Spanbroek 1e767b2107 Add Signer.signMessage() 2022-01-26 11:21:28 +01:00
Mark Spanbroek fec6bdc581 Cleanup 2022-01-26 10:31:54 +01:00
Mark Spanbroek e4224a1241 Allow calls to non-constant functions 2022-01-25 17:29:01 +01:00
Mark Spanbroek 82116d3b14 Add eth_sendTransaction() 2022-01-25 15:08:35 +01:00
Mark Spanbroek b639e367c0 Reset EVM in between tests 2022-01-25 15:08:35 +01:00
Mark Spanbroek 6bd3e27e38 Add Signer.populateTransaction() 2022-01-25 10:25:09 +01:00
Mark Spanbroek 4acc6ef45c Add Signer.getChainId() 2022-01-24 17:29:25 +01:00
Mark Spanbroek 7e32f5ee51 Add Signer.estimateGas() 2022-01-24 14:40:47 +01:00
Mark Spanbroek 30bea4759c Adds Signer.getTransactionCount() 2022-01-24 12:14:31 +01:00
Mark Spanbroek 54c66db827 Adds Signer.getGasPrice() 2022-01-24 12:12:52 +01:00
Mark Spanbroek 94dcc171af Introduces JsonRpcSigner 2022-01-20 14:39:37 +01:00
Mark Spanbroek 2140084d97 Allow contract procs to be exported 2022-01-20 14:00:28 +01:00
Mark Spanbroek 04ff046553 Introduce Contract abstraction 2022-01-20 12:56:18 +01:00
Mark Spanbroek b965599a47 Use Address implementation from contractabi 2022-01-20 12:55:14 +01:00
Mark Spanbroek 177ed78d65 Ensure that no unexpected exceptions are raised 2022-01-18 14:51:53 +01:00
Mark Spanbroek 7bc102a421 Provider.getBlockNumber() 2022-01-18 14:26:41 +01:00
Mark Spanbroek bd20199f87 Send raw messages to the provider 2022-01-18 14:24:46 +01:00
Mark Spanbroek 8dd84b0622 Use Address type in RPC call signature 2022-01-18 12:42:58 +01:00
Mark Spanbroek 05366c4a49 Introduce JsonRpcProvider 2022-01-18 12:10:20 +01:00
Mark Spanbroek fe688bde79 Introduce Address type 2022-01-18 12:09:20 +01:00