mirror of
https://github.com/cerc-io/watcher-ts
synced 2025-02-02 08:12:49 +00:00
Implement data source and crypto host APIs (#104)
* Implement data source host APIs * Implement crypto host API
This commit is contained in:
parent
8b913af93f
commit
6a2c99a0bb
57
packages/graph-node/src/crypto.test.ts
Normal file
57
packages/graph-node/src/crypto.test.ts
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
//
|
||||||
|
// Copyright 2021 Vulcanize, Inc.
|
||||||
|
//
|
||||||
|
|
||||||
|
import path from 'path';
|
||||||
|
import { expect } from 'chai';
|
||||||
|
import { utils } from 'ethers';
|
||||||
|
|
||||||
|
import { BaseProvider } from '@ethersproject/providers';
|
||||||
|
|
||||||
|
import { instantiate } from './loader';
|
||||||
|
import { getTestDatabase, getTestIndexer, getTestProvider } from '../test/utils';
|
||||||
|
import { Database } from './database';
|
||||||
|
import { Indexer } from '../test/utils/indexer';
|
||||||
|
|
||||||
|
describe('crypto host api', () => {
|
||||||
|
let exports: any;
|
||||||
|
let db: Database;
|
||||||
|
let indexer: Indexer;
|
||||||
|
let provider: BaseProvider;
|
||||||
|
|
||||||
|
before(async () => {
|
||||||
|
db = getTestDatabase();
|
||||||
|
indexer = getTestIndexer();
|
||||||
|
provider = getTestProvider();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should load the subgraph example wasm', async () => {
|
||||||
|
const filePath = path.resolve(__dirname, '../test/subgraph/example1/build/Example1/Example1.wasm');
|
||||||
|
const instance = await instantiate(
|
||||||
|
db,
|
||||||
|
indexer,
|
||||||
|
provider,
|
||||||
|
{},
|
||||||
|
filePath
|
||||||
|
);
|
||||||
|
exports = instance.exports;
|
||||||
|
const { _start } = exports;
|
||||||
|
|
||||||
|
// Important to call _start for built subgraphs on instantiation!
|
||||||
|
// TODO: Check api version https://github.com/graphprotocol/graph-node/blob/6098daa8955bdfac597cec87080af5449807e874/runtime/wasm/src/module/mod.rs#L533
|
||||||
|
_start();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return keccak256 hash', async () => {
|
||||||
|
const { testCrypto, __getString, __newString } = exports;
|
||||||
|
|
||||||
|
const hexString = '0x1234';
|
||||||
|
const hexStringPtr = await __newString(hexString);
|
||||||
|
const keccak256Ptr = await testCrypto(hexStringPtr);
|
||||||
|
const keccak256 = __getString(keccak256Ptr);
|
||||||
|
|
||||||
|
expect(keccak256)
|
||||||
|
.to
|
||||||
|
.equal(utils.keccak256(hexString));
|
||||||
|
});
|
||||||
|
});
|
@ -76,7 +76,8 @@ describe('eden wasm loader tests', async () => {
|
|||||||
EdenNetwork: edenNetworkAbi
|
EdenNetwork: edenNetworkAbi
|
||||||
},
|
},
|
||||||
dataSource: {
|
dataSource: {
|
||||||
address: contractAddress
|
address: contractAddress,
|
||||||
|
network: 'mainnet'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -192,7 +193,8 @@ describe('eden wasm loader tests', async () => {
|
|||||||
Distribution: merkleDistributorAbi
|
Distribution: merkleDistributorAbi
|
||||||
},
|
},
|
||||||
dataSource: {
|
dataSource: {
|
||||||
address: contractAddress
|
address: contractAddress,
|
||||||
|
network: 'mainnet'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -304,7 +306,8 @@ describe('eden wasm loader tests', async () => {
|
|||||||
Governance: distributorGovernanceAbi
|
Governance: distributorGovernanceAbi
|
||||||
},
|
},
|
||||||
dataSource: {
|
dataSource: {
|
||||||
address: contractAddress
|
address: contractAddress,
|
||||||
|
network: 'mainnet'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -28,7 +28,8 @@ describe('eth-call wasm tests', () => {
|
|||||||
Example1: exampleAbi
|
Example1: exampleAbi
|
||||||
},
|
},
|
||||||
dataSource: {
|
dataSource: {
|
||||||
address: contractAddress
|
address: contractAddress,
|
||||||
|
network: 'mainnet'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -38,7 +38,8 @@ type idOfType = (TypeId: number) => number
|
|||||||
export interface GraphData {
|
export interface GraphData {
|
||||||
abis?: {[key: string]: ContractInterface};
|
abis?: {[key: string]: ContractInterface};
|
||||||
dataSource?: {
|
dataSource?: {
|
||||||
address: string
|
address: string,
|
||||||
|
network: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,6 +115,16 @@ export const instantiate = async (
|
|||||||
log('log %s | %s', Level[level], __getString(msg));
|
log('log %s | %s', Level[level], __getString(msg));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'crypto.keccak256': async (input: number) => {
|
||||||
|
const byteArray = await ByteArray.wrap(input);
|
||||||
|
const hexStringPtr = await byteArray.toHexString();
|
||||||
|
const hexString = __getString(hexStringPtr);
|
||||||
|
const keccak256 = utils.keccak256(hexString);
|
||||||
|
const keccak256Ptr = await __newString(keccak256);
|
||||||
|
|
||||||
|
return ByteArray.fromHexString(keccak256Ptr);
|
||||||
|
},
|
||||||
|
|
||||||
'test.asyncMethod': async () => {
|
'test.asyncMethod': async () => {
|
||||||
console.log('before timer start');
|
console.log('before timer start');
|
||||||
await new Promise(resolve => {
|
await new Promise(resolve => {
|
||||||
@ -599,6 +610,16 @@ export const instantiate = async (
|
|||||||
assert(dataSource);
|
assert(dataSource);
|
||||||
const addressStringPtr = await __newString(dataSource.address);
|
const addressStringPtr = await __newString(dataSource.address);
|
||||||
return Address.fromString(addressStringPtr);
|
return Address.fromString(addressStringPtr);
|
||||||
|
},
|
||||||
|
'dataSource.context': async () => {
|
||||||
|
// TODO: Implement use in data source templates.
|
||||||
|
// https://thegraph.com/docs/en/developer/create-subgraph-hosted/#data-source-context
|
||||||
|
|
||||||
|
return Entity.__new();
|
||||||
|
},
|
||||||
|
'dataSource.network': async () => {
|
||||||
|
assert(dataSource);
|
||||||
|
return __newString(dataSource.network);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -36,7 +36,7 @@ export class GraphWatcher {
|
|||||||
_dataSourceMap: { [key: string]: DataSource } = {};
|
_dataSourceMap: { [key: string]: DataSource } = {};
|
||||||
_transactionsMap: Map<string, Transaction> = new Map()
|
_transactionsMap: Map<string, Transaction> = new Map()
|
||||||
|
|
||||||
_context: Context = {}
|
_context: Context = {};
|
||||||
|
|
||||||
constructor (database: Database, postgraphileClient: EthClient, ethProvider: providers.BaseProvider, serverConfig: ServerConfig) {
|
constructor (database: Database, postgraphileClient: EthClient, ethProvider: providers.BaseProvider, serverConfig: ServerConfig) {
|
||||||
this._database = database;
|
this._database = database;
|
||||||
@ -52,7 +52,7 @@ export class GraphWatcher {
|
|||||||
|
|
||||||
// Create wasm instance and contract interface for each dataSource in subgraph yaml.
|
// Create wasm instance and contract interface for each dataSource in subgraph yaml.
|
||||||
const dataPromises = this._dataSources.map(async (dataSource: any) => {
|
const dataPromises = this._dataSources.map(async (dataSource: any) => {
|
||||||
const { source: { address, abi }, mapping } = dataSource;
|
const { source: { address, abi }, mapping, network } = dataSource;
|
||||||
const { abis, file } = mapping;
|
const { abis, file } = mapping;
|
||||||
|
|
||||||
const abisMap = abis.reduce((acc: {[key: string]: ContractInterface}, abi: any) => {
|
const abisMap = abis.reduce((acc: {[key: string]: ContractInterface}, abi: any) => {
|
||||||
@ -68,7 +68,8 @@ export class GraphWatcher {
|
|||||||
const data = {
|
const data = {
|
||||||
abis: abisMap,
|
abis: abisMap,
|
||||||
dataSource: {
|
dataSource: {
|
||||||
address
|
address,
|
||||||
|
network
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { Address, log, BigInt, BigDecimal, ByteArray, dataSource, ethereum, Bytes } from '@graphprotocol/graph-ts';
|
import { Address, log, BigInt, BigDecimal, ByteArray, dataSource, ethereum, Bytes, crypto } from '@graphprotocol/graph-ts';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
Example1,
|
Example1,
|
||||||
@ -14,6 +14,9 @@ export function handleTest (event: Test): void {
|
|||||||
log.debug('event.block.hash: {}', [event.block.hash.toHexString()]);
|
log.debug('event.block.hash: {}', [event.block.hash.toHexString()]);
|
||||||
log.debug('event.block.stateRoot: {}', [event.block.stateRoot.toHexString()]);
|
log.debug('event.block.stateRoot: {}', [event.block.stateRoot.toHexString()]);
|
||||||
|
|
||||||
|
log.debug('dataSource.network: {}', [dataSource.network()]);
|
||||||
|
log.debug('dataSource.context: {}', [dataSource.context().entries.length.toString()]);
|
||||||
|
|
||||||
// Entities can be loaded from the store using a string ID; this ID
|
// Entities can be loaded from the store using a string ID; this ID
|
||||||
// needs to be unique across all entities of the same type
|
// needs to be unique across all entities of the same type
|
||||||
let author = Author.load(event.transaction.from.toHex());
|
let author = Author.load(event.transaction.from.toHex());
|
||||||
@ -504,3 +507,12 @@ export function testEthereumDecode (encoded: string): string[] {
|
|||||||
decodedBool.toString()
|
decodedBool.toString()
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function testCrypto (hexString: string): string {
|
||||||
|
const byteArray = ByteArray.fromHexString(hexString);
|
||||||
|
const keccak256 = crypto.keccak256(byteArray);
|
||||||
|
const keccak256String = keccak256.toHex();
|
||||||
|
log.debug('keccak256 string: {}', [keccak256String]);
|
||||||
|
|
||||||
|
return keccak256String;
|
||||||
|
}
|
||||||
|
@ -61,7 +61,8 @@ export const getDummyEventData = async (): Promise<EventData> => {
|
|||||||
export const getDummyGraphData = (): any => {
|
export const getDummyGraphData = (): any => {
|
||||||
return {
|
return {
|
||||||
dataSource: {
|
dataSource: {
|
||||||
address: ZERO_ADDRESS
|
address: ZERO_ADDRESS,
|
||||||
|
network: 'mainnet'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user