watcher-ts/packages/mobymask-watcher
2023-02-01 19:07:45 +05:30
..
environments Add a flag to enable state creation (#222) 2022-11-10 16:56:06 +05:30
src Gracefully shutdown server (#265) 2022-11-28 12:01:28 +05:30
.eslintignore Rename to mobymask-watcher (#139) 2022-07-07 11:50:32 +05:30
.eslintrc.json Rename to mobymask-watcher (#139) 2022-07-07 11:50:32 +05:30
indexing.md Add doc to index blocks out of order using eth-statediff-service (#146) 2022-07-20 12:55:24 +05:30
package.json Upgrade version to 0.2.25 (#311) 2023-02-01 19:07:45 +05:30
README.md fixup main README, link to an SO stack where applicable 2023-01-16 07:40:40 -05:00
tsconfig.json Add a table for entites in frothy region for subgraph watchers (#231) 2022-11-16 17:12:54 +05:30

MobyMask Watcher

First try the mobymask demo in stack orchestrator to quickly get started. Advanced users can see here for instructions on setting up a local environment by hand.

Setup

Run the following command to install required packages:

yarn && yarn build

If the watcher is "lazy", run the server:

yarn server

GQL console: http://localhost:3010/graphql

If the watcher is "active", run the job-runner:

yarn job-runner

then the server:

yarn server

Next, clone the MobyMask repo and checkout this branch:

git clone https://github.com/cerc-io/MobyMask && cd MobyMask
git checkout use-laconic-watcher-as-hosted-index

Install the packages:

yarn

Deploy the contract:

cd packages/hardhat

yarn deploy
# deploying "PhisherRegistry" (tx: 0xaebeb2e883ece1f679304ec46f5dc61ca74f9e168427268a7dfa8802195b8de0)...: deployed at 0xMobyAddress with 2306221 gas
# $ hardhat run scripts/publish.js
# ✅  Published contracts to the subgraph package.
# Done in 14.28s.

Export the address of the deployed contract to a shell variable for later use:

export MOBY_ADDRESS="0xMobyAddress"

Run the following GQL mutation in watcher GraphQL endpoint http://127.0.0.1:3010/graphql

mutation {
  watchContract(
    address: "MOBY_ADDRESS"
    kind: "PhisherRegistry"
    checkpoint: true
  )
}

Get the latest block

query {
  latestBlock {
    hash
    number
  }
}

Run the following GQL query in GraphQL endpoint

query {
  isPhisher(
    blockHash: "LATEST_BLOCK_HASH"
    contractAddress: "MOBY_ADDRESS"
    key0: "TWT:phishername"
  ) {
    value
    proof {
      data
    }
  }
  isMember(
    blockHash: "LATEST_BLOCK_HASH"
    contractAddress: "MOBY_ADDRESS"
    key0: "TWT:membername"
  ) {
    value
    proof {
      data
    }
  }
}

Run the following GQL subscription in generated watcher GraphQL endpoint:

subscription {
  onEvent {
    event {
      __typename
      ... on PhisherStatusUpdatedEvent {
        entity
        isPhisher
      },
      ... on MemberStatusUpdatedEvent {
        entity
        isMember
      }
    },
    block {
      number
      hash
    }
  }
}

Update isPhiser and isMember lists with names

yarn claimPhisher --contract $MOBY_ADDRESS --name phisherName 
yarn claimMember --contract $MOBY_ADDRESS --name memberName
  • The events should be visible in the subscription at GQL endpoint. Note down the event blockHash from result.

  • The isMember and isPhisher lists should be indexed. Check the database (mobymask-watcher) tables is_phisher and is_member, there should be entries at the event blockHash and the value should be true. The data is indexed in handleEvent method in the hooks file.

Update the the previous query with event blockHash and check isPhisher and isMember in GraphQL playground

query {
  isPhisher(
    blockHash: "EVENT_BLOCK_HASH"
    contractAddress: "MOBY_ADDRESS",
    key0: "TWT:phishername"
  ) {
    value
    proof {
      data
    }
  }
  
  isMember(
    blockHash: "EVENT_BLOCK_HASH"
    contractAddress: "MOBY_ADDRESS",
    key0: "TWT:membername"
  ) {
    value
    proof {
      data
    }
  }
}

The data is fetched from watcher database as it is already indexed.

Additional Commands

To watch a contract, run:

yarn watch:contract --address <contract-address> --kind <contract-kind> --checkpoint <true | false> --starting-block [block-number]

where:

  • address: Address or identifier of the contract to be watched.
  • kind: Kind of the contract.
  • checkpoint: Turn checkpointing on (true | false).
  • starting-block: Starting block for the contract (default: 1).

Examples:

Watch a contract with its address and checkpointing on:

yarn watch:contract --address 0x1F78641644feB8b64642e833cE4AFE93DD6e7833 --kind ERC20 --checkpoint true

Watch a contract with its identifier and checkpointing on:

yarn watch:contract --address MyProtocol --kind protocol --checkpoint true

To fill a block range:

yarn fill --start-block <from-block> --end-block <to-block>
  • start-block: Block number to start filling from.
  • end-block: Block number till which to fill.

To create a checkpoint for a contract:

yarn checkpoint create --address <contract-address> --block-hash [block-hash]
  • address: Address or identifier of the contract for which to create a checkpoint.
  • block-hash: Hash of a block (in the pruned region) at which to create the checkpoint (default: latest canonical block hash).

To reset the watcher to a previous block number:

yarn reset watcher --block-number <previous-block-number>

Reset job-queue:

yarn reset job-queue

Reset state:

yarn reset state --block-number <previous-block-number>
  • block-number: Block number to which to reset the watcher.

To export and import the watcher state:

In the source watcher, export watcher state:

yarn export-state --export-file [export-file-path] --block-number [snapshot-block-height]
  • export-file: Path of file to which to export the watcher data.
  • block-number: Block height at which to take snapshot for export.

In the target watcher, run job-runner:

yarn job-runner

Import watcher state:

yarn import-state --import-file <import-file-path>
  • import-file: Path of file from which to import the watcher data.

Run server:

yarn server

To inspect a CID:

yarn inspect-cid --cid <cid>
  • cid: CID to be inspected.