Commit Graph

76 Commits

Author SHA1 Message Date
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 a27c2de41c Close provider by unsubscribing and closing client 2023-07-03 13:09:09 +02:00
Mark Spanbroek f8cac08cde Test that subscription stops after call to unsubscribe() 2023-07-03 13:09:09 +02:00
Mark Spanbroek 738d028fe3 Remove websockets url where not needed for tests 2023-07-03 13:09:09 +02:00
Mark Spanbroek 7e346914c0 Test contracts with polling 2023-07-03 13:09:09 +02:00
Mark Spanbroek 76bd3090d1 Fix intermittently failing test
eth_getFilterChanges returns the current block for
new subscriptions, which made the test fail.
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 88d60b14b0 Test JSON-RPC Provider with polling 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 beac903a3f Remove duplication in tests 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 a7dc0ac9eb Move subscription handling to its own module 2023-07-03 13:09:09 +02:00
Mark Spanbroek 67c2d631d7 Update asynctest to 0.4.0 2023-07-03 13:09:09 +02:00
Mark Spanbroek f0ac7065ed Move tests for JSON RPC provider into their own folder 2023-07-03 13:09:09 +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
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
Eric Mastro 4d7e40eb0e remove en/decoding for distinct types
The changes to `nim-contract-abi` in https://github.com/status-im/nim-contract-abi/pull/5 have allowed for distinct type en/decoding procs to not need to be defined.
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 e1a1a3805b remove extra spaces 2022-09-20 13:15:15 +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 e0ac15b3ba add revert helpers for testing
Add the following helpers to help detect transaction reverts:
1. `reverts`
2. `revertsWith`
3. `doesNotRevert`
4. `doesNotRevertWith`
2022-09-20 13:15:15 +10:00
Mark Spanbroek c72cdc5573 [wallet] cleanup 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 cd5165efd0 Fix issues with teardown in wallet tests 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 d6c9151103 Add new test for wallet 2022-08-08 12:40:36 +02:00
Jackie 1d89be9d42 Add first tests for wallet 2022-08-08 12:40:36 +02:00
Mark Spanbroek e9aaea4a5a Fix intermittent test failure
Test would fail with an error when transaction hash
happens to start with 0b; it would then try to to parse
the hash as a binary number.
2022-07-13 09:04:48 +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 94f5f35a10 Drop support for Nim 1.4.x
Only support stable Nim versions 1.2.x and 1.6.x.
2022-06-30 10:52:12 +02:00
Mark Spanbroek 95c5282b8a Raise EthersError when JSON-RPC fails 2022-06-30 10:52:12 +02:00
Mark Spanbroek 00b511cc9b Allow enums to be used as function parameters 2022-06-15 10:52:35 +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 2653610b6b Raise EthersError instead of JsonRpcProviderError 2022-05-25 09:28:15 +02:00
Eric Mastro e6c9b59cfb chore: add tests for all contract method return types
Add tests for non-constant contract method return types:
1. `void`
2. `?TransactionResponse` or `Option[TransactionRepsonse]`
3. `Confirmable`
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