mirror of
https://github.com/cerc-io/watcher-ts
synced 2025-11-30 00:54:10 +00:00
* Generate default derived state for Mapping type variables * Update IPLDBlock in storage methods instead of using a private class variable * Default state flag for indexer storage methods * Helper functions to update state objects * Add checkpoint flag in Contract table and corresponding changes in existing watchers * Update codegen docs * Add examples to generated docs * Turn default state off by default * Make state parameter to indexer storage methods default to none * Add method to get prev. state in indexer
103 lines
3.5 KiB
TypeScript
103 lines
3.5 KiB
TypeScript
//
|
|
// Copyright 2021 Vulcanize, Inc.
|
|
//
|
|
|
|
import assert from 'assert';
|
|
import BigInt from 'apollo-type-bigint';
|
|
import debug from 'debug';
|
|
|
|
import { ValueResult } from '@vulcanize/util';
|
|
|
|
import { Indexer } from './indexer';
|
|
import { EventWatcher } from './events';
|
|
|
|
const log = debug('vulcanize:resolver');
|
|
|
|
export const createResolvers = async (indexer: Indexer, eventWatcher: EventWatcher): Promise<any> => {
|
|
assert(indexer);
|
|
|
|
return {
|
|
BigInt: new BigInt('bigInt'),
|
|
|
|
TokenEvent: {
|
|
__resolveType: (obj: any) => {
|
|
assert(obj.__typename);
|
|
|
|
return obj.__typename;
|
|
}
|
|
},
|
|
|
|
Subscription: {
|
|
onTokenEvent: {
|
|
subscribe: () => eventWatcher.getEventIterator()
|
|
}
|
|
},
|
|
|
|
Mutation: {
|
|
watchToken: async (_: any, { token, checkpoint = false, startingBlock = 1 }: { token: string, checkpoint: boolean, startingBlock: number }): Promise<boolean> => {
|
|
log('watchToken', token, checkpoint, startingBlock);
|
|
await indexer.watchContract(token, checkpoint, startingBlock);
|
|
|
|
return true;
|
|
}
|
|
},
|
|
|
|
Query: {
|
|
|
|
totalSupply: (_: any, { blockHash, token }: { blockHash: string, token: string }): Promise<ValueResult> => {
|
|
log('totalSupply', blockHash, token);
|
|
return indexer.totalSupply(blockHash, token);
|
|
},
|
|
|
|
balanceOf: async (_: any, { blockHash, token, owner }: { blockHash: string, token: string, owner: string }) => {
|
|
log('balanceOf', blockHash, token, owner);
|
|
return indexer.balanceOf(blockHash, token, owner);
|
|
},
|
|
|
|
allowance: async (_: any, { blockHash, token, owner, spender }: { blockHash: string, token: string, owner: string, spender: string }) => {
|
|
log('allowance', blockHash, token, owner, spender);
|
|
return indexer.allowance(blockHash, token, owner, spender);
|
|
},
|
|
|
|
name: (_: any, { blockHash, token }: { blockHash: string, token: string }) => {
|
|
log('name', blockHash, token);
|
|
return indexer.name(blockHash, token);
|
|
},
|
|
|
|
symbol: (_: any, { blockHash, token }: { blockHash: string, token: string }) => {
|
|
log('symbol', blockHash, token);
|
|
return indexer.symbol(blockHash, token);
|
|
},
|
|
|
|
decimals: (_: any, { blockHash, token }: { blockHash: string, token: string }) => {
|
|
log('decimals', blockHash, token);
|
|
return indexer.decimals(blockHash, token);
|
|
},
|
|
|
|
events: async (_: any, { blockHash, token, name }: { blockHash: string, token: string, name: string }) => {
|
|
log('events', blockHash, token, name || '');
|
|
|
|
const block = await indexer.getBlockProgress(blockHash);
|
|
if (!block || !block.isComplete) {
|
|
throw new Error(`Block hash ${blockHash} number ${block?.blockNumber} not processed yet`);
|
|
}
|
|
|
|
const events = await indexer.getEventsByFilter(blockHash, token, name);
|
|
return events.map(event => indexer.getResultEvent(event));
|
|
},
|
|
|
|
eventsInRange: async (_: any, { fromBlockNumber, toBlockNumber }: { fromBlockNumber: number, toBlockNumber: number }) => {
|
|
log('eventsInRange', fromBlockNumber, toBlockNumber);
|
|
|
|
const { expected, actual } = await indexer.getProcessedBlockCountForRange(fromBlockNumber, toBlockNumber);
|
|
if (expected !== actual) {
|
|
throw new Error(`Range not available, expected ${expected}, got ${actual} blocks in range`);
|
|
}
|
|
|
|
const events = await indexer.getEventsInRange(fromBlockNumber, toBlockNumber);
|
|
return events.map(event => indexer.getResultEvent(event));
|
|
}
|
|
}
|
|
};
|
|
};
|