Compare commits
No commits in common. "main" and "v0.1.9" have entirely different histories.
@ -1,29 +0,0 @@
|
||||
name: Publish azimuth-watcher docker image on release
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Run docker build and publish
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Run docker build
|
||||
run: docker build -t cerc/watcher-azimuth -f Dockerfile .
|
||||
- name: Get the version
|
||||
id: vars
|
||||
run: |
|
||||
echo "sha=$(echo ${GITHUB_SHA:0:7})" >> $GITHUB_OUTPUT
|
||||
echo "tag=$(echo ${GITHUB_REF#refs/tags/})" >> $GITHUB_OUTPUT
|
||||
- name: Tag docker image with SHA
|
||||
run: docker tag cerc/watcher-azimuth git.vdb.to/laconicnetwork/cerc/watcher-azimuth:${{steps.vars.outputs.sha}}
|
||||
- name: Tag docker image with release tag
|
||||
run: docker tag git.vdb.to/laconicnetwork/cerc/watcher-azimuth:${{steps.vars.outputs.sha}} git.vdb.to/laconicnetwork/cerc/watcher-azimuth:${{steps.vars.outputs.tag}}
|
||||
- name: Docker Login
|
||||
run: echo ${{ secrets.CICD_PUBLISH_TOKEN }} | docker login https://git.vdb.to -u laconiccicd --password-stdin
|
||||
- name: Docker Push SHA
|
||||
run: docker push git.vdb.to/laconicnetwork/cerc/watcher-azimuth:${{steps.vars.outputs.sha}}
|
||||
- name: Docker Push TAGGED
|
||||
run: docker push git.vdb.to/laconicnetwork/cerc/watcher-azimuth:${{steps.vars.outputs.tag}}
|
||||
187
CLAUDE.md
187
CLAUDE.md
@ -1,187 +0,0 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## What is Azimuth?
|
||||
|
||||
Azimuth is Urbit's public key infrastructure (PKI) that lives on Ethereum. It's a set of smart contracts that manage Urbit identities called "points" (similar to usernames), their ownership, cryptographic keys, and hierarchical relationships. By storing identity data on Ethereum, the system is decentralized and censorship-resistant.
|
||||
|
||||
## Project Overview
|
||||
|
||||
This is a monorepo containing blockchain watchers for the Azimuth PKI system used in Urbit identities. It watches multiple Ethereum contracts (Azimuth, Censures, Claims, ConditionalStarRelease, DelegatedSending, Ecliptic, LinearStarRelease, Polls) and provides GraphQL APIs for querying their state.
|
||||
|
||||
**Watchers** are services that continuously monitor smart contracts on Ethereum, index their events and state changes, and provide efficient APIs for querying blockchain data. Instead of directly querying the Ethereum blockchain (which is slow and expensive), applications can query watchers for fast, indexed access to current and historical blockchain state.
|
||||
|
||||
## Hosted Service
|
||||
|
||||
A public instance is available at: **https://azimuth.dev.vdb.to/graphql**
|
||||
|
||||
You can also run the system locally using [Stack Orchestrator](https://git.vdb.to/cerc-io/stack-orchestrator/src/branch/main/app/data/stacks/azimuth).
|
||||
|
||||
## Common Commands
|
||||
|
||||
### Building and Development
|
||||
```bash
|
||||
# Build all packages
|
||||
yarn build
|
||||
# or
|
||||
lerna run build --stream
|
||||
|
||||
# Lint all packages (max warnings = 0)
|
||||
yarn lint
|
||||
# or
|
||||
lerna run lint --stream -- --max-warnings=0
|
||||
|
||||
# Set versions across packages
|
||||
yarn version:set
|
||||
# or
|
||||
lerna version --no-git-tag-version
|
||||
```
|
||||
|
||||
### Individual Watcher Commands
|
||||
Each watcher package supports these commands:
|
||||
```bash
|
||||
# Development server (with hot reload)
|
||||
yarn server:dev
|
||||
|
||||
# Production server
|
||||
yarn server
|
||||
|
||||
# Job runner (processes blockchain events)
|
||||
yarn job-runner:dev # development
|
||||
yarn job-runner # production
|
||||
|
||||
# Watch contract for events
|
||||
yarn watch:contract
|
||||
|
||||
# Fill historical data
|
||||
yarn fill
|
||||
|
||||
# Reset operations
|
||||
yarn reset
|
||||
|
||||
# State management
|
||||
yarn checkpoint:dev
|
||||
yarn export-state:dev
|
||||
yarn import-state:dev
|
||||
|
||||
# Utilities
|
||||
yarn inspect-cid
|
||||
yarn index-block
|
||||
```
|
||||
|
||||
### Gateway Server
|
||||
The gateway server runs on port 4000 by default.
|
||||
```bash
|
||||
# Development gateway server (proxies to all watchers)
|
||||
yarn server:dev
|
||||
|
||||
# Production gateway server
|
||||
yarn server
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
### Monorepo Structure
|
||||
- **Lerna-managed** yarn workspaces with 8 watcher packages + 1 gateway server
|
||||
- Each watcher is a standalone service with its own database and GraphQL endpoint
|
||||
- **Gateway server** acts as a unified GraphQL proxy that routes queries to appropriate watchers
|
||||
|
||||
### Watcher Packages
|
||||
Each watcher follows identical structure:
|
||||
- **Port allocation**: azimuth(3001), censures(3002), claims(3003), conditionalStarRelease(3004), delegatedSending(3005), ecliptic(3006), linearStarRelease(3007), polls(3008)
|
||||
- **Database**: Individual PostgreSQL database per watcher
|
||||
- **Configuration**: TOML files in `environments/` directory
|
||||
- **Generated code**: Built from contract ABIs using `@cerc-io/codegen`
|
||||
|
||||
### Key Components Per Watcher
|
||||
- `src/server.ts` - GraphQL server
|
||||
- `src/job-runner.ts` - Event processing worker
|
||||
- `src/indexer.ts` - Blockchain event indexing logic
|
||||
- `src/resolvers.ts` - GraphQL resolvers
|
||||
- `src/entity/` - TypeORM entities for all contract methods
|
||||
- `src/gql/queries/` - GraphQL query definitions
|
||||
- `src/cli/` - Command-line utilities for management
|
||||
|
||||
### Gateway Server Architecture
|
||||
- **Port**: Runs on port 4000 by default (http://localhost:4000/graphql)
|
||||
- **Schema stitching**: Combines all watcher schemas with prefixed field names
|
||||
- **Health checking**: Monitors watcher availability before routing
|
||||
- **Configuration**: `packages/gateway-server/src/watchers.json` defines watcher endpoints and prefixes
|
||||
- **GraphQL proxy**: Routes queries like `azimuthGetKeys` to azimuth-watcher at localhost:3001
|
||||
- **Query prefixing**: Each watcher's queries are prefixed (e.g., `azimuthGetKeys`, `censuresGetCensuredByCount`, `claimsFindClaim`)
|
||||
|
||||
### Data Flow
|
||||
1. **Event Processing**: job-runner fetches Ethereum events → processes through indexer → stores in database
|
||||
2. **Query Processing**: GraphQL queries → gateway server → appropriate watcher → database → response
|
||||
3. **State Management**: Supports checkpointing, state export/import for data recovery
|
||||
|
||||
## Configuration Notes
|
||||
|
||||
### Environment Setup
|
||||
- Each watcher requires PostgreSQL database (configurable in `environments/local.toml`)
|
||||
- Requires Ethereum RPC endpoint (ipld-eth-server or standard RPC)
|
||||
- Gateway server expects all watchers running on their designated ports
|
||||
|
||||
### Development Workflow
|
||||
- Start individual watchers with `yarn server:dev` and `yarn job-runner:dev`
|
||||
- Start gateway server for unified GraphQL endpoint
|
||||
- Use `yarn fill` to sync historical blockchain data
|
||||
- Monitor with debug logs using `DEBUG=vulcanize:*`
|
||||
|
||||
### Generated Watcher Creation
|
||||
Watchers are generated using `@cerc-io/codegen` from contract ABIs. The process involves creating config.yaml files specifying contract paths, output folders, and generation modes (eth_call/storage/all).
|
||||
|
||||
## Docker & Deployment
|
||||
|
||||
### Building Docker Images
|
||||
The project includes a Dockerfile for building production-ready container images:
|
||||
|
||||
```bash
|
||||
# Build the watcher-azimuth image
|
||||
docker build -t cerc/watcher-azimuth -f Dockerfile .
|
||||
```
|
||||
|
||||
The Dockerfile:
|
||||
- Uses Node.js 18.16.0 on Alpine Linux 3.16
|
||||
- Installs build dependencies (git, python3, alpine-sdk, jq)
|
||||
- Embeds the Git commit hash in all package.json files
|
||||
- Builds only azimuth-watcher and gateway-server packages
|
||||
- Includes toml-js for runtime configuration updates
|
||||
- Results in a ~1.1GB production image
|
||||
|
||||
### CI/CD Pipeline
|
||||
The project uses GitHub Actions for automated Docker image publishing:
|
||||
|
||||
- **Trigger**: On release publication (tags)
|
||||
- **Workflow**: `.gitea/workflows/docker-image.yml`
|
||||
- **Outputs**:
|
||||
- Image tagged with git SHA (e.g., `git.vdb.to/laconicnetwork/cerc/watcher-azimuth:abc1234`)
|
||||
- Image tagged with release version (e.g., `git.vdb.to/laconicnetwork/cerc/watcher-azimuth:v0.1.10`)
|
||||
- **Registry**: git.vdb.to
|
||||
|
||||
To trigger a release build:
|
||||
1. Create and push a new git tag
|
||||
2. Publish the release on GitHub
|
||||
3. CI will automatically build and push Docker images
|
||||
|
||||
## Git Hooks
|
||||
|
||||
The project uses [Husky](https://typicode.github.io/husky/) for Git hooks:
|
||||
|
||||
- **Pre-commit hook**: Automatically runs `yarn lint` before every commit
|
||||
- **Configuration**: `.husky/pre-commit`
|
||||
- **Setup**: Run `yarn install` or `yarn prepare` to install hooks
|
||||
- **Bypass**: Use `git commit --no-verify` to skip hooks (not recommended)
|
||||
|
||||
This ensures code quality by enforcing linting rules before code is committed.
|
||||
|
||||
## Key Technologies
|
||||
|
||||
- **Language**: TypeScript 5.0+
|
||||
- **Database**: PostgreSQL with TypeORM 0.2.37
|
||||
- **Blockchain**: ethers.js 5.4+ for Ethereum interaction
|
||||
- **GraphQL**: graphql 15.5+ with custom resolvers
|
||||
- **API Framework**: @cerc-io packages for watcher infrastructure
|
||||
- **Monorepo**: Lerna 6.6+ with Yarn workspaces
|
||||
- **Base Image**: Node.js 18.16.0 on Alpine Linux (Docker)
|
||||
25
Dockerfile
25
Dockerfile
@ -1,25 +0,0 @@
|
||||
FROM node:18.16.0-alpine3.16
|
||||
|
||||
RUN apk --update --no-cache add git python3 alpine-sdk jq
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY . .
|
||||
|
||||
# Get the latest Git commit hash and set it in package.json of all watchers
|
||||
RUN COMMIT_HASH=$(git rev-parse HEAD) && \
|
||||
find . -name 'package.json' -exec sh -c ' \
|
||||
for packageFile; do \
|
||||
jq --arg commitHash "$0" ".commitHash = \$commitHash" "$packageFile" > "$packageFile.tmp" && \
|
||||
mv "$packageFile.tmp" "$packageFile"; \
|
||||
done \
|
||||
' "$COMMIT_HASH" {} \;
|
||||
|
||||
RUN echo "installing dependencies" && \
|
||||
yarn
|
||||
|
||||
RUN echo "Building azimuth-watcher and gateway-server" && \
|
||||
yarn build --scope @cerc-io/azimuth-watcher --scope @cerc-io/gateway-server
|
||||
|
||||
RUN echo "Install toml-js to update watcher config files" && \
|
||||
yarn add --dev --ignore-workspace-root-check toml-js
|
||||
365
README.md
365
README.md
@ -1,241 +1,186 @@
|
||||
# azimuth-watcher-ts
|
||||
|
||||
A comprehensive blockchain indexing and querying system for [Azimuth](https://docs.urbit.org/system/identity), Urbit's identity layer on Ethereum. This system monitors multiple Ethereum smart contracts that make up the Azimuth PKI and provides a unified GraphQL API for querying Urbit identity information.
|
||||
Watcher for the Azimuth PKI on Ethereum, used in Urbit identities. Read more about Azimuth:
|
||||
|
||||
## What is Azimuth?
|
||||
* [https://developers.urbit.org/reference/azimuth/azimuth](https://developers.urbit.org/reference/azimuth/azimuth)
|
||||
|
||||
Azimuth is Urbit's public key infrastructure (PKI) that lives on Ethereum. It's a set of smart contracts that manage Urbit identities called "points" (similar to usernames), their ownership, cryptographic keys, and hierarchical relationships. By storing identity data on Ethereum, the system is decentralized and censorship-resistant.
|
||||
This app can be run using Stack Orchestrator:
|
||||
|
||||
## What are Watchers?
|
||||
* [Azimuth stack](https://git.vdb.to/cerc-io/stack-orchestrator/src/branch/main/app/data/stacks/azimuth)
|
||||
|
||||
Watchers are services that continuously monitor smart contracts on Ethereum, index their events and state changes, and provide efficient APIs for querying blockchain data. Instead of directly querying the Ethereum blockchain (which is slow and expensive), applications can query watchers for fast, indexed access to current and historical blockchain state.
|
||||
It is also hosted at <https://azimuth.dev.vdb.to/graphql>
|
||||
|
||||
## System Architecture
|
||||
## Usage
|
||||
|
||||
This system consists of **8 specialized watchers** that each monitor different Azimuth smart contracts:
|
||||
* Query public keys for a point:
|
||||
|
||||
- **azimuth-watcher** - Core identity operations (ownership, keys, sponsorship)
|
||||
- **censures-watcher** - Reputation and censure system
|
||||
- **claims-watcher** - On-chain claims and metadata
|
||||
- **ecliptic-watcher** - Galaxy operations and governance
|
||||
- **polls-watcher** - Voting and governance proposals
|
||||
- **conditional-star-release-watcher** - Conditional star distribution
|
||||
- **linear-star-release-watcher** - Linear star distribution
|
||||
- **delegated-sending-watcher** - Delegated operations
|
||||
```bash
|
||||
# Example
|
||||
curl 'https://azimuth.dev.vdb.to/graphql' \
|
||||
-H 'Content-Type: application/json' \
|
||||
--data-raw '{"query":"{ azimuthGetKeys(blockHash: \"latest\", contractAddress: \"0x223c067F8CF28ae173EE5CafEa60cA44C335fecB\", _point: 58213) { value { encryptionKey: value0 authenticationKey: value1 cryptoSuiteVersion: value2 keyRevisionNumber: value3 } } }"}' \
|
||||
| jq
|
||||
|
||||
Plus a **gateway server** that provides a unified GraphQL endpoint routing queries to the appropriate watcher.
|
||||
# Response
|
||||
# {
|
||||
# "data": {
|
||||
# "azimuthGetKeys": {
|
||||
# "value": {
|
||||
# "encryptionKey": "0xc248f759474b16192bd8bdca0bff1b8bff555cd3d118022095331d6d98690c6d",
|
||||
# "authenticationKey": "0x21188bac08542730e1c4697636d6fa25968f404470ccf917756f05e28c69045a",
|
||||
# "cryptoSuiteVersion": "1",
|
||||
# "keyRevisionNumber": "1"
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
```
|
||||
|
||||
## Hosted Service
|
||||
* API params:
|
||||
* `contractAddress`: Azimuth contract address
|
||||
* `blockHash`: block hash at which you want to query the contract state
|
||||
|
||||
A public instance is available at: **<https://azimuth.dev.vdb.to/graphql>**
|
||||
* Example GQL queries:
|
||||
|
||||
You can also run the system locally using [Stack Orchestrator](https://git.vdb.to/cerc-io/stack-orchestrator/src/branch/main/app/data/stacks/azimuth).
|
||||
|
||||
## Common Use Cases
|
||||
|
||||
### Querying Urbit Point Information
|
||||
|
||||
The **azimuth-watcher** is the primary service for querying Urbit identity data. Here are the most common operations:
|
||||
|
||||
#### 1. Get Point Owner and Basic Info
|
||||
|
||||
```bash
|
||||
# Check who owns a specific Urbit point
|
||||
# Example:
|
||||
curl 'https://azimuth.dev.vdb.to/graphql' \
|
||||
-H 'Content-Type: application/json' \
|
||||
--data-raw '{"query":"{ azimuthGetOwner(blockHash: \"latest\", contractAddress: \"0x223c067F8CF28ae173EE5CafEa60cA44C335fecB\", _point: 1234) { value } }"}' \
|
||||
| jq
|
||||
|
||||
# Response:
|
||||
# {
|
||||
# "data": {
|
||||
# "azimuthGetOwner": {
|
||||
# "value": "0x4b22764F2Db640aB4d0Ecfd0F84344F3CB5C3715"
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
```
|
||||
|
||||
#### 2. Get Cryptographic Keys for a Point
|
||||
|
||||
```bash
|
||||
# Get encryption and authentication keys for networking
|
||||
# Example:
|
||||
curl 'https://azimuth.dev.vdb.to/graphql' \
|
||||
-H 'Content-Type: application/json' \
|
||||
--data-raw '{"query":"{ azimuthGetKeys(blockHash: \"latest\", contractAddress: \"0x223c067F8CF28ae173EE5CafEa60cA44C335fecB\", _point: 58213) { value { encryptionKey: value0 authenticationKey: value1 cryptoSuiteVersion: value2 keyRevisionNumber: value3 } } }"}' \
|
||||
| jq
|
||||
|
||||
# Response:
|
||||
# {
|
||||
# "data": {
|
||||
# "azimuthGetKeys": {
|
||||
# "value": {
|
||||
# "encryptionKey": "0xc248f759474b16192bd8bdca0bff1b8bff555cd3d118022095331d6d98690c6d",
|
||||
# "authenticationKey": "0x21188bac08542730e1c4697636d6fa25968f404470ccf917756f05e28c69045a",
|
||||
# "cryptoSuiteVersion": "1",
|
||||
# "keyRevisionNumber": "1"
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
```
|
||||
|
||||
#### 3. Check Point Status
|
||||
|
||||
```bash
|
||||
# Check if a point is active (booted) and has a sponsor
|
||||
# Example:
|
||||
curl 'https://azimuth.dev.vdb.to/graphql' \
|
||||
-H 'Content-Type: application/json' \
|
||||
--data-raw '{"query":"{ azimuthIsActive(blockHash: \"latest\", contractAddress: \"0x223c067F8CF28ae173EE5CafEa60cA44C335fecB\", _point: 1234) { value } azimuthHasSponsor(blockHash: \"latest\", contractAddress: \"0x223c067F8CF28ae173EE5CafEa60cA44C335fecB\", _point: 1234) { value } azimuthGetSponsor(blockHash: \"latest\", contractAddress: \"0x223c067F8CF28ae173EE5CafEa60cA44C335fecB\", _point: 1234) { value } }"}' \
|
||||
| jq
|
||||
|
||||
# Response:
|
||||
# {
|
||||
# "data": {
|
||||
# "azimuthIsActive": {
|
||||
# "value": true
|
||||
# },
|
||||
# "azimuthHasSponsor": {
|
||||
# "value": true
|
||||
# },
|
||||
# "azimuthGetSponsor": {
|
||||
# "value": "210"
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
```
|
||||
|
||||
#### 4. Get All Points Owned by an Address
|
||||
|
||||
```bash
|
||||
# Find all Urbit points owned by an Ethereum address
|
||||
# Example:
|
||||
curl 'https://azimuth.dev.vdb.to/graphql' \
|
||||
-H 'Content-Type: application/json' \
|
||||
--data-raw '{"query":"{ azimuthGetOwnedPoints(blockHash: \"latest\", contractAddress: \"0x223c067F8CF28ae173EE5CafEa60cA44C335fecB\", _whose: \"0x1234567890123456789012345678901234567890\") { value } }"}' \
|
||||
| jq
|
||||
|
||||
# Response:
|
||||
# {
|
||||
# "data": {
|
||||
# "azimuthGetOwnedPoints": {
|
||||
# "value": [
|
||||
# "57965",
|
||||
# "1234"
|
||||
# ]
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
```
|
||||
|
||||
#### 5. Multi-Watcher Queries
|
||||
|
||||
The gateway server allows querying multiple watchers in a single request:
|
||||
|
||||
```graphql
|
||||
{
|
||||
# Check point status (azimuth-watcher)
|
||||
azimuthIsActive(
|
||||
blockHash: "0x2461e78f075e618173c524b5ab4309111001517bb50cfd1b3505aed5433cf5f9"
|
||||
contractAddress: "0x223c067F8CF28ae173EE5CafEa60cA44C335fecB"
|
||||
_point: 1
|
||||
) {
|
||||
value
|
||||
```gql
|
||||
{
|
||||
azimuthIsActive(
|
||||
blockHash: "0x2461e78f075e618173c524b5ab4309111001517bb50cfd1b3505aed5433cf5f9"
|
||||
contractAddress: "0x223c067F8CF28ae173EE5CafEa60cA44C335fecB"
|
||||
_point: 1
|
||||
) {
|
||||
value
|
||||
}
|
||||
censuresGetCensuredByCount(
|
||||
blockHash: "0x2461e78f075e618173c524b5ab4309111001517bb50cfd1b3505aed5433cf5f9"
|
||||
contractAddress: "0x325f68d32BdEe6Ed86E7235ff2480e2A433D6189"
|
||||
_who: 6054
|
||||
) {
|
||||
value
|
||||
}
|
||||
claimsFindClaim(
|
||||
blockHash: "0x2461e78f075e618173c524b5ab4309111001517bb50cfd1b3505aed5433cf5f9"
|
||||
contractAddress: "0xe7e7f69b34D7d9Bd8d61Fb22C33b22708947971A"
|
||||
_whose: 1967913144
|
||||
_protocol: "text"
|
||||
_claim: "Shrek is NOT Drek!"
|
||||
) {
|
||||
value
|
||||
}
|
||||
linearStarReleaseVerifyBalance(
|
||||
blockHash: "0x2461e78f075e618173c524b5ab4309111001517bb50cfd1b3505aed5433cf5f9"
|
||||
contractAddress: "0x86cd9cd0992F04231751E3761De45cEceA5d1801"
|
||||
_participant: "0xbD396c580d868FBbE4a115DD667E756079880801"
|
||||
) {
|
||||
value
|
||||
}
|
||||
conditionalStarReleaseWithdrawLimit(
|
||||
blockHash: "0x2461e78f075e618173c524b5ab4309111001517bb50cfd1b3505aed5433cf5f9"
|
||||
contractAddress: "0x8C241098C3D3498Fe1261421633FD57986D74AeA"
|
||||
_participant: "0x7F0584938E649061e80e45cF88E6d8dDDb22f2aB"
|
||||
_batch: 2
|
||||
) {
|
||||
value
|
||||
}
|
||||
pollsGetUpgradeProposalCount(
|
||||
blockHash: "0xeaf611fabbe604932d36b97c89955c091e9582e292b741ebf144962b9ff5c271"
|
||||
contractAddress: "0x7fEcaB617c868Bb5996d99D95200D2Fa708218e4"
|
||||
) {
|
||||
value
|
||||
}
|
||||
eclipticBalanceOf(
|
||||
blockHash: "0x5e82abbe6474caf7b5325022db1d1287ce352488b303685493289770484f54f4"
|
||||
contractAddress: "0x33EeCbf908478C10614626A9D304bfe18B78DD73"
|
||||
_owner: "0x4b5E239C1bbb98d44ea23BC9f8eC7584F54096E8"
|
||||
) {
|
||||
value
|
||||
}
|
||||
delegatedSendingCanSend(
|
||||
blockHash: "0x2461e78f075e618173c524b5ab4309111001517bb50cfd1b3505aed5433cf5f9"
|
||||
contractAddress: "0xf6b461fE1aD4bd2ce25B23Fe0aff2ac19B3dFA76"
|
||||
_as: 1
|
||||
_point: 1
|
||||
) {
|
||||
value
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
# Check censure count (censures-watcher)
|
||||
censuresGetCensuredByCount(
|
||||
blockHash: "0x2461e78f075e618173c524b5ab4309111001517bb50cfd1b3505aed5433cf5f9"
|
||||
contractAddress: "0x325f68d32BdEe6Ed86E7235ff2480e2A433D6189"
|
||||
_who: 6054
|
||||
) {
|
||||
value
|
||||
} }
|
||||
## Generate Watchers
|
||||
|
||||
# Find a claim (claims-watcher)
|
||||
claimsFindClaim(
|
||||
blockHash: "0x2461e78f075e618173c524b5ab4309111001517bb50cfd1b3505aed5433cf5f9"
|
||||
contractAddress: "0xe7e7f69b34D7d9Bd8d61Fb22C33b22708947971A"
|
||||
_whose: 1967913144
|
||||
_protocol: "text"
|
||||
_claim: "Shrek is NOT Drek!"
|
||||
) {
|
||||
value
|
||||
}
|
||||
Steps to generate Azimuth watchers using the code generator ([`@cerc-io/codegen`](https://github.com/cerc-io/watcher-ts/tree/v0.2.76/packages/codegen))
|
||||
|
||||
# Check star release balance (linear-star-release-watcher)
|
||||
linearStarReleaseVerifyBalance(
|
||||
blockHash: "0x2461e78f075e618173c524b5ab4309111001517bb50cfd1b3505aed5433cf5f9"
|
||||
contractAddress: "0x86cd9cd0992F04231751E3761De45cEceA5d1801"
|
||||
_participant: "0xbD396c580d868FBbE4a115DD667E756079880801"
|
||||
) {
|
||||
value
|
||||
}
|
||||
* Clone the original Azimuth repo for required contracts:
|
||||
|
||||
# Check conditional star release (conditional-star-release-watcher)
|
||||
conditionalStarReleaseWithdrawLimit(
|
||||
blockHash: "0x2461e78f075e618173c524b5ab4309111001517bb50cfd1b3505aed5433cf5f9"
|
||||
contractAddress: "0x8C241098C3D3498Fe1261421633FD57986D74AeA"
|
||||
_participant: "0x7F0584938E649061e80e45cF88E6d8dDDb22f2aB"
|
||||
_batch: 2
|
||||
) {
|
||||
value
|
||||
}
|
||||
```bash
|
||||
git clone git@github.com:urbit/azimuth.git
|
||||
|
||||
# Check governance proposals (polls-watcher)
|
||||
pollsGetUpgradeProposalCount(
|
||||
blockHash: "0xeaf611fabbe604932d36b97c89955c091e9582e292b741ebf144962b9ff5c271"
|
||||
contractAddress: "0x7fEcaB617c868Bb5996d99D95200D2Fa708218e4"
|
||||
) {
|
||||
value
|
||||
}
|
||||
# Install dependencies
|
||||
npm install
|
||||
|
||||
# Check NFT balance (ecliptic-watcher)
|
||||
eclipticBalanceOf(
|
||||
blockHash: "0x5e82abbe6474caf7b5325022db1d1287ce352488b303685493289770484f54f4"
|
||||
contractAddress: "0x33EeCbf908478C10614626A9D304bfe18B78DD73"
|
||||
_owner: "0x4b5E239C1bbb98d44ea23BC9f8eC7584F54096E8"
|
||||
) {
|
||||
value
|
||||
}
|
||||
# Contracts are located in the contracts folder
|
||||
```
|
||||
|
||||
# Check delegation permissions (delegated-sending-watcher)
|
||||
delegatedSendingCanSend(
|
||||
blockHash: "0x2461e78f075e618173c524b5ab4309111001517bb50cfd1b3505aed5433cf5f9"
|
||||
contractAddress: "0xf6b461fE1aD4bd2ce25B23Fe0aff2ac19B3dFA76"
|
||||
_as: 1
|
||||
_point: 1
|
||||
) {
|
||||
value
|
||||
}
|
||||
}
|
||||
```
|
||||
* Setup `cerc-io/watcher-ts` repo:
|
||||
|
||||
### Understanding Query Parameters
|
||||
```bash
|
||||
git clone git@github.com:cerc-io/watcher-ts.git
|
||||
|
||||
All queries require these standard parameters:
|
||||
# Install dependencies and build packages
|
||||
yarn install && yarn build
|
||||
```
|
||||
|
||||
- **`blockHash`**: Use `"latest"` for current state, or a specific block hash for historical queries
|
||||
- **`contractAddress`**: Azimuth contract address (`0x223c067F8CF28ae173EE5CafEa60cA44C335fecB`)
|
||||
- **`_point`**: The Urbit point number you're querying
|
||||
- **`_whose`**: Ethereum address when querying by owner
|
||||
* Create a folder to place all the generated watchers in:
|
||||
|
||||
## How It Works
|
||||
```bash
|
||||
mkdir -p azimuth-watcher-ts/packages
|
||||
```
|
||||
|
||||
### Data Source
|
||||
* In `watcher-ts/packages/codegen`, create a `config.yaml` file with required codegen config for generating the watcher for a contract
|
||||
|
||||
The watchers continuously monitor Ethereum smart contracts by connecting to Ethereum RPC endpoint(s), indexing blockchain events and state changes.
|
||||
For example, for `Azimuth` contract:
|
||||
|
||||
### Data Flow
|
||||
```yaml
|
||||
# Contracts to watch (required).
|
||||
contracts:
|
||||
# Contract name.
|
||||
- name: Azimuth
|
||||
# Contract file path or an url.
|
||||
path: /home/user/azimuth/contracts/Azimuth.sol
|
||||
# Contract kind
|
||||
kind: Azimuth
|
||||
|
||||
1. **Indexing**: Job runners fetch Ethereum events and blocks from RPC endpoint(s)
|
||||
2. **Processing**: Events are processed and state changes stored in PostgreSQL databases
|
||||
3. **Querying**: GraphQL servers provide fast, indexed access to current and historical blockchain state
|
||||
4. **Gateway**: Unified endpoint routes queries to appropriate specialized watchers
|
||||
# Output folder path (logs output using `stdout` if not provided).
|
||||
outputFolder: /home/user/azimuth-watcher-ts/packages/azimuth-watcher
|
||||
|
||||
### Storage
|
||||
# Code generation mode [eth_call | storage | all | none] (default: none).
|
||||
mode: eth_call
|
||||
|
||||
Each watcher maintains its own PostgreSQL database for efficient querying and data isolation.
|
||||
# Kind of watcher [lazy | active] (default: active).
|
||||
kind: active
|
||||
|
||||
# Watcher server port (default: 3008).
|
||||
port: 3001
|
||||
|
||||
# Solc version to use (optional)
|
||||
# If not defined, uses solc version listed in dependencies
|
||||
solc: v0.4.24+commit.e67f0147
|
||||
|
||||
# Flatten the input contract file(s) [true | false] (default: true).
|
||||
flatten: true
|
||||
```
|
||||
|
||||
Note: Create `.sol` files with the contract code from Etherscan for [`ConditionalStarRelease`](https://etherscan.io/address/0x8C241098C3D3498Fe1261421633FD57986D74AeA#code), [`DelegatedSending`](https://etherscan.io/address/0xf6b461fe1ad4bd2ce25b23fe0aff2ac19b3dfa76#code), [`Ecliptic`](https://etherscan.io/address/ecliptic.eth#code) and [`LinearStarRelease`](https://etherscan.io/address/0x86cd9cd0992F04231751E3761De45cEceA5d1801#code) contracts and use the file path for `contracts.path`
|
||||
|
||||
* Run codegen command to generate the watcher:
|
||||
|
||||
```bash
|
||||
# In watcher-ts/packages/codegen
|
||||
yarn codegen --config-file ./config.yaml
|
||||
```
|
||||
|
||||
* Update `contracts`, `outputFolder` and `port` fields in the config and re-run the codegen command for all other contracts
|
||||
|
||||
* Setup the parent folder `/home/user/azimuth-watcher-ts` where all the generated watchers are placed as a monorepo
|
||||
|
||||
* The [gateway GQL server](packages/gateway-server) can be used to proxy queries to their respective watchers
|
||||
|
||||
@ -1,76 +0,0 @@
|
||||
# Generate Azimuth Watchers
|
||||
|
||||
* Clone the original Azimuth repo for required contracts:
|
||||
|
||||
```bash
|
||||
git clone git@github.com:urbit/azimuth.git
|
||||
|
||||
# Install dependencies
|
||||
npm install
|
||||
|
||||
# Contracts are located in the contracts folder
|
||||
```
|
||||
|
||||
* Setup `cerc-io/watcher-ts` repo:
|
||||
|
||||
```bash
|
||||
git clone git@github.com:cerc-io/watcher-ts.git
|
||||
|
||||
# Install dependencies and build packages
|
||||
yarn install && yarn build
|
||||
```
|
||||
|
||||
* Create a folder to place all the generated watchers in:
|
||||
|
||||
```bash
|
||||
mkdir -p azimuth-watcher-ts/packages
|
||||
```
|
||||
|
||||
* In `watcher-ts/packages/codegen`, create a `config.yaml` file with required codegen config for generating the watcher for a contract
|
||||
|
||||
For example, for `Azimuth` contract:
|
||||
|
||||
```yaml
|
||||
# Contracts to watch (required).
|
||||
contracts:
|
||||
# Contract name.
|
||||
- name: Azimuth
|
||||
# Contract file path or an url.
|
||||
path: /home/user/azimuth/contracts/Azimuth.sol
|
||||
# Contract kind
|
||||
kind: Azimuth
|
||||
|
||||
# Output folder path (logs output using `stdout` if not provided).
|
||||
outputFolder: /home/user/azimuth-watcher-ts/packages/azimuth-watcher
|
||||
|
||||
# Code generation mode [eth_call | storage | all | none] (default: none).
|
||||
mode: eth_call
|
||||
|
||||
# Kind of watcher [lazy | active] (default: active).
|
||||
kind: active
|
||||
|
||||
# Watcher server port (default: 3008).
|
||||
port: 3001
|
||||
|
||||
# Solc version to use (optional)
|
||||
# If not defined, uses solc version listed in dependencies
|
||||
solc: v0.4.24+commit.e67f0147
|
||||
|
||||
# Flatten the input contract file(s) [true | false] (default: true).
|
||||
flatten: true
|
||||
```
|
||||
|
||||
Note: Create `.sol` files with the contract code from Etherscan for [`ConditionalStarRelease`](https://etherscan.io/address/0x8C241098C3D3498Fe1261421633FD57986D74AeA#code), [`DelegatedSending`](https://etherscan.io/address/0xf6b461fe1ad4bd2ce25b23fe0aff2ac19b3dfa76#code), [`Ecliptic`](https://etherscan.io/address/ecliptic.eth#code) and [`LinearStarRelease`](https://etherscan.io/address/0x86cd9cd0992F04231751E3761De45cEceA5d1801#code) contracts and use the file path for `contracts.path`
|
||||
|
||||
* Run codegen command to generate the watcher:
|
||||
|
||||
```bash
|
||||
# In watcher-ts/packages/codegen
|
||||
yarn codegen --config-file ./config.yaml
|
||||
```
|
||||
|
||||
* Update `contracts`, `outputFolder` and `port` fields in the config and re-run the codegen command for all other contracts
|
||||
|
||||
* Setup the parent folder `/home/user/azimuth-watcher-ts` where all the generated watchers are placed as a monorepo
|
||||
|
||||
* The [gateway GQL server](packages/gateway-server) can be used to proxy queries to their respective watchers
|
||||
@ -3,6 +3,6 @@
|
||||
"packages/*"
|
||||
],
|
||||
"useWorkspaces": true,
|
||||
"version": "0.2.1",
|
||||
"version": "0.1.9",
|
||||
"npmClient": "yarn"
|
||||
}
|
||||
|
||||
@ -1,131 +0,0 @@
|
||||
# Mock Sponsorship Events
|
||||
|
||||
This document describes how to inject mock sponsorship change events into the azimuth-watcher for testing purposes.
|
||||
|
||||
## Overview
|
||||
|
||||
The azimuth-watcher supports injecting mock events for sponsorship changes (EscapeRequested, EscapeAccepted, EscapeCanceled, LostSponsor) via a GraphQL mutation.
|
||||
|
||||
## Usage
|
||||
|
||||
### Inject Mock Events
|
||||
|
||||
Open the GraphQL playground and run the `injectMockEvents` mutation:
|
||||
|
||||
```graphql
|
||||
mutation {
|
||||
injectMockEvents(
|
||||
events: [
|
||||
{
|
||||
type: ESCAPE_REQUESTED
|
||||
point: 256
|
||||
sponsor: 1
|
||||
blockNumber: 1000
|
||||
}
|
||||
{
|
||||
type: ESCAPE_ACCEPTED
|
||||
point: 256
|
||||
sponsor: 1
|
||||
blockNumber: 1001
|
||||
}
|
||||
]
|
||||
) {
|
||||
success
|
||||
eventsInjected
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Event Types
|
||||
|
||||
The following event types are supported:
|
||||
|
||||
### Sponsorship Events
|
||||
- `ESCAPE_REQUESTED` - Star requests to change sponsor
|
||||
- `ESCAPE_ACCEPTED` - New galaxy accepts the star
|
||||
- `ESCAPE_CANCELED` - Escape request is canceled (by star or rejected by galaxy)
|
||||
- `LOST_SPONSOR` - Current galaxy stops sponsoring the star
|
||||
|
||||
### Ownership Events
|
||||
- `OWNER_CHANGED` - Ownership of a point changes
|
||||
|
||||
## Example Scenarios
|
||||
|
||||
### Successful Sponsor Change
|
||||
|
||||
```graphql
|
||||
mutation {
|
||||
injectMockEvents(
|
||||
events: [
|
||||
{ type: ESCAPE_REQUESTED, point: 256, sponsor: 1, blockNumber: 1000 }
|
||||
{ type: ESCAPE_ACCEPTED, point: 256, sponsor: 1, blockNumber: 1001 }
|
||||
]
|
||||
) {
|
||||
success
|
||||
eventsInjected
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Galaxy Detaches Star
|
||||
|
||||
```graphql
|
||||
mutation {
|
||||
injectMockEvents(
|
||||
events: [
|
||||
{ type: LOST_SPONSOR, point: 512, sponsor: 0, blockNumber: 2000 }
|
||||
]
|
||||
) {
|
||||
success
|
||||
eventsInjected
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Canceled Escape
|
||||
|
||||
```graphql
|
||||
mutation {
|
||||
injectMockEvents(
|
||||
events: [
|
||||
{ type: ESCAPE_REQUESTED, point: 768, sponsor: 2, blockNumber: 3000 }
|
||||
{ type: ESCAPE_CANCELED, point: 768, sponsor: 2, blockNumber: 3001 }
|
||||
]
|
||||
) {
|
||||
success
|
||||
eventsInjected
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Ownership Change
|
||||
|
||||
```graphql
|
||||
mutation {
|
||||
injectMockEvents(
|
||||
events: [
|
||||
{ type: OWNER_CHANGED, point: 256, owner: "0x1234567890123456789012345678901234567890", blockNumber: 4000 }
|
||||
]
|
||||
) {
|
||||
success
|
||||
eventsInjected
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Testing from zenithd
|
||||
|
||||
1. Set the azimuth-watcher endpoint:
|
||||
```bash
|
||||
export AZIMUTH_WATCHER_ENDPOINT=http://localhost:3001/graphql
|
||||
```
|
||||
|
||||
2. Inject mock events via GraphQL playground (step 2 above)
|
||||
|
||||
3. Run zenithd tests - it will receive the mock events through normal GraphQL queries
|
||||
|
||||
## Files Modified
|
||||
|
||||
- `src/mock-event-store.ts` - In-memory event storage
|
||||
- `src/schema.gql` - Added mutation and types
|
||||
- `src/resolvers.ts` - Added mutation resolver and modified `eventsInRange` query
|
||||
@ -27,12 +27,6 @@
|
||||
# Log directory for GQL requests
|
||||
logDir = "./gql-logs"
|
||||
|
||||
# Flag to enable injecting mock events for testing
|
||||
enableMockEvents = false
|
||||
|
||||
# Flag to enable mocking ship keys for testing
|
||||
enableMockShipKeys = false
|
||||
|
||||
# GQL cache settings
|
||||
[server.gql.cache]
|
||||
enabled = true
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@cerc-io/azimuth-watcher",
|
||||
"version": "0.2.1",
|
||||
"version": "0.1.9",
|
||||
"description": "azimuth-watcher",
|
||||
"private": true,
|
||||
"main": "dist/index.js",
|
||||
@ -39,10 +39,10 @@
|
||||
"homepage": "https://github.com/cerc-io/watcher-ts#readme",
|
||||
"dependencies": {
|
||||
"@apollo/client": "^3.3.19",
|
||||
"@cerc-io/cli": "0.2.98-patch.5",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.5",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.5",
|
||||
"@cerc-io/util": "0.2.98-patch.5",
|
||||
"@cerc-io/cli": "0.2.98-patch.2",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.2",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.2",
|
||||
"@cerc-io/util": "0.2.98-patch.2",
|
||||
"@ethersproject/providers": "^5.4.4",
|
||||
"debug": "^4.3.1",
|
||||
"decimal.js": "^10.3.1",
|
||||
|
||||
@ -1,105 +0,0 @@
|
||||
//
|
||||
// Copyright 2025 DeepStack
|
||||
//
|
||||
|
||||
import { ResultEvent } from '@cerc-io/util';
|
||||
|
||||
const AZIMUTH_CONTRACT = '0x223c067F8CF28ae173EE5CafEa60cA44C335fecB';
|
||||
const MOCK_TX_HASH = '0x0000000000000000000000000000000000000000000000000000000000000000';
|
||||
const MOCK_FROM_ADDRESS = '0x0000000000000000000000000000000000000000';
|
||||
|
||||
export type MockEventType = 'ESCAPE_REQUESTED' | 'ESCAPE_ACCEPTED' | 'ESCAPE_CANCELED' | 'LOST_SPONSOR' | 'OWNER_CHANGED';
|
||||
|
||||
export interface MockEventInput {
|
||||
type: MockEventType;
|
||||
point: number;
|
||||
sponsor?: number;
|
||||
owner?: string;
|
||||
blockNumber: number;
|
||||
}
|
||||
|
||||
class MockEventStore {
|
||||
private events: ResultEvent[] = [];
|
||||
|
||||
addEvents (inputs: MockEventInput[]): number {
|
||||
const newEvents = inputs.map((input, index) => this.createMockEvent(input, index));
|
||||
this.events.push(...newEvents);
|
||||
return newEvents.length;
|
||||
}
|
||||
|
||||
getEventsInRange (fromBlock: number, toBlock: number, eventName?: string): ResultEvent[] {
|
||||
return this.events.filter(event => {
|
||||
const blockNumber = event.block.number;
|
||||
const matchesRange = blockNumber >= fromBlock && blockNumber <= toBlock;
|
||||
const matchesName = !eventName || event.event.__typename === `${eventName}Event`;
|
||||
return matchesRange && matchesName;
|
||||
});
|
||||
}
|
||||
|
||||
private createMockEvent (input: MockEventInput, eventIndex: number): ResultEvent {
|
||||
const { type, point, sponsor, owner, blockNumber } = input;
|
||||
|
||||
const blockHash = `0x${blockNumber.toString(16).padStart(64, '0')}`;
|
||||
const parentHash = `0x${(blockNumber - 1).toString(16).padStart(64, '0')}`;
|
||||
|
||||
return {
|
||||
block: {
|
||||
cid: null,
|
||||
hash: blockHash,
|
||||
number: blockNumber,
|
||||
timestamp: Math.floor(Date.now() / 1000),
|
||||
parentHash
|
||||
},
|
||||
tx: {
|
||||
hash: MOCK_TX_HASH,
|
||||
index: 0,
|
||||
from: MOCK_FROM_ADDRESS,
|
||||
to: AZIMUTH_CONTRACT
|
||||
},
|
||||
contract: AZIMUTH_CONTRACT,
|
||||
eventIndex,
|
||||
eventSignature: '',
|
||||
event: this.createEventData(type, point, sponsor, owner),
|
||||
proof: ''
|
||||
};
|
||||
}
|
||||
|
||||
private createEventData (type: MockEventType, point: number, sponsor?: number, owner?: string): any {
|
||||
switch (type) {
|
||||
case 'ESCAPE_REQUESTED':
|
||||
return {
|
||||
__typename: 'EscapeRequestedEvent',
|
||||
point: BigInt(point),
|
||||
sponsor: BigInt(sponsor ?? 0)
|
||||
};
|
||||
case 'ESCAPE_ACCEPTED':
|
||||
return {
|
||||
__typename: 'EscapeAcceptedEvent',
|
||||
point: BigInt(point),
|
||||
sponsor: BigInt(sponsor ?? 0)
|
||||
};
|
||||
case 'ESCAPE_CANCELED':
|
||||
return {
|
||||
__typename: 'EscapeCanceledEvent',
|
||||
point: BigInt(point),
|
||||
sponsor: BigInt(sponsor ?? 0)
|
||||
};
|
||||
case 'LOST_SPONSOR':
|
||||
return {
|
||||
__typename: 'LostSponsorEvent',
|
||||
point: BigInt(point),
|
||||
sponsor: BigInt(sponsor ?? 0)
|
||||
};
|
||||
case 'OWNER_CHANGED':
|
||||
return {
|
||||
__typename: 'OwnerChangedEvent',
|
||||
point: BigInt(point),
|
||||
owner: owner ?? ''
|
||||
};
|
||||
default:
|
||||
throw new Error(`Unknown mock event type: ${type}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const mockEventStore = new MockEventStore();
|
||||
@ -23,16 +23,9 @@ import {
|
||||
} from '@cerc-io/util';
|
||||
|
||||
import { Indexer } from './indexer';
|
||||
import { mockEventStore, MockEventInput } from './mock-event-store';
|
||||
|
||||
const log = debug('vulcanize:resolver');
|
||||
|
||||
// Mock ship keys environment variables
|
||||
const TEST_MOCK_POINT = process.env.TEST_MOCK_POINT;
|
||||
const TEST_MOCK_ENCRYPTION_KEY = process.env.TEST_MOCK_ENCRYPTION_KEY;
|
||||
const TEST_MOCK_AUTHENTICATION_KEY = process.env.TEST_MOCK_AUTHENTICATION_KEY;
|
||||
const TEST_MOCK_LIFE = process.env.TEST_MOCK_LIFE;
|
||||
|
||||
const executeAndRecordMetrics = async (
|
||||
indexer: Indexer,
|
||||
gqlLogger: winston.Logger,
|
||||
@ -85,8 +78,7 @@ export const createResolvers = async (
|
||||
const indexer = indexerArg as Indexer;
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const gqlConfig = indexer.serverConfig.gql;
|
||||
const mockShipKeysEnabled = (gqlConfig as any).enableMockShipKeys;
|
||||
const gqlCacheConfig = indexer.serverConfig.gql.cache;
|
||||
|
||||
return {
|
||||
BigInt: GraphQLBigInt,
|
||||
@ -113,17 +105,6 @@ export const createResolvers = async (
|
||||
await indexer.watchContract(address, kind, checkpoint, startingBlock);
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
injectMockEvents: async (_: any, { events }: { events: MockEventInput[] }): Promise<{ success: boolean, eventsInjected: number }> => {
|
||||
if ((gqlConfig as any).enableMockEvents) {
|
||||
log('injectMockEvents', events.length);
|
||||
const eventsInjected = mockEventStore.addEvents(events);
|
||||
return { success: true, eventsInjected };
|
||||
}
|
||||
|
||||
log('Forbidden');
|
||||
return { success: false, eventsInjected: 0 };
|
||||
}
|
||||
},
|
||||
|
||||
@ -141,17 +122,6 @@ export const createResolvers = async (
|
||||
// Set cache-control hints
|
||||
// setGQLCacheHints(info, {}, gqlCacheConfig);
|
||||
|
||||
// Check if we should return mocked active status for this point
|
||||
const shouldMock = mockShipKeysEnabled && TEST_MOCK_POINT && _point === BigInt(TEST_MOCK_POINT);
|
||||
|
||||
if (shouldMock) {
|
||||
log('isActive: returning mocked value (true) for point:', _point.toString());
|
||||
return Promise.resolve({
|
||||
value: true,
|
||||
proof: undefined
|
||||
});
|
||||
}
|
||||
|
||||
return executeAndRecordMetrics(
|
||||
indexer,
|
||||
gqlLogger,
|
||||
@ -174,22 +144,6 @@ export const createResolvers = async (
|
||||
// Set cache-control hints
|
||||
// setGQLCacheHints(info, {}, gqlCacheConfig);
|
||||
|
||||
// Check if we should return mocked keys for this point
|
||||
const shouldMock = mockShipKeysEnabled && TEST_MOCK_POINT && _point === BigInt(TEST_MOCK_POINT);
|
||||
|
||||
if (shouldMock) {
|
||||
log('getKeys: returning mocked keys for point:', _point.toString());
|
||||
return Promise.resolve({
|
||||
value: {
|
||||
value0: TEST_MOCK_ENCRYPTION_KEY,
|
||||
value1: TEST_MOCK_AUTHENTICATION_KEY,
|
||||
value2: BigInt(0),
|
||||
value3: BigInt(TEST_MOCK_LIFE ?? 1)
|
||||
},
|
||||
proof: undefined
|
||||
});
|
||||
}
|
||||
|
||||
return executeAndRecordMetrics(
|
||||
indexer,
|
||||
gqlLogger,
|
||||
@ -1171,8 +1125,7 @@ export const createResolvers = async (
|
||||
}
|
||||
|
||||
const events = await indexer.getEventsInRange(fromBlockNumber, toBlockNumber, name);
|
||||
const mockEvents = mockEventStore.getEventsInRange(fromBlockNumber, toBlockNumber, name);
|
||||
return [...events.map(event => indexer.getResultEvent(event)), ...mockEvents];
|
||||
return events.map(event => indexer.getResultEvent(event));
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
@ -174,27 +174,6 @@ type SyncStatus {
|
||||
latestProcessedBlockNumber: Int!
|
||||
}
|
||||
|
||||
enum MockEventType {
|
||||
ESCAPE_REQUESTED
|
||||
ESCAPE_ACCEPTED
|
||||
ESCAPE_CANCELED
|
||||
LOST_SPONSOR
|
||||
OWNER_CHANGED
|
||||
}
|
||||
|
||||
input MockEventInput {
|
||||
type: MockEventType!
|
||||
point: Int!
|
||||
sponsor: Int
|
||||
owner: String
|
||||
blockNumber: Int!
|
||||
}
|
||||
|
||||
type MockInjectionResult {
|
||||
success: Boolean!
|
||||
eventsInjected: Int!
|
||||
}
|
||||
|
||||
type Query {
|
||||
events(blockHash: String!, contractAddress: String!, name: String): [ResultEvent!]
|
||||
eventsInRange(fromBlockNumber: Int!, toBlockNumber: Int!, name: String): [ResultEvent!]
|
||||
@ -249,7 +228,6 @@ type Query {
|
||||
|
||||
type Mutation {
|
||||
watchContract(address: String!, kind: String!, checkpoint: Boolean!, startingBlock: Int): Boolean!
|
||||
injectMockEvents(events: [MockEventInput!]!): MockInjectionResult!
|
||||
}
|
||||
|
||||
type Subscription {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@cerc-io/censures-watcher",
|
||||
"version": "0.2.1",
|
||||
"version": "0.1.9",
|
||||
"description": "censures-watcher",
|
||||
"private": true,
|
||||
"main": "dist/index.js",
|
||||
@ -39,10 +39,10 @@
|
||||
"homepage": "https://github.com/cerc-io/watcher-ts#readme",
|
||||
"dependencies": {
|
||||
"@apollo/client": "^3.3.19",
|
||||
"@cerc-io/cli": "0.2.98-patch.5",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.5",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.5",
|
||||
"@cerc-io/util": "0.2.98-patch.5",
|
||||
"@cerc-io/cli": "0.2.98-patch.2",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.2",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.2",
|
||||
"@cerc-io/util": "0.2.98-patch.2",
|
||||
"@ethersproject/providers": "^5.4.4",
|
||||
"debug": "^4.3.1",
|
||||
"decimal.js": "^10.3.1",
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@cerc-io/claims-watcher",
|
||||
"version": "0.2.1",
|
||||
"version": "0.1.9",
|
||||
"description": "claims-watcher",
|
||||
"private": true,
|
||||
"main": "dist/index.js",
|
||||
@ -39,10 +39,10 @@
|
||||
"homepage": "https://github.com/cerc-io/watcher-ts#readme",
|
||||
"dependencies": {
|
||||
"@apollo/client": "^3.3.19",
|
||||
"@cerc-io/cli": "0.2.98-patch.5",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.5",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.5",
|
||||
"@cerc-io/util": "0.2.98-patch.5",
|
||||
"@cerc-io/cli": "0.2.98-patch.2",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.2",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.2",
|
||||
"@cerc-io/util": "0.2.98-patch.2",
|
||||
"@ethersproject/providers": "^5.4.4",
|
||||
"debug": "^4.3.1",
|
||||
"decimal.js": "^10.3.1",
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@cerc-io/conditional-star-release-watcher",
|
||||
"version": "0.2.1",
|
||||
"version": "0.1.9",
|
||||
"description": "conditional-star-release-watcher",
|
||||
"private": true,
|
||||
"main": "dist/index.js",
|
||||
@ -39,10 +39,10 @@
|
||||
"homepage": "https://github.com/cerc-io/watcher-ts#readme",
|
||||
"dependencies": {
|
||||
"@apollo/client": "^3.3.19",
|
||||
"@cerc-io/cli": "0.2.98-patch.5",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.5",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.5",
|
||||
"@cerc-io/util": "0.2.98-patch.5",
|
||||
"@cerc-io/cli": "0.2.98-patch.2",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.2",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.2",
|
||||
"@cerc-io/util": "0.2.98-patch.2",
|
||||
"@ethersproject/providers": "^5.4.4",
|
||||
"debug": "^4.3.1",
|
||||
"decimal.js": "^10.3.1",
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@cerc-io/delegated-sending-watcher",
|
||||
"version": "0.2.1",
|
||||
"version": "0.1.9",
|
||||
"description": "delegated-sending-watcher",
|
||||
"private": true,
|
||||
"main": "dist/index.js",
|
||||
@ -39,10 +39,10 @@
|
||||
"homepage": "https://github.com/cerc-io/watcher-ts#readme",
|
||||
"dependencies": {
|
||||
"@apollo/client": "^3.3.19",
|
||||
"@cerc-io/cli": "0.2.98-patch.5",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.5",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.5",
|
||||
"@cerc-io/util": "0.2.98-patch.5",
|
||||
"@cerc-io/cli": "0.2.98-patch.2",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.2",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.2",
|
||||
"@cerc-io/util": "0.2.98-patch.2",
|
||||
"@ethersproject/providers": "^5.4.4",
|
||||
"debug": "^4.3.1",
|
||||
"decimal.js": "^10.3.1",
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@cerc-io/ecliptic-watcher",
|
||||
"version": "0.2.1",
|
||||
"version": "0.1.9",
|
||||
"description": "ecliptic-watcher",
|
||||
"private": true,
|
||||
"main": "dist/index.js",
|
||||
@ -39,10 +39,10 @@
|
||||
"homepage": "https://github.com/cerc-io/watcher-ts#readme",
|
||||
"dependencies": {
|
||||
"@apollo/client": "^3.3.19",
|
||||
"@cerc-io/cli": "0.2.98-patch.5",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.5",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.5",
|
||||
"@cerc-io/util": "0.2.98-patch.5",
|
||||
"@cerc-io/cli": "0.2.98-patch.2",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.2",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.2",
|
||||
"@cerc-io/util": "0.2.98-patch.2",
|
||||
"@ethersproject/providers": "^5.4.4",
|
||||
"debug": "^4.3.1",
|
||||
"decimal.js": "^10.3.1",
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@cerc-io/gateway-server",
|
||||
"version": "0.2.1",
|
||||
"version": "0.1.9",
|
||||
"main": "index.js",
|
||||
"license": "AGPL-3.0",
|
||||
"private": true,
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@cerc-io/linear-star-release-watcher",
|
||||
"version": "0.2.1",
|
||||
"version": "0.1.9",
|
||||
"description": "linear-star-release-watcher",
|
||||
"private": true,
|
||||
"main": "dist/index.js",
|
||||
@ -39,10 +39,10 @@
|
||||
"homepage": "https://github.com/cerc-io/watcher-ts#readme",
|
||||
"dependencies": {
|
||||
"@apollo/client": "^3.3.19",
|
||||
"@cerc-io/cli": "0.2.98-patch.5",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.5",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.5",
|
||||
"@cerc-io/util": "0.2.98-patch.5",
|
||||
"@cerc-io/cli": "0.2.98-patch.2",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.2",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.2",
|
||||
"@cerc-io/util": "0.2.98-patch.2",
|
||||
"@ethersproject/providers": "^5.4.4",
|
||||
"debug": "^4.3.1",
|
||||
"decimal.js": "^10.3.1",
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@cerc-io/polls-watcher",
|
||||
"version": "0.2.1",
|
||||
"version": "0.1.9",
|
||||
"description": "polls-watcher",
|
||||
"private": true,
|
||||
"main": "dist/index.js",
|
||||
@ -39,10 +39,10 @@
|
||||
"homepage": "https://github.com/cerc-io/watcher-ts#readme",
|
||||
"dependencies": {
|
||||
"@apollo/client": "^3.3.19",
|
||||
"@cerc-io/cli": "0.2.98-patch.5",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.5",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.5",
|
||||
"@cerc-io/util": "0.2.98-patch.5",
|
||||
"@cerc-io/cli": "0.2.98-patch.2",
|
||||
"@cerc-io/ipld-eth-client": "0.2.98-patch.2",
|
||||
"@cerc-io/solidity-mapper": "0.2.98-patch.2",
|
||||
"@cerc-io/util": "0.2.98-patch.2",
|
||||
"@ethersproject/providers": "^5.4.4",
|
||||
"debug": "^4.3.1",
|
||||
"decimal.js": "^10.3.1",
|
||||
|
||||
88
yarn.lock
88
yarn.lock
@ -206,10 +206,10 @@
|
||||
js-tokens "^4.0.0"
|
||||
picocolors "^1.0.0"
|
||||
|
||||
"@cerc-io/cache@^0.2.98-patch.5":
|
||||
version "0.2.98-patch.5"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fcache/-/0.2.98-patch.5/cache-0.2.98-patch.5.tgz#bef0af0bae4155663a0cb257740303463577fac2"
|
||||
integrity sha512-9Marfx9EqJdGcvUxgJ/WjWfYIyXcMPhQoD4I+2NTmjxi/sCrSoHy9EQhIJiSfvr4YnTOn7AYFedOb+dsDKgKpQ==
|
||||
"@cerc-io/cache@^0.2.98-patch.2":
|
||||
version "0.2.98-patch.2"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fcache/-/0.2.98-patch.2/cache-0.2.98-patch.2.tgz#2be752e92aa42cc7c57ade5387fe950832d1e39a"
|
||||
integrity sha512-0KkK+UsC9iBPt23iD1n8CRS5anp9JHeAy2K5/fHLmFccc58rC6jNi2J/U+mDQ3AkeojlqMvDkQc4w071der/Gw==
|
||||
dependencies:
|
||||
canonical-json "^0.0.4"
|
||||
debug "^4.3.1"
|
||||
@ -217,19 +217,19 @@
|
||||
fs-extra "^10.0.0"
|
||||
level "^7.0.0"
|
||||
|
||||
"@cerc-io/cli@0.2.98-patch.5":
|
||||
version "0.2.98-patch.5"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fcli/-/0.2.98-patch.5/cli-0.2.98-patch.5.tgz#1d06f713e61705f74e4c469b6ade9a0d436b47a5"
|
||||
integrity sha512-TgYhPBk5QKVglBV/Iys/mCiDr1TmRn/ZWZBNMuamX02GTtWoSJRQIdFmqjRwVS68PB6Qkx3GzknQ177M2k8huQ==
|
||||
"@cerc-io/cli@0.2.98-patch.2":
|
||||
version "0.2.98-patch.2"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fcli/-/0.2.98-patch.2/cli-0.2.98-patch.2.tgz#56e2130a40cd748cd7f045d66393e836cb2b3583"
|
||||
integrity sha512-o3+Ryp0T/6TShd5gKFFtt67wBamtBpK0Ci/c87Yf8RiB7jPsXOILLvigJkhQWhnldvfCULyjWriy5L4dZ/j99w==
|
||||
dependencies:
|
||||
"@apollo/client" "^3.7.1"
|
||||
"@cerc-io/cache" "^0.2.98-patch.5"
|
||||
"@cerc-io/ipld-eth-client" "^0.2.98-patch.5"
|
||||
"@cerc-io/cache" "^0.2.98-patch.2"
|
||||
"@cerc-io/ipld-eth-client" "^0.2.98-patch.2"
|
||||
"@cerc-io/libp2p" "^0.42.2-laconic-0.1.4"
|
||||
"@cerc-io/nitro-node" "^0.1.15"
|
||||
"@cerc-io/peer" "^0.2.98-patch.5"
|
||||
"@cerc-io/rpc-eth-client" "^0.2.98-patch.5"
|
||||
"@cerc-io/util" "^0.2.98-patch.5"
|
||||
"@cerc-io/peer" "0.2.98"
|
||||
"@cerc-io/rpc-eth-client" "^0.2.98-patch.2"
|
||||
"@cerc-io/util" "^0.2.98-patch.2"
|
||||
"@ethersproject/providers" "^5.4.4"
|
||||
"@graphql-tools/utils" "^9.1.1"
|
||||
"@ipld/dag-cbor" "^8.0.0"
|
||||
@ -250,14 +250,14 @@
|
||||
typeorm "0.2.37"
|
||||
yargs "^17.0.1"
|
||||
|
||||
"@cerc-io/ipld-eth-client@0.2.98-patch.5", "@cerc-io/ipld-eth-client@^0.2.98-patch.5":
|
||||
version "0.2.98-patch.5"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fipld-eth-client/-/0.2.98-patch.5/ipld-eth-client-0.2.98-patch.5.tgz#ee123559a71ea14dbb3d27f7e9e91444372d78ac"
|
||||
integrity sha512-nw3qJxI6ZQ7tyWOMWIEsthLlACucFl4oqRIX7zRYzWYhXPzF7dsmzdGlO5AubJlUIugFMfIeBr0JEvOm4stTHA==
|
||||
"@cerc-io/ipld-eth-client@0.2.98-patch.2", "@cerc-io/ipld-eth-client@^0.2.98-patch.2":
|
||||
version "0.2.98-patch.2"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fipld-eth-client/-/0.2.98-patch.2/ipld-eth-client-0.2.98-patch.2.tgz#88feb90ff67dc6c4fa31f7bac64b34276b7aeccb"
|
||||
integrity sha512-Dh4IcQHkIvxGotXS/WqUzADfP9W8eZqGyaoKGlSYMNnFLgU5CL8Atag4yhfiKqqMZX1qO4QEoAFQ0ABIh8KhSw==
|
||||
dependencies:
|
||||
"@apollo/client" "^3.7.1"
|
||||
"@cerc-io/cache" "^0.2.98-patch.5"
|
||||
"@cerc-io/util" "^0.2.98-patch.5"
|
||||
"@cerc-io/cache" "^0.2.98-patch.2"
|
||||
"@cerc-io/util" "^0.2.98-patch.2"
|
||||
cross-fetch "^3.1.4"
|
||||
debug "^4.3.1"
|
||||
ethers "^5.4.4"
|
||||
@ -380,10 +380,10 @@
|
||||
lodash "^4.17.21"
|
||||
uint8arrays "^4.0.3"
|
||||
|
||||
"@cerc-io/peer@^0.2.65":
|
||||
version "0.2.74"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fpeer/-/0.2.74/peer-0.2.74.tgz#cc54e513e1857b04630f6b11e9a65dcdcc532790"
|
||||
integrity sha512-l7y19KU0ZJtRkjTrgyzHj+0X8Zu9GO70Eg0AKMFrGmcFfHEfjKGmfWn0gYERNHSy5SGktOJAztAtd/dXARPpnw==
|
||||
"@cerc-io/peer@0.2.98":
|
||||
version "0.2.98"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fpeer/-/0.2.98/peer-0.2.98.tgz#650c771be2a3767456f38c93cb86e6667f2867ec"
|
||||
integrity sha512-b8sCTzFxfTgrlscNutBzML0y4rzkZvzjCpHDEp3P4fMRHIK9SM5o8yYaPS9g1NwoedjbLKCnCDrmaIGpLEbmqA==
|
||||
dependencies:
|
||||
"@cerc-io/libp2p" "^0.42.2-laconic-0.1.4"
|
||||
"@cerc-io/prometheus-metrics" "1.1.4"
|
||||
@ -410,10 +410,10 @@
|
||||
unique-names-generator "^4.7.1"
|
||||
yargs "^17.0.1"
|
||||
|
||||
"@cerc-io/peer@^0.2.98-patch.5":
|
||||
version "0.2.98-patch.5"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fpeer/-/0.2.98-patch.5/peer-0.2.98-patch.5.tgz#fc0407b0f97f6cbe3bdfa13a06ece2b492d5efc7"
|
||||
integrity sha512-/OhHNWlm9FX/44jUqGl4WjAG2GWWjClHvfGTMk/01Us4gVDUT5qgvNn3Tuw/mJLbVPibOFqyCgcbz8oDOJvBng==
|
||||
"@cerc-io/peer@^0.2.65":
|
||||
version "0.2.74"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fpeer/-/0.2.74/peer-0.2.74.tgz#cc54e513e1857b04630f6b11e9a65dcdcc532790"
|
||||
integrity sha512-l7y19KU0ZJtRkjTrgyzHj+0X8Zu9GO70Eg0AKMFrGmcFfHEfjKGmfWn0gYERNHSy5SGktOJAztAtd/dXARPpnw==
|
||||
dependencies:
|
||||
"@cerc-io/libp2p" "^0.42.2-laconic-0.1.4"
|
||||
"@cerc-io/prometheus-metrics" "1.1.4"
|
||||
@ -452,23 +452,23 @@
|
||||
it-stream-types "^1.0.4"
|
||||
promjs "^0.4.2"
|
||||
|
||||
"@cerc-io/rpc-eth-client@^0.2.98-patch.5":
|
||||
version "0.2.98-patch.5"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Frpc-eth-client/-/0.2.98-patch.5/rpc-eth-client-0.2.98-patch.5.tgz#300f7e6fd4c90c720902d3d5e118d558484cf39b"
|
||||
integrity sha512-vhfUk4VpMgkY8pfooOIlHu8I5Cb9fo2bBQP1VwnGm6vj9qngsiUm3QmxDrnCWaytmN1/q/AEP9HsvgHiQDSKHQ==
|
||||
"@cerc-io/rpc-eth-client@^0.2.98-patch.2":
|
||||
version "0.2.98-patch.2"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Frpc-eth-client/-/0.2.98-patch.2/rpc-eth-client-0.2.98-patch.2.tgz#11499c754ec25b0705b102ae5cbf6cd4b81d9c3b"
|
||||
integrity sha512-7VNuWLt82yoBsTk5Nz8LWuCZiqZ6WjsFWIK+9lAnRoHHrt7ojLq7LGTrzRlTFtkqt8DzwvHv5ktDOs2NuZHH8w==
|
||||
dependencies:
|
||||
"@cerc-io/cache" "^0.2.98-patch.5"
|
||||
"@cerc-io/ipld-eth-client" "^0.2.98-patch.5"
|
||||
"@cerc-io/util" "^0.2.98-patch.5"
|
||||
"@cerc-io/cache" "^0.2.98-patch.2"
|
||||
"@cerc-io/ipld-eth-client" "^0.2.98-patch.2"
|
||||
"@cerc-io/util" "^0.2.98-patch.2"
|
||||
chai "^4.3.4"
|
||||
ethers "^5.4.4"
|
||||
left-pad "^1.3.0"
|
||||
mocha "^8.4.0"
|
||||
|
||||
"@cerc-io/solidity-mapper@0.2.98-patch.5", "@cerc-io/solidity-mapper@^0.2.98-patch.5":
|
||||
version "0.2.98-patch.5"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fsolidity-mapper/-/0.2.98-patch.5/solidity-mapper-0.2.98-patch.5.tgz#3266b04f0c7f809dd4f331c2150ebc709f129936"
|
||||
integrity sha512-YHmXvAH41Vz2fUfkPpP7VjElnGGg2QDYSt7p/teXyLMrro95rurfSkZ2K3NfCjLB9mF7LDREaiEW/+her2Xn6A==
|
||||
"@cerc-io/solidity-mapper@0.2.98-patch.2", "@cerc-io/solidity-mapper@^0.2.98-patch.2":
|
||||
version "0.2.98-patch.2"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fsolidity-mapper/-/0.2.98-patch.2/solidity-mapper-0.2.98-patch.2.tgz#6b82c09cc891cc47c56d00705d83039e65a84aee"
|
||||
integrity sha512-sSxLfM+xuDJwGbW2ztho0Xog6XOMe9b7Z+XMOQT/PVpNhBUNiRZ9j5TnPrbKnCC8N132pVApo0FHzgROQYznbg==
|
||||
dependencies:
|
||||
dotenv "^10.0.0"
|
||||
|
||||
@ -477,15 +477,15 @@
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fts-channel/-/1.0.3-ts-nitro-0.1.1/ts-channel-1.0.3-ts-nitro-0.1.1.tgz#0768781313a167295c0bf21307f47e02dc17e936"
|
||||
integrity sha512-2jFICUSyffuZ+8+qRhXuLSJq4GJ6Y02wxiXoubH0Kzv2lIKkJtWICY1ZQQhtXAvP0ncAQB85WJHqtqwH8l7J3Q==
|
||||
|
||||
"@cerc-io/util@0.2.98-patch.5", "@cerc-io/util@^0.2.98-patch.5":
|
||||
version "0.2.98-patch.5"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Futil/-/0.2.98-patch.5/util-0.2.98-patch.5.tgz#3d88ffaed3486f8dff86c1b4abd4af075d9f7389"
|
||||
integrity sha512-fg0i6yD4A1X2dvpRY1FrtaBhhvyXW5m8cn7XNZh/NxcyCEu2nStsH/ND5HHUzffaUAgDPMBkluLESrCn9/5tUQ==
|
||||
"@cerc-io/util@0.2.98-patch.2", "@cerc-io/util@^0.2.98-patch.2":
|
||||
version "0.2.98-patch.2"
|
||||
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Futil/-/0.2.98-patch.2/util-0.2.98-patch.2.tgz#f306d4087b55f87ac16731544a19fe482454eb20"
|
||||
integrity sha512-oYjH7n+2ivf6/chDFRgAuwXeQk2ZW/ZnVWVzHMf9avQIdVLoQF7XU8fpfckKTHbMPek4yV8C+Mb3EmKwREpopQ==
|
||||
dependencies:
|
||||
"@apollo/utils.keyvaluecache" "^1.0.1"
|
||||
"@cerc-io/nitro-node" "^0.1.15"
|
||||
"@cerc-io/peer" "^0.2.98-patch.5"
|
||||
"@cerc-io/solidity-mapper" "^0.2.98-patch.5"
|
||||
"@cerc-io/peer" "0.2.98"
|
||||
"@cerc-io/solidity-mapper" "^0.2.98-patch.2"
|
||||
"@cerc-io/ts-channel" "1.0.3-ts-nitro-0.1.1"
|
||||
"@ethersproject/properties" "^5.7.0"
|
||||
"@ethersproject/providers" "^5.4.4"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user