status-go/services/wallet/README.md

224 lines
5.7 KiB
Markdown
Raw Normal View History

2021-04-01 09:04:47 +00:00
# Wallet service API
2021-04-01 09:04:47 +00:00
Wallet service provides RPC API for checking transfers history and other methods related to wallet functionality. To enable service two values need to be changed in the config:
1. Set Enable to true in WalletConfig
```json
{
"WalletConfig": {
"Enabled": true,
}
}
```
2. And expose wallet API with APIModules
```
{
APIModules: "eth,net,web3,peer,wallet",
}
```
2021-04-01 09:04:47 +00:00
## API
2021-04-01 09:04:47 +00:00
### wallet_getTransfersByAddress
Returns avaiable transfers in a given range.
2021-04-01 09:04:47 +00:00
#### Parameters
- `address`: `HEX` - ethereum address encoded in hex
- `toBlock`: `BIGINT` - end of the range. if nil query will return last transfers.
- `limit`: `BIGINT` - limit of returned transfers.
2021-04-01 09:04:47 +00:00
- `fetchMore`: `BOOLEAN` - if `true`, there are less than `limit` fetched transfers in the database, and zero block is not reached yet, history will be scanned for more transfers. If `false` only transfers which are already fetched to the app's database will be returned.
2021-04-01 09:04:47 +00:00
#### Examples
```json
2021-04-01 09:04:47 +00:00
{
"jsonrpc":"2.0",
"id":7,
"method":"wallet_getTransfersByAddress",
"params":[
"0xb81a6845649fa8c042dfaceb3f7a684873406993",
"0x0",
"0x5",
true
]
}
```
#### Returns
```json
[
{
"id":"0xb1a8adeaa0e6727bf01d6d8431b6238bdefa915e19ae7e8ceb16886c9f5e",
"type":"eth",
"address":"0xd65f3cb52605a54a833ae118fb13",
"blockNumber":"0xb7190",
"blockhash":"0x8d98aa2297fe322d0093b24372e2ead98414959093b479baf670",
"timestamp":"0x6048ec6",
"gasPrice":"0x346308a00",
"gasLimit":"0x508",
"gasUsed":"0x520",
"nonce":"0x13",
"txStatus":"0x1",
"input":"0x",
"txHash":"0x1adeaa0e672d7e67bf01d8431b6238bdef15e19ae7e8ceb16886c",
"value":"0x1",
"from":"0x2f865fb5dfdf0dfdf54a833ae118fb1363aaasd",
"to":"0xaaaaaaf3cb52605a54a833ae118fb1363a123123",
"contract":"0x0000000000000000000000000000000000000000",
"NetworkID":1
},...
]
```
### wallet_setInitialBlocksRange
Sets `zero block - latest block` range as scanned for an account. It is used when a new multiaccount is generated to avoid scanning transfers history.
#### Example
```json
{"jsonrpc":"2.0","id":7,"method":"wallet_setInitialBlocksRange","params":[]}
```
### wallet_watchTransaction
Starts watching for transaction confirmation/rejection. If transaction was not confirmed/rejected in 10 minutes the call is timed out with error.
#### Parameters
- `tx-id`: `HEX` - transaction hash
#### Example
```json
{
"jsonrpc":"2.0",
"id":7,
"method":"wallet_watchTransaction",
"params":[
"0xaaaaaaaa11111112222233333333"
]
}
```
2021-04-01 09:04:47 +00:00
### wallet_checkRecentHistory
#### Parameters
2021-04-01 09:04:47 +00:00
- `addresses`: `[]HEX` - array of addresses to be checked
2021-04-01 09:04:47 +00:00
#### Example
```json
{
"jsonrpc":"2.0",
"id":1,
"method":"wallet_checkRecentHistory",
"params":[
[
"0x23458d65f3cB52605a54AaA833ae118fb1111aaa",
"0x24568B4166D11aaa1194097C60Cdc714F7e11111"
]
]
}
```
### wallet_getTokensBalances
2019-07-02 07:28:57 +00:00
Returns tokens balances mapping for every account. See section below for the response example.
2021-04-01 09:04:47 +00:00
#### Parameters
2019-07-02 07:28:57 +00:00
- `accounts` `HEX` - list of ethereum addresses encoded in hex
- `tokens` `HEX` - list of ethereum addresses encoded in hex
```json
{"jsonrpc":"2.0","id":11,"method":"wallet_getTokensBalances","params":[["0x066ed5c2ed45d70ad72f40de0b4dd97bd67d84de", "0x0ed535be4c0aa276942a1a782669790547ad8768"], ["0x5e4bbdc178684478a615354d83c748a4393b20f0", "0x5e4bbdc178684478a615354d83c748a4393b20f0"]]}
```
#### Returns
First level keys accounts, second level keys are tokens.
```json
{
"0x066ed5c2ed45d70ad72f40de0b4dd97bd67d84de": {
"0x1dfb2099f936b3e98bfc9b7059a8fb04edcce5b3": 12,
"0x5e4bbdc178684478a615354d83c748a4393b20f0": 12
},
"0x0ed535be4c0aa276942a1a782669790547ad8768": {
"0x1dfb2099f936b3e98bfc9b7059a8fb04edcce5b3": 14,
"0x5e4bbdc178684478a615354d83c748a4393b20f0": 14
}
}
```
2021-04-01 09:04:47 +00:00
## Signals
-------
2021-04-01 09:04:47 +00:00
All events are of the same format:
```json
{
"type": "wallet",
"event": {
2021-04-01 09:04:47 +00:00
"type": "event-type",
"blockNumber": 0,
"accounts": [
"0x42c8f505b4006d417dd4e0ba0e880692986adbd8",
"0x3129mdasmeo132128391fml1130410k312312mll"
2021-04-01 09:04:47 +00:00
],
"message": "something might be here"
}
}
```
2021-04-01 09:04:47 +00:00
1. `new-transfers`
2021-04-01 09:04:47 +00:00
Emitted when transfers are detected. In this case block number is a block number of the latest found transfer.
Client expected to request transfers starting from received block.
2021-04-01 09:04:47 +00:00
2. `recent-history-fetching`
2021-04-01 09:04:47 +00:00
Emitted when history scanning is started.
2021-04-01 09:04:47 +00:00
3. `recent-history-ready`
2021-04-01 09:04:47 +00:00
Emitted when history scanning is ended.
4. `fetching-history-error`
Emitted when when history can't be fetched because some error. Error's decritption can be found in `message` field.
5. `non-archival-node-detected`
Emitted when the application is connected to a non-archival node.
## Flows
### Account creation
When a new multiaccount is created corresponding address will not contain any transaction. Thus no point in checking history, it will be empty.
1. Call `wallet_setInitialRange`
2. Call `wallet_checkRecentHistory`
3. On `recent-history-ready` request transactions via `wallet_getTransfersByAddress`
4. Repeat `wallet_checkRecentHistory` in N minutes (currently 20 minutes in `status-react` for upstream RPC node. If a custom node is used interval can be arbitrary)
### Logging into application
1. Call `wallet_checkRecentHistory`
2. On `recent-history-ready` request transactions via `wallet_getTransfersByAddress`
3. Repeat `wallet_checkRecentHistory` in N minutes (currently 20 minutes in `status-react` for upstream RPC node. If a custom node is used interval can be arbitrary)
### Watching transaction
1. Call `wallet_watchTransaction`
2. On success call `wallet_checkRecentHistory`
3. On `recent-history-ready` request transactions via `wallet_getTransfersByAddress`