@sentio/sdk 2.10.0-rc.1 → 2.10.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ export interface YamlContractConfig {
2
+ address: string;
3
+ chain: string;
4
+ name: string;
5
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=yaml-contract-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-contract-config.js","sourceRoot":"","sources":["../../src/core/yaml-contract-config.ts"],"names":[],"mappings":"","sourcesContent":["export interface YamlContractConfig {\n address: string\n chain: string\n name: string\n}\n"]}
@@ -1 +1,2 @@
1
- export declare function codegen(abisDir: string, outDir: string, genExample?: boolean): Promise<void>;
1
+ import { YamlContractConfig } from '../../core/yaml-contract-config.js';
2
+ export declare function codegen(abisDir: string, outDir: string, contractsToGenExample?: YamlContractConfig[]): Promise<void>;
@@ -5,13 +5,13 @@ import EthersSentio from './ethers-sentio.js';
5
5
  import * as prettier from 'prettier';
6
6
  import path from 'path';
7
7
  import mkdirp from 'mkdirp';
8
- export async function codegen(abisDir, outDir, genExample = false) {
8
+ export async function codegen(abisDir, outDir, contractsToGenExample = []) {
9
9
  if (!fs.existsSync(abisDir)) {
10
10
  return;
11
11
  }
12
- console.log('Generated', await codegenInternal(abisDir, outDir, genExample), 'files');
12
+ console.log('Generated', await codegenInternal(abisDir, outDir, contractsToGenExample), 'files');
13
13
  }
14
- async function codegenInternal(abisDir, outDir, genUsage) {
14
+ async function codegenInternal(abisDir, outDir, contractsToGenExample) {
15
15
  let allFiles = fs.readdirSync(abisDir);
16
16
  if (allFiles.length === 0) {
17
17
  return 0;
@@ -34,7 +34,7 @@ async function codegenInternal(abisDir, outDir, genUsage) {
34
34
  outDir: outInternal,
35
35
  allFiles: allFiles,
36
36
  filesToProcess: allFiles,
37
- genUsage: genUsage,
37
+ contractsToGenExample: contractsToGenExample,
38
38
  };
39
39
  const services = {
40
40
  fs,
@@ -1 +1 @@
1
- {"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../../src/eth/codegen/codegen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACnG,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,EAAE,aAAa,EAAY,MAAM,WAAW,CAAA;AACnD,OAAO,YAAoC,MAAM,oBAAoB,CAAA;AACrE,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AACpC,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,MAAc,EAAE,aAAsB,KAAK;IACxF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAM;KACP;IACD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAA;AACvF,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,MAAc,EAAE,QAAiB;IAC/E,IAAI,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IACtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACzB,OAAO,CAAC,CAAA;KACT;IACD,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;IAExD,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IAClC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACzB,OAAO,CAAC,CAAA;KACT;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;QAC/B,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;KAC/C;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAuB;QACjC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,QAAQ;QAClB,cAAc,EAAE,QAAQ;QACxB,QAAQ,EAAE,QAAQ;KACnB,CAAA;IACD,MAAM,QAAQ,GAAa;QACzB,EAAE;QACF,sBAAsB;QACtB,kCAAkC;QAClC,QAAQ;QACR,MAAM,EAAE,MAAM,CAAC,IAAI;KACpB,CAAA;IACD,IAAI,cAAc,GAAG,CAAC,CAAA;IAEtB,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;IAEvC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,CAAA;IAE9E,cAAc,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;IAE3E,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE;QACjC,cAAc,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAA;KAClF;IAED,cAAc,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IAEpE,OAAO,cAAc,CAAA;AACvB,CAAC","sourcesContent":["import { loadFileDescriptions, processOutput, skipEmptyAbis } from 'typechain/dist/typechain/io.js'\nimport * as fs from 'fs'\nimport { DEFAULT_FLAGS, Services } from 'typechain'\nimport EthersSentio, { SentioEthersConfig } from './ethers-sentio.js'\nimport * as prettier from 'prettier'\nimport path from 'path'\nimport mkdirp from 'mkdirp'\n\nexport async function codegen(abisDir: string, outDir: string, genExample: boolean = false) {\n if (!fs.existsSync(abisDir)) {\n return\n }\n console.log('Generated', await codegenInternal(abisDir, outDir, genExample), 'files')\n}\n\nasync function codegenInternal(abisDir: string, outDir: string, genUsage: boolean): Promise<number> {\n let allFiles = fs.readdirSync(abisDir)\n if (allFiles.length === 0) {\n return 0\n }\n allFiles = allFiles.map((f) => path.resolve(abisDir, f))\n\n allFiles = skipEmptyAbis(allFiles)\n if (allFiles.length === 0) {\n return 0\n }\n const outInternal = path.resolve(outDir, 'internal')\n if (!fs.existsSync(outInternal)) {\n fs.mkdirSync(outInternal, { recursive: true })\n }\n\n // skip empty paths\n const config: SentioEthersConfig = {\n cwd: process.cwd(),\n flags: DEFAULT_FLAGS,\n inputDir: abisDir,\n target: '',\n outDir: outInternal,\n allFiles: allFiles,\n filesToProcess: allFiles,\n genUsage: genUsage,\n }\n const services: Services = {\n fs,\n // @ts-ignore for test\n // prettier: { format: (s) => s },\n prettier,\n mkdirp: mkdirp.sync,\n }\n let filesGenerated = 0\n\n const target = new EthersSentio(config)\n\n const fileDescriptions = loadFileDescriptions(services, config.filesToProcess)\n\n filesGenerated += processOutput(services, config, await target.beforeRun())\n\n for (const fd of fileDescriptions) {\n filesGenerated += processOutput(services, config, await target.transformFile(fd))\n }\n\n filesGenerated += processOutput(services, config, target.afterRun())\n\n return filesGenerated\n}\n"]}
1
+ {"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../../src/eth/codegen/codegen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACnG,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,EAAE,aAAa,EAAY,MAAM,WAAW,CAAA;AACnD,OAAO,YAAoC,MAAM,oBAAoB,CAAA;AACrE,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AACpC,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,MAAM,MAAM,QAAQ,CAAA;AAG3B,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,MAAc,EAAE,wBAA8C,EAAE;IAC7G,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAM;KACP;IACD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,qBAAqB,CAAC,EAAE,OAAO,CAAC,CAAA;AAClG,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,OAAe,EACf,MAAc,EACd,qBAA2C;IAE3C,IAAI,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IACtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACzB,OAAO,CAAC,CAAA;KACT;IACD,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;IAExD,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IAClC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACzB,OAAO,CAAC,CAAA;KACT;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;QAC/B,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;KAC/C;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAuB;QACjC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,QAAQ;QAClB,cAAc,EAAE,QAAQ;QACxB,qBAAqB,EAAE,qBAAqB;KAC7C,CAAA;IACD,MAAM,QAAQ,GAAa;QACzB,EAAE;QACF,sBAAsB;QACtB,kCAAkC;QAClC,QAAQ;QACR,MAAM,EAAE,MAAM,CAAC,IAAI;KACpB,CAAA;IACD,IAAI,cAAc,GAAG,CAAC,CAAA;IAEtB,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;IAEvC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,CAAA;IAE9E,cAAc,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;IAE3E,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE;QACjC,cAAc,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAA;KAClF;IAED,cAAc,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IAEpE,OAAO,cAAc,CAAA;AACvB,CAAC","sourcesContent":["import { loadFileDescriptions, processOutput, skipEmptyAbis } from 'typechain/dist/typechain/io.js'\nimport * as fs from 'fs'\nimport { DEFAULT_FLAGS, Services } from 'typechain'\nimport EthersSentio, { SentioEthersConfig } from './ethers-sentio.js'\nimport * as prettier from 'prettier'\nimport path from 'path'\nimport mkdirp from 'mkdirp'\nimport { YamlContractConfig } from '../../core/yaml-contract-config.js'\n\nexport async function codegen(abisDir: string, outDir: string, contractsToGenExample: YamlContractConfig[] = []) {\n if (!fs.existsSync(abisDir)) {\n return\n }\n console.log('Generated', await codegenInternal(abisDir, outDir, contractsToGenExample), 'files')\n}\n\nasync function codegenInternal(\n abisDir: string,\n outDir: string,\n contractsToGenExample: YamlContractConfig[]\n): Promise<number> {\n let allFiles = fs.readdirSync(abisDir)\n if (allFiles.length === 0) {\n return 0\n }\n allFiles = allFiles.map((f) => path.resolve(abisDir, f))\n\n allFiles = skipEmptyAbis(allFiles)\n if (allFiles.length === 0) {\n return 0\n }\n const outInternal = path.resolve(outDir, 'internal')\n if (!fs.existsSync(outInternal)) {\n fs.mkdirSync(outInternal, { recursive: true })\n }\n\n // skip empty paths\n const config: SentioEthersConfig = {\n cwd: process.cwd(),\n flags: DEFAULT_FLAGS,\n inputDir: abisDir,\n target: '',\n outDir: outInternal,\n allFiles: allFiles,\n filesToProcess: allFiles,\n contractsToGenExample: contractsToGenExample,\n }\n const services: Services = {\n fs,\n // @ts-ignore for test\n // prettier: { format: (s) => s },\n prettier,\n mkdirp: mkdirp.sync,\n }\n let filesGenerated = 0\n\n const target = new EthersSentio(config)\n\n const fileDescriptions = loadFileDescriptions(services, config.filesToProcess)\n\n filesGenerated += processOutput(services, config, await target.beforeRun())\n\n for (const fd of fileDescriptions) {\n filesGenerated += processOutput(services, config, await target.transformFile(fd))\n }\n\n filesGenerated += processOutput(services, config, target.afterRun())\n\n return filesGenerated\n}\n"]}
@@ -1,11 +1,12 @@
1
1
  import Ethers from '@sentio/ethers-v6';
2
2
  import { Config, FileDescription } from 'typechain';
3
+ import { YamlContractConfig } from '../../core/yaml-contract-config.js';
3
4
  export interface SentioEthersConfig extends Config {
4
- genUsage?: boolean;
5
+ contractsToGenExample: YamlContractConfig[];
5
6
  }
6
7
  export default class EthersSentio extends Ethers.default {
7
8
  constructor(config: SentioEthersConfig);
8
- private processedContracts;
9
+ private processedABIs;
9
10
  transformAbiOrFullJsonFile(file: FileDescription): FileDescription[] | void;
10
11
  afterRun(): FileDescription[];
11
12
  }
@@ -9,7 +9,7 @@ export default class EthersSentio extends Ethers.default {
9
9
  }
10
10
  super(config);
11
11
  }
12
- processedContracts = [];
12
+ processedABIs = [];
13
13
  // TODO(pc): also have to override transformBinFile, transformFile
14
14
  transformAbiOrFullJsonFile(file) {
15
15
  const abi = extractAbi(file.contents);
@@ -20,7 +20,7 @@ export default class EthersSentio extends Ethers.default {
20
20
  const jsonPath = relative(this.cfg.inputDir, shortenFullJsonFilePath(file.path, this.cfg.allFiles));
21
21
  const contract = parse(abi, jsonPath, documentation);
22
22
  const files = super.transformAbiOrFullJsonFile(file);
23
- this.processedContracts.push(contract);
23
+ this.processedABIs.push(contract);
24
24
  if (files !== undefined) {
25
25
  // files.forEach(this.transformFilePath)
26
26
  // for (const file of files) {
@@ -56,18 +56,43 @@ export default class EthersSentio extends Ethers.default {
56
56
  }
57
57
  }
58
58
  let indexContent = '';
59
- for (const contract of this.processedContracts) {
60
- indexContent =
61
- indexContent +
62
- `
59
+ for (const contract of this.processedABIs) {
60
+ const content = `
63
61
  export * as ${contract.name.toLowerCase().replaceAll('-', '_')} from './${contract.name.toLowerCase()}.js'
64
62
  export { ${contract.name}Processor, ${contract.name}ProcessorTemplate } from './${contract.name.toLowerCase()}.js'
65
63
  `;
64
+ indexContent += content;
66
65
  }
67
66
  files.push({
68
67
  path: join(dirname(files[0].path), '../index.ts'),
69
68
  contents: indexContent,
70
69
  });
70
+ const rootDir = join(dirname(files[0].path), '../../..');
71
+ const contractsToGenExample = this.cfg.contractsToGenExample;
72
+ if (contractsToGenExample.length > 0) {
73
+ const processors = this.processedABIs.map((abi) => `${abi.name}Processor`).join(',');
74
+ let exampleContent = `import { ${processors} } from './types/eth/index.js'`;
75
+ for (const contract of contractsToGenExample) {
76
+ const chainId = parseInt(contract.chain);
77
+ if (isNaN(chainId) || !isFinite(chainId)) {
78
+ continue;
79
+ }
80
+ const content = `
81
+
82
+ ${contract.name}Processor.bind({ address: '${contract.address}', network: ${contract.chain} })
83
+ .onAllEvents((evt, ctx) => {
84
+ ctx.meter.Counter('event_count').add(1, { name: evt.name })
85
+ ctx.eventLogger.emit(evt.name, {
86
+ ...evt.args.toObject(),
87
+ })
88
+ })`;
89
+ exampleContent += content;
90
+ }
91
+ files.push({
92
+ path: join(rootDir, 'processor.eth.example.ts'),
93
+ contents: exampleContent,
94
+ });
95
+ }
71
96
  return files;
72
97
  }
73
98
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ethers-sentio.js","sourceRoot":"","sources":["../../../src/eth/codegen/ethers-sentio.ts"],"names":[],"mappings":"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","sourcesContent":["import Ethers from '@sentio/ethers-v6'\nimport {\n Config,\n extractAbi,\n extractDocumentation,\n FileDescription,\n parse,\n shortenFullJsonFilePath,\n Contract,\n} from 'typechain'\nimport { dirname, join, relative } from 'path'\nimport { codeGenIndex, codeGenSentioFile, codeGenTestUtilsFile } from './file.js'\n\nexport interface SentioEthersConfig extends Config {\n genUsage?: boolean\n}\n\nexport default class EthersSentio extends Ethers.default {\n constructor(config: SentioEthersConfig) {\n if (!config.outDir) {\n throw new Error('Out put path not specificed')\n }\n super(config)\n }\n\n private processedContracts: Contract[] = []\n\n // TODO(pc): also have to override transformBinFile, transformFile\n override transformAbiOrFullJsonFile(file: FileDescription): FileDescription[] | void {\n const abi = extractAbi(file.contents)\n if (abi.length === 0) {\n return\n }\n\n const documentation = extractDocumentation(file.contents)\n\n const jsonPath = relative(this.cfg.inputDir, shortenFullJsonFilePath(file.path, this.cfg.allFiles))\n const contract = parse(abi, jsonPath, documentation)\n const files = super.transformAbiOrFullJsonFile(file)\n this.processedContracts.push(contract)\n\n if (files !== undefined) {\n // files.forEach(this.transformFilePath)\n // for (const file of files) {\n // this.transformFilePath(file)\n // }\n\n return [\n ...files,\n {\n path: join(dirname(files[0].path), `${contract.name.toLowerCase()}-processor.ts`),\n contents: codeGenSentioFile(contract),\n },\n {\n path: join(dirname(files[0].path), '..', `${contract.name.toLowerCase()}.ts`),\n contents: codeGenIndex(contract),\n },\n {\n path: join(dirname(files[0].path), `${contract.name.toLowerCase()}-test-utils.ts`),\n contents: codeGenTestUtilsFile(contract),\n },\n ]\n }\n }\n\n override afterRun() {\n const files = super.afterRun()\n for (const [idx, file] of files.entries()) {\n if (file.path.endsWith('__factory.ts')) {\n file.contents = '// @ts-nocheck\\n' + file.contents\n } else if (file.path.endsWith('factories/index.ts')) {\n file.contents = file.contents.replaceAll(\"__factory'\", \"__factory.js'\")\n } else if (file.path.endsWith('_processor.ts')) {\n }\n }\n let indexContent = ''\n for (const contract of this.processedContracts) {\n indexContent =\n indexContent +\n `\n export * as ${contract.name.toLowerCase().replaceAll('-', '_')} from './${contract.name.toLowerCase()}.js'\n export { ${contract.name}Processor, ${\n contract.name\n }ProcessorTemplate } from './${contract.name.toLowerCase()}.js'\n `\n }\n files.push({\n path: join(dirname(files[0].path), '../index.ts'),\n contents: indexContent,\n })\n return files\n }\n}\n"]}
1
+ {"version":3,"file":"ethers-sentio.js","sourceRoot":"","sources":["../../../src/eth/codegen/ethers-sentio.ts"],"names":[],"mappings":"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","sourcesContent":["import Ethers from '@sentio/ethers-v6'\nimport {\n Config,\n extractAbi,\n extractDocumentation,\n FileDescription,\n parse,\n shortenFullJsonFilePath,\n Contract,\n} from 'typechain'\nimport { dirname, join, relative } from 'path'\nimport { codeGenIndex, codeGenSentioFile, codeGenTestUtilsFile } from './file.js'\nimport { YamlContractConfig } from '../../core/yaml-contract-config.js'\n\nexport interface SentioEthersConfig extends Config {\n contractsToGenExample: YamlContractConfig[]\n}\n\nexport default class EthersSentio extends Ethers.default {\n constructor(config: SentioEthersConfig) {\n if (!config.outDir) {\n throw new Error('Out put path not specificed')\n }\n super(config)\n }\n\n private processedABIs: Contract[] = []\n\n // TODO(pc): also have to override transformBinFile, transformFile\n override transformAbiOrFullJsonFile(file: FileDescription): FileDescription[] | void {\n const abi = extractAbi(file.contents)\n if (abi.length === 0) {\n return\n }\n\n const documentation = extractDocumentation(file.contents)\n\n const jsonPath = relative(this.cfg.inputDir, shortenFullJsonFilePath(file.path, this.cfg.allFiles))\n const contract = parse(abi, jsonPath, documentation)\n const files = super.transformAbiOrFullJsonFile(file)\n this.processedABIs.push(contract)\n\n if (files !== undefined) {\n // files.forEach(this.transformFilePath)\n // for (const file of files) {\n // this.transformFilePath(file)\n // }\n\n return [\n ...files,\n {\n path: join(dirname(files[0].path), `${contract.name.toLowerCase()}-processor.ts`),\n contents: codeGenSentioFile(contract),\n },\n {\n path: join(dirname(files[0].path), '..', `${contract.name.toLowerCase()}.ts`),\n contents: codeGenIndex(contract),\n },\n {\n path: join(dirname(files[0].path), `${contract.name.toLowerCase()}-test-utils.ts`),\n contents: codeGenTestUtilsFile(contract),\n },\n ]\n }\n }\n\n override afterRun() {\n const files = super.afterRun()\n for (const [idx, file] of files.entries()) {\n if (file.path.endsWith('__factory.ts')) {\n file.contents = '// @ts-nocheck\\n' + file.contents\n } else if (file.path.endsWith('factories/index.ts')) {\n file.contents = file.contents.replaceAll(\"__factory'\", \"__factory.js'\")\n } else if (file.path.endsWith('_processor.ts')) {\n }\n }\n let indexContent = ''\n for (const contract of this.processedABIs) {\n const content = `\n export * as ${contract.name.toLowerCase().replaceAll('-', '_')} from './${contract.name.toLowerCase()}.js'\n export { ${contract.name}Processor, ${\n contract.name\n }ProcessorTemplate } from './${contract.name.toLowerCase()}.js'\n `\n indexContent += content\n }\n files.push({\n path: join(dirname(files[0].path), '../index.ts'),\n contents: indexContent,\n })\n\n const rootDir = join(dirname(files[0].path), '../../..')\n\n const contractsToGenExample = (this.cfg as SentioEthersConfig).contractsToGenExample\n if (contractsToGenExample.length > 0) {\n const processors = this.processedABIs.map((abi) => `${abi.name}Processor`).join(',')\n let exampleContent = `import { ${processors} } from './types/eth/index.js'`\n\n for (const contract of contractsToGenExample) {\n const chainId = parseInt(contract.chain)\n if (isNaN(chainId) || !isFinite(chainId)) {\n continue\n }\n\n const content = `\n\n${contract.name}Processor.bind({ address: '${contract.address}', network: ${contract.chain} })\n .onAllEvents((evt, ctx) => {\n ctx.meter.Counter('event_count').add(1, { name: evt.name })\n ctx.eventLogger.emit(evt.name, {\n ...evt.args.toObject(),\n })\n})`\n exampleContent += content\n }\n\n files.push({\n path: join(rootDir, 'processor.eth.example.ts'),\n contents: exampleContent,\n })\n }\n return files\n }\n}\n"]}
@@ -3,7 +3,7 @@ import { codegen } from './index.js';
3
3
  if (process.argv.length > 3) {
4
4
  const abisDir = process.argv[2];
5
5
  const targetDir = process.argv[3];
6
- await codegen(abisDir, targetDir, false);
6
+ await codegen(abisDir, targetDir, []);
7
7
  }
8
8
  else {
9
9
  console.error('Not enough argument');
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/eth/codegen/run.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEpC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjC,MAAM,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;CACzC;KAAM;IACL,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;CAChB","sourcesContent":["#!/usr/bin/env node\n\nimport { codegen } from './index.js'\n\nif (process.argv.length > 3) {\n const abisDir = process.argv[2]\n const targetDir = process.argv[3]\n await codegen(abisDir, targetDir, false)\n} else {\n console.error('Not enough argument')\n process.exit(1)\n}\n"]}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/eth/codegen/run.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEpC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjC,MAAM,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;CACtC;KAAM;IACL,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;CAChB","sourcesContent":["#!/usr/bin/env node\n\nimport { codegen } from './index.js'\n\nif (process.argv.length > 3) {\n const abisDir = process.argv[2]\n const targetDir = process.argv[3]\n await codegen(abisDir, targetDir, [])\n} else {\n console.error('Not enough argument')\n process.exit(1)\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sentio/sdk",
3
3
  "license": "Apache-2.0",
4
- "version": "2.10.0-rc.1",
4
+ "version": "2.10.0-rc.2",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "compile": "tsc && cp src/utils/*.csv lib/utils && cp src/tsup.config.ts lib",
@@ -23,8 +23,8 @@
23
23
  "@project-serum/anchor": "^0.26.0",
24
24
  "@sentio/bigdecimal": "^9.1.1-patch.3",
25
25
  "@sentio/ethers-v6": "^1.0.25",
26
- "@sentio/protos": "^2.10.0-rc.1",
27
- "@sentio/runtime": "^2.10.0-rc.1",
26
+ "@sentio/protos": "^2.10.0-rc.2",
27
+ "@sentio/runtime": "^2.10.0-rc.2",
28
28
  "@solana/web3.js": "^1.73.2",
29
29
  "@types/prettier": "^2.7.2",
30
30
  "aptos-sdk": "npm:aptos@^1.7.1",
@@ -37,7 +37,8 @@
37
37
  "node-fetch": "^3.3.1",
38
38
  "p-queue": "^7.3.4",
39
39
  "prettier": "^2.8.4",
40
- "typechain": "^8.0.0"
40
+ "typechain": "^8.0.0",
41
+ "yaml": "^2.2.1"
41
42
  },
42
43
  "devDependencies": {
43
44
  "@certusone/wormhole-sdk": "^0.9.10",
@@ -80,5 +81,5 @@
80
81
  "engines": {
81
82
  "node": ">=16"
82
83
  },
83
- "gitHead": "489faf4de592bb23b884b8aedf2406f373395a50"
84
+ "gitHead": "6eae0493b0bec4e4022ba0621ad775736fcae8fc"
84
85
  }
@@ -0,0 +1,5 @@
1
+ export interface YamlContractConfig {
2
+ address: string
3
+ chain: string
4
+ name: string
5
+ }
@@ -5,15 +5,20 @@ import EthersSentio, { SentioEthersConfig } from './ethers-sentio.js'
5
5
  import * as prettier from 'prettier'
6
6
  import path from 'path'
7
7
  import mkdirp from 'mkdirp'
8
+ import { YamlContractConfig } from '../../core/yaml-contract-config.js'
8
9
 
9
- export async function codegen(abisDir: string, outDir: string, genExample: boolean = false) {
10
+ export async function codegen(abisDir: string, outDir: string, contractsToGenExample: YamlContractConfig[] = []) {
10
11
  if (!fs.existsSync(abisDir)) {
11
12
  return
12
13
  }
13
- console.log('Generated', await codegenInternal(abisDir, outDir, genExample), 'files')
14
+ console.log('Generated', await codegenInternal(abisDir, outDir, contractsToGenExample), 'files')
14
15
  }
15
16
 
16
- async function codegenInternal(abisDir: string, outDir: string, genUsage: boolean): Promise<number> {
17
+ async function codegenInternal(
18
+ abisDir: string,
19
+ outDir: string,
20
+ contractsToGenExample: YamlContractConfig[]
21
+ ): Promise<number> {
17
22
  let allFiles = fs.readdirSync(abisDir)
18
23
  if (allFiles.length === 0) {
19
24
  return 0
@@ -38,7 +43,7 @@ async function codegenInternal(abisDir: string, outDir: string, genUsage: boolea
38
43
  outDir: outInternal,
39
44
  allFiles: allFiles,
40
45
  filesToProcess: allFiles,
41
- genUsage: genUsage,
46
+ contractsToGenExample: contractsToGenExample,
42
47
  }
43
48
  const services: Services = {
44
49
  fs,
@@ -10,9 +10,10 @@ import {
10
10
  } from 'typechain'
11
11
  import { dirname, join, relative } from 'path'
12
12
  import { codeGenIndex, codeGenSentioFile, codeGenTestUtilsFile } from './file.js'
13
+ import { YamlContractConfig } from '../../core/yaml-contract-config.js'
13
14
 
14
15
  export interface SentioEthersConfig extends Config {
15
- genUsage?: boolean
16
+ contractsToGenExample: YamlContractConfig[]
16
17
  }
17
18
 
18
19
  export default class EthersSentio extends Ethers.default {
@@ -23,7 +24,7 @@ export default class EthersSentio extends Ethers.default {
23
24
  super(config)
24
25
  }
25
26
 
26
- private processedContracts: Contract[] = []
27
+ private processedABIs: Contract[] = []
27
28
 
28
29
  // TODO(pc): also have to override transformBinFile, transformFile
29
30
  override transformAbiOrFullJsonFile(file: FileDescription): FileDescription[] | void {
@@ -37,7 +38,7 @@ export default class EthersSentio extends Ethers.default {
37
38
  const jsonPath = relative(this.cfg.inputDir, shortenFullJsonFilePath(file.path, this.cfg.allFiles))
38
39
  const contract = parse(abi, jsonPath, documentation)
39
40
  const files = super.transformAbiOrFullJsonFile(file)
40
- this.processedContracts.push(contract)
41
+ this.processedABIs.push(contract)
41
42
 
42
43
  if (files !== undefined) {
43
44
  // files.forEach(this.transformFilePath)
@@ -74,20 +75,50 @@ export default class EthersSentio extends Ethers.default {
74
75
  }
75
76
  }
76
77
  let indexContent = ''
77
- for (const contract of this.processedContracts) {
78
- indexContent =
79
- indexContent +
80
- `
78
+ for (const contract of this.processedABIs) {
79
+ const content = `
81
80
  export * as ${contract.name.toLowerCase().replaceAll('-', '_')} from './${contract.name.toLowerCase()}.js'
82
81
  export { ${contract.name}Processor, ${
83
- contract.name
84
- }ProcessorTemplate } from './${contract.name.toLowerCase()}.js'
82
+ contract.name
83
+ }ProcessorTemplate } from './${contract.name.toLowerCase()}.js'
85
84
  `
85
+ indexContent += content
86
86
  }
87
87
  files.push({
88
88
  path: join(dirname(files[0].path), '../index.ts'),
89
89
  contents: indexContent,
90
90
  })
91
+
92
+ const rootDir = join(dirname(files[0].path), '../../..')
93
+
94
+ const contractsToGenExample = (this.cfg as SentioEthersConfig).contractsToGenExample
95
+ if (contractsToGenExample.length > 0) {
96
+ const processors = this.processedABIs.map((abi) => `${abi.name}Processor`).join(',')
97
+ let exampleContent = `import { ${processors} } from './types/eth/index.js'`
98
+
99
+ for (const contract of contractsToGenExample) {
100
+ const chainId = parseInt(contract.chain)
101
+ if (isNaN(chainId) || !isFinite(chainId)) {
102
+ continue
103
+ }
104
+
105
+ const content = `
106
+
107
+ ${contract.name}Processor.bind({ address: '${contract.address}', network: ${contract.chain} })
108
+ .onAllEvents((evt, ctx) => {
109
+ ctx.meter.Counter('event_count').add(1, { name: evt.name })
110
+ ctx.eventLogger.emit(evt.name, {
111
+ ...evt.args.toObject(),
112
+ })
113
+ })`
114
+ exampleContent += content
115
+ }
116
+
117
+ files.push({
118
+ path: join(rootDir, 'processor.eth.example.ts'),
119
+ contents: exampleContent,
120
+ })
121
+ }
91
122
  return files
92
123
  }
93
124
  }
@@ -5,7 +5,7 @@ import { codegen } from './index.js'
5
5
  if (process.argv.length > 3) {
6
6
  const abisDir = process.argv[2]
7
7
  const targetDir = process.argv[3]
8
- await codegen(abisDir, targetDir, false)
8
+ await codegen(abisDir, targetDir, [])
9
9
  } else {
10
10
  console.error('Not enough argument')
11
11
  process.exit(1)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "rootDir": "..",
3
+ "rootDir": "../..",
4
4
  "outDir": "../../../lib"
5
5
  },
6
6
  "extends": "../../../tsconfig.json",