mirror of
https://github.com/cerc-io/watcher-ts
synced 2025-01-22 02:59:06 +00:00
Add a demo for erc20-watcher (#268)
* Fix event subscription in erc20-watcher * Add demo for erc20-watcher * Update README
This commit is contained in:
parent
c299737aab
commit
847837c2fb
87
README.md
87
README.md
@ -45,10 +45,6 @@ yarn build
|
|||||||
|
|
||||||
* [graph-node](./packages/graph-node/README.md)
|
* [graph-node](./packages/graph-node/README.md)
|
||||||
|
|
||||||
## Demos
|
|
||||||
|
|
||||||
* [IPLD statediff and checkpointing](./ipld-demo.md)
|
|
||||||
|
|
||||||
## Services
|
## Services
|
||||||
|
|
||||||
The default config files used by the watchers assume the following services are setup and running on localhost:
|
The default config files used by the watchers assume the following services are setup and running on localhost:
|
||||||
@ -65,82 +61,7 @@ The default config files used by the watchers assume the following services are
|
|||||||
## Watchers
|
## Watchers
|
||||||
|
|
||||||
* [eden-watcher](./packages/eden-watcher/README.md)
|
* [eden-watcher](./packages/eden-watcher/README.md)
|
||||||
|
* [erc20-watcher](./packages/erc20-watcher/README.md)
|
||||||
## Databases
|
* [erc721-watcher](./packages/erc721-watcher/README.md)
|
||||||
|
* [graph-test-watcher](./packages/graph-test-watcher/README.md)
|
||||||
Note: Requires `postgres12`.
|
* [mobymask-watcher](./packages/mobymask-watcher/README.md)
|
||||||
|
|
||||||
Login as the postgres user:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo su - postgres
|
|
||||||
```
|
|
||||||
|
|
||||||
Create the databases for the watchers:
|
|
||||||
|
|
||||||
```
|
|
||||||
createdb erc20-watcher
|
|
||||||
createdb address-watcher
|
|
||||||
```
|
|
||||||
|
|
||||||
Create the databases for the job queues and enable the `pgcrypto` extension on them (https://github.com/timgit/pg-boss/blob/master/docs/usage.md#intro):
|
|
||||||
|
|
||||||
```
|
|
||||||
createdb erc20-watcher-job-queue
|
|
||||||
createdb address-watcher-job-queue
|
|
||||||
```
|
|
||||||
|
|
||||||
```
|
|
||||||
postgres@tesla:~$ psql -U postgres -h localhost erc20-watcher-job-queue
|
|
||||||
Password for user postgres:
|
|
||||||
psql (12.7 (Ubuntu 12.7-1.pgdg18.04+1))
|
|
||||||
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
|
|
||||||
Type "help" for help.
|
|
||||||
|
|
||||||
erc20-watcher-job-queue=# CREATE EXTENSION pgcrypto;
|
|
||||||
CREATE EXTENSION
|
|
||||||
erc20-watcher-job-queue=# exit
|
|
||||||
```
|
|
||||||
|
|
||||||
```
|
|
||||||
postgres@tesla:~$ psql -U postgres -h localhost address-watcher-job-queue
|
|
||||||
Password for user postgres:
|
|
||||||
psql (12.7 (Ubuntu 12.7-1.pgdg18.04+1))
|
|
||||||
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
|
|
||||||
Type "help" for help.
|
|
||||||
|
|
||||||
address-watcher-job-queue=# CREATE EXTENSION pgcrypto;
|
|
||||||
CREATE EXTENSION
|
|
||||||
address-watcher-job-queue=# exit
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Reset
|
|
||||||
|
|
||||||
Reset the databases used by the watchers:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yarn db:reset
|
|
||||||
```
|
|
||||||
|
|
||||||
## Run
|
|
||||||
|
|
||||||
Build the files in packages:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yarn build
|
|
||||||
|
|
||||||
# To watch for changes and build (used in development).
|
|
||||||
yarn build:watch
|
|
||||||
```
|
|
||||||
|
|
||||||
To run any watcher, `cd` into their package folder and run:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yarn server
|
|
||||||
```
|
|
||||||
|
|
||||||
If the watcher uses a job queue, start the job runner in another terminal:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yarn job-runner
|
|
||||||
```
|
|
||||||
|
@ -62,6 +62,8 @@ Ensure that watcher is of active kind. Update the kind in `server` config to act
|
|||||||
|
|
||||||
## Run
|
## Run
|
||||||
|
|
||||||
|
Follow the steps below or follow the [Demo](./demo.md)
|
||||||
|
|
||||||
Build files:
|
Build files:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@ -104,16 +106,16 @@ $ yarn token:deploy
|
|||||||
Start watching a token:
|
Start watching a token:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ yarn watch:contract --address 0xTokenAddress --startingBlock <start-block>
|
$ yarn watch:contract --address 0xTokenAddress --startingBlock <start-block> --kind ERC20 --checkpoint false
|
||||||
|
|
||||||
# For specifying config file.
|
# For specifying config file.
|
||||||
$ yarn watch:contract -f environments/local.toml --address 0xTokenAddress --startingBlock <start-block>
|
$ yarn watch:contract -f environments/local.toml --address 0xTokenAddress --startingBlock <start-block> --kind ERC20 --checkpoint false
|
||||||
```
|
```
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ yarn watch:contract --address 0xfE0034a874c2707c23F91D7409E9036F5e08ac34 --startingBlock 100
|
$ yarn watch:contract --address 0xfE0034a874c2707c23F91D7409E9036F5e08ac34 --startingBlock 100 --kind ERC20 --checkpoint false
|
||||||
```
|
```
|
||||||
|
|
||||||
To fill a block range:
|
To fill a block range:
|
||||||
@ -189,5 +191,4 @@ $ yarn fill --startBlock 1000 --endBlock 2000
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
200
packages/erc20-watcher/demo.md
Normal file
200
packages/erc20-watcher/demo.md
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
# Demo
|
||||||
|
|
||||||
|
* The following core services need to be running for the demo:
|
||||||
|
* [ipld-eth-db](https://github.com/cerc-io/ipld-eth-db)
|
||||||
|
* Version: [v4.2.3-alpha](https://github.com/cerc-io/ipld-eth-db/releases/tag/v4.2.3-alpha)
|
||||||
|
* [geth](https://github.com/cerc-io/go-ethereum)
|
||||||
|
* State diffing service should use `ipld-eth-db` for database.
|
||||||
|
* Version: [v1.10.26-statediff-4.2.2-alpha](https://github.com/cerc-io/go-ethereum/releases/tag/v1.10.26-statediff-4.2.2-alpha)
|
||||||
|
* Endpoint: http://127.0.0.1:8545
|
||||||
|
* [ipld-eth-server](https://github.com/cerc-io/ipld-eth-server)
|
||||||
|
* Should use `ipld-eth-db` for database.
|
||||||
|
* Version: [v4.2.3-alpha](https://github.com/cerc-io/ipld-eth-server/releases/tag/v4.2.3-alpha)
|
||||||
|
* Endpoints:
|
||||||
|
* GQL: http://127.0.0.1:8082/graphql
|
||||||
|
* RPC: http://127.0.0.1:8081
|
||||||
|
|
||||||
|
* Create a postgres12 database for the watcher:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo su - postgres
|
||||||
|
|
||||||
|
# If database already exists
|
||||||
|
# dropdb erc20-watcher
|
||||||
|
|
||||||
|
createdb erc20-watcher
|
||||||
|
```
|
||||||
|
|
||||||
|
* Create database for the job queue and enable the `pgcrypto` extension on them (https://github.com/timgit/pg-boss/blob/master/docs/usage.md#intro):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# If database already exists
|
||||||
|
# dropdb erc20-watcher-job-queue
|
||||||
|
|
||||||
|
createdb erc20-watcher-job-queue
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
postgres@tesla:~$ psql -U postgres -h localhost erc20-watcher-job-queue
|
||||||
|
Password for user postgres:
|
||||||
|
psql (12.7 (Ubuntu 12.7-1.pgdg18.04+1))
|
||||||
|
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
|
||||||
|
Type "help" for help.
|
||||||
|
|
||||||
|
erc20-watcher-job-queue=# CREATE EXTENSION pgcrypto;
|
||||||
|
CREATE EXTENSION
|
||||||
|
erc20-watcher-job-queue=# exit
|
||||||
|
```
|
||||||
|
|
||||||
|
* In the [config file](./environments/local.toml) update the `database` connection settings.
|
||||||
|
|
||||||
|
* In `watcher-ts` repo, follow the instructions in [Setup](../../README.md#setup) for installing and building packages.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# After setup
|
||||||
|
yarn && yarn build
|
||||||
|
```
|
||||||
|
|
||||||
|
* Run the job-runner:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn job-runner
|
||||||
|
```
|
||||||
|
|
||||||
|
* Run the watcher:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn server
|
||||||
|
```
|
||||||
|
|
||||||
|
* Deploy an ERC20 token:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn token:deploy
|
||||||
|
# GLD Token deployed to: TOKEN_ADDRESS
|
||||||
|
```
|
||||||
|
|
||||||
|
Export the address of the deployed token to a shell variable for later use:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export TOKEN_ADDRESS="<TOKEN_ADDRESS>"
|
||||||
|
```
|
||||||
|
|
||||||
|
* Run the following command to watch the contract:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn watch:contract --address $TOKEN_ADDRESS --kind ERC20 --checkpoint false
|
||||||
|
```
|
||||||
|
|
||||||
|
* Add a second account to Metamask and export the account address to a shell variable for later use:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export RECIPIENT_ADDRESS="<RECIPIENT_ADDRESS>"
|
||||||
|
```
|
||||||
|
|
||||||
|
* To get the current block hash at any time, run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn block:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
* Run the following GQL query against the [GraphQL endpoint](http://127.0.0.1:3001/graphql) to get name, symbol and total supply of the deployed token:
|
||||||
|
|
||||||
|
```graphql
|
||||||
|
query {
|
||||||
|
name(
|
||||||
|
blockHash: "LATEST_BLOCK_HASH"
|
||||||
|
token: "TOKEN_ADDRESS"
|
||||||
|
) {
|
||||||
|
value
|
||||||
|
proof {
|
||||||
|
data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
symbol(
|
||||||
|
blockHash: "LATEST_BLOCK_HASH"
|
||||||
|
token: "TOKEN_ADDRESS"
|
||||||
|
) {
|
||||||
|
value
|
||||||
|
proof {
|
||||||
|
data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
totalSupply(
|
||||||
|
blockHash: "LATEST_BLOCK_HASH"
|
||||||
|
token: "TOKEN_ADDRESS"
|
||||||
|
) {
|
||||||
|
value
|
||||||
|
proof {
|
||||||
|
data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
* Run the following GQL query against the [GraphQL endpoint](http://127.0.0.1:3001/graphql) to get balances for the main and the recipient account at the latest block hash:
|
||||||
|
|
||||||
|
```graphql
|
||||||
|
query {
|
||||||
|
fromBalanceOf: balanceOf(
|
||||||
|
blockHash: "LATEST_BLOCK_HASH"
|
||||||
|
token: "TOKEN_ADDRESS",
|
||||||
|
# main account having all the balance initially
|
||||||
|
owner: "0xDC7d7A8920C8Eecc098da5B7522a5F31509b5Bfc"
|
||||||
|
) {
|
||||||
|
value
|
||||||
|
proof {
|
||||||
|
data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toBalanceOf: balanceOf(
|
||||||
|
blockHash: "LATEST_BLOCK_HASH"
|
||||||
|
token: "TOKEN_ADDRESS",
|
||||||
|
owner: "RECIPIENT_ADDRESS"
|
||||||
|
) {
|
||||||
|
value
|
||||||
|
proof {
|
||||||
|
data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
* Run the following GQL subscription at the GraphQL endpoint:
|
||||||
|
|
||||||
|
```graphql
|
||||||
|
subscription {
|
||||||
|
onEvent {
|
||||||
|
blockHash
|
||||||
|
contract
|
||||||
|
event {
|
||||||
|
__typename
|
||||||
|
... on TransferEvent {
|
||||||
|
from
|
||||||
|
to
|
||||||
|
value
|
||||||
|
},
|
||||||
|
... on ApprovalEvent {
|
||||||
|
owner
|
||||||
|
spender
|
||||||
|
value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
proof {
|
||||||
|
data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
* Transfer tokens to the recipient account:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn token:transfer --token $TOKEN_ADDRESS --to $RECIPIENT_ADDRESS --amount 100
|
||||||
|
```
|
||||||
|
|
||||||
|
* A Transfer event to RECIPIENT_ADDRESS shall be visible in the subscription at endpoint.
|
||||||
|
|
||||||
|
* Fire the GQL query above to get updated balances for the main (from) and the recipient (to) account.
|
@ -47,6 +47,8 @@ const TRANSFER_EVENT = 'Transfer';
|
|||||||
const APPROVAL_EVENT = 'Approval';
|
const APPROVAL_EVENT = 'Approval';
|
||||||
|
|
||||||
interface EventResult {
|
interface EventResult {
|
||||||
|
blockHash: string;
|
||||||
|
contract: string;
|
||||||
event: {
|
event: {
|
||||||
from?: string;
|
from?: string;
|
||||||
to?: string;
|
to?: string;
|
||||||
@ -105,9 +107,12 @@ export class Indexer implements IndexerInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getResultEvent (event: Event): EventResult {
|
getResultEvent (event: Event): EventResult {
|
||||||
|
const block = event.block;
|
||||||
const eventFields = JSON.parse(event.eventInfo);
|
const eventFields = JSON.parse(event.eventInfo);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
blockHash: block.blockHash,
|
||||||
|
contract: event.contract,
|
||||||
event: {
|
event: {
|
||||||
__typename: `${event.eventName}Event`,
|
__typename: `${event.eventName}Event`,
|
||||||
...eventFields
|
...eventFields
|
||||||
|
@ -28,7 +28,7 @@ export const createResolvers = async (indexerArg: IndexerInterface, eventWatcher
|
|||||||
},
|
},
|
||||||
|
|
||||||
Subscription: {
|
Subscription: {
|
||||||
onTokenEvent: {
|
onEvent: {
|
||||||
subscribe: () => eventWatcher.getEventIterator()
|
subscribe: () => eventWatcher.getEventIterator()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -58,20 +58,14 @@ union TokenEvent = TransferEvent | ApprovalEvent
|
|||||||
|
|
||||||
# Result type, with proof, for event return values.
|
# Result type, with proof, for event return values.
|
||||||
type ResultEvent {
|
type ResultEvent {
|
||||||
event: TokenEvent!
|
blockHash: String!
|
||||||
|
contract: String!
|
||||||
|
|
||||||
|
event: TokenEvent!
|
||||||
# Proof from receipts trie.
|
# Proof from receipts trie.
|
||||||
proof: Proof
|
proof: Proof
|
||||||
}
|
}
|
||||||
|
|
||||||
# Watched event, include additional context over and above the event data.
|
|
||||||
type WatchedEvent {
|
|
||||||
blockHash: String!
|
|
||||||
token: String!
|
|
||||||
|
|
||||||
event: ResultEvent!
|
|
||||||
}
|
|
||||||
|
|
||||||
type SyncStatus {
|
type SyncStatus {
|
||||||
latestIndexedBlockHash: String!
|
latestIndexedBlockHash: String!
|
||||||
latestIndexedBlockNumber: Int!
|
latestIndexedBlockNumber: Int!
|
||||||
@ -156,7 +150,7 @@ type Query {
|
|||||||
type Subscription {
|
type Subscription {
|
||||||
|
|
||||||
# Watch for token events (at head of chain).
|
# Watch for token events (at head of chain).
|
||||||
onTokenEvent: WatchedEvent!
|
onEvent: ResultEvent!
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
|
Loading…
Reference in New Issue
Block a user