@sentio/cli 2.6.0-rc.3 → 2.6.1-rc.1

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.
package/lib/abi.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export declare const ETH_API_URL_MAP: Record<string, string>;
1
2
  export declare function getABI(chain: string, address: string, name: string | undefined): Promise<{
2
3
  name?: string;
3
4
  abi: object | string;
package/lib/abi.js CHANGED
@@ -5,8 +5,15 @@ import chalk from 'chalk';
5
5
  import process from 'process';
6
6
  import path from 'path';
7
7
  import fs from 'fs-extra';
8
- // @ts-ignore no types
9
- import { init } from 'etherscan-api';
8
+ import fetch from 'node-fetch';
9
+ export const ETH_API_URL_MAP = {};
10
+ ETH_API_URL_MAP[CHAIN_IDS.ETHEREUM] = 'https://api.etherscan.io';
11
+ ETH_API_URL_MAP[CHAIN_IDS.RINKEBY] = 'https://api-rinkeby.etherscan.io';
12
+ ETH_API_URL_MAP[CHAIN_IDS.ROPSTEN] = 'https://api-ropsten.etherscan.io';
13
+ ETH_API_URL_MAP[CHAIN_IDS.GOERLI] = 'https://api-goerli.etherscan.io';
14
+ ETH_API_URL_MAP[CHAIN_IDS.SEPOLIA] = 'https://api-sepolia.etherscan.io';
15
+ ETH_API_URL_MAP[CHAIN_IDS.ARBITRUM] = 'https://api.arbiscan.io';
16
+ ETH_API_URL_MAP[CHAIN_IDS.AVALANCHE] = 'https://api.snowtrace.io';
10
17
  export async function getABI(chain, address, name) {
11
18
  let ethApi;
12
19
  let aptosClient;
@@ -25,36 +32,12 @@ export async function getABI(chain, address, name) {
25
32
  case CHAIN_IDS.SUI_TESTNET:
26
33
  suiClient = new JsonRpcProvider(new Connection({ fullnode: 'https://fullnode.testnet.sui.io/' }));
27
34
  break;
28
- case CHAIN_IDS.ETHEREUM:
29
- ethApi = init();
30
- break;
31
- // case CHAIN_IDS.ROPSTEN:
32
- // ethApi = init(undefined, "ropsten")
33
- // break
34
- // case CHAIN_IDS.RINKEBY:
35
- // ethApi = init(undefined, "rinkeby")
36
- // break
37
- case CHAIN_IDS.GOERLI:
38
- ethApi = init(undefined, 'goerli');
39
- break;
40
- // case CHAIN_IDS.SEPOLIA:
41
- // ethApi = init(undefined, "sepolia")
42
- // break
43
- case CHAIN_IDS.ARBITRUM:
44
- ethApi = init(undefined, 'arbitrum');
45
- break;
46
- case CHAIN_IDS.ARBITRUM_GOERLI:
47
- ethApi = init(undefined, 'arbitrum_rinkeby');
48
- break;
49
- case CHAIN_IDS.AVALANCHE:
50
- ethApi = init(undefined, 'avalanche');
51
- break;
52
- // case CHAIN_IDS.KOVAN:
53
- // ethApi = init(undefined, "kovan")
54
- // break
55
35
  default:
56
- console.error(chalk.red(`chain ${chain} not supported for direct add, please download the ABI manually`));
57
- process.exit(1);
36
+ ethApi = ETH_API_URL_MAP[chain];
37
+ if (!ethApi) {
38
+ console.error(chalk.red(`chain ${chain} not supported for direct add, please download the ABI manually`));
39
+ process.exit(1);
40
+ }
58
41
  }
59
42
  const baseErrMsg = chalk.red(`Failed to automatic download contract ${address} from ${chain}, please manually download abi and put it into abis/eth directory`);
60
43
  if (aptosClient) {
@@ -80,14 +63,14 @@ export async function getABI(chain, address, name) {
80
63
  }
81
64
  }
82
65
  try {
83
- let resp = await ethApi.contract.getabi(address);
66
+ let resp = (await (await fetch(`${ethApi}/api?module=contract&action=getabi&address=${address}`)).json());
84
67
  if (resp.status !== '1') {
85
68
  throw Error(resp.message);
86
69
  }
87
70
  const abi = resp.result;
88
71
  if (!name) {
89
- await new Promise((resolve) => setTimeout(resolve, 1000));
90
- resp = await ethApi.contract.getsourcecode(address);
72
+ await new Promise((resolve) => setTimeout(resolve, 5000));
73
+ resp = (await (await fetch(`${ethApi}/api?module=contract&action=getsourcecode&address=${address}`)).json());
91
74
  if (resp.status !== '1') {
92
75
  throw Error(resp.message);
93
76
  }
package/lib/abi.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"abi.js","sourceRoot":"","sources":["../src/abi.ts"],"names":[],"mappings":"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","sourcesContent":["import { AptosClient } from 'aptos-sdk'\nimport { JsonRpcProvider, Connection } from '@mysten/sui.js'\nimport { CHAIN_IDS } from './chain.js'\nimport chalk from 'chalk'\nimport process from 'process'\nimport path from 'path'\nimport fs from 'fs-extra'\n// @ts-ignore no types\nimport { init } from 'etherscan-api'\n\nexport async function getABI(\n chain: string,\n address: string,\n name: string | undefined\n): Promise<{ name?: string; abi: object | string }> {\n let ethApi\n let aptosClient: AptosClient | undefined\n let suiClient: JsonRpcProvider | undefined\n\n switch (chain) {\n case CHAIN_IDS.APTOS_MAINNET:\n aptosClient = new AptosClient('https://mainnet.aptoslabs.com/')\n break\n case CHAIN_IDS.APTOS_TESTNET:\n aptosClient = new AptosClient('https://testnet.aptoslabs.com/')\n break\n case CHAIN_IDS.SUI_MAINNET:\n throw Error('SUI mainnet is not support yet, try sui/testnet')\n // suiClient = new JsonRpcProvider('https://fullnode.mainnet.sui.io/')\n // break\n case CHAIN_IDS.SUI_TESTNET:\n suiClient = new JsonRpcProvider(new Connection({ fullnode: 'https://fullnode.testnet.sui.io/' }))\n break\n case CHAIN_IDS.ETHEREUM:\n ethApi = init()\n break\n // case CHAIN_IDS.ROPSTEN:\n // ethApi = init(undefined, \"ropsten\")\n // break\n // case CHAIN_IDS.RINKEBY:\n // ethApi = init(undefined, \"rinkeby\")\n // break\n case CHAIN_IDS.GOERLI:\n ethApi = init(undefined, 'goerli')\n break\n // case CHAIN_IDS.SEPOLIA:\n // ethApi = init(undefined, \"sepolia\")\n // break\n\n case CHAIN_IDS.ARBITRUM:\n ethApi = init(undefined, 'arbitrum')\n break\n case CHAIN_IDS.ARBITRUM_GOERLI:\n ethApi = init(undefined, 'arbitrum_rinkeby')\n break\n case CHAIN_IDS.AVALANCHE:\n ethApi = init(undefined, 'avalanche')\n break\n // case CHAIN_IDS.KOVAN:\n // ethApi = init(undefined, \"kovan\")\n // break\n default:\n console.error(chalk.red(`chain ${chain} not supported for direct add, please download the ABI manually`))\n process.exit(1)\n }\n\n const baseErrMsg = chalk.red(\n `Failed to automatic download contract ${address} from ${chain}, please manually download abi and put it into abis/eth directory`\n )\n\n if (aptosClient) {\n try {\n return {\n abi: await aptosClient.getAccountModules(address),\n }\n } catch (e) {\n console.error(baseErrMsg, e)\n process.exit(1)\n }\n }\n if (suiClient) {\n try {\n return {\n abi: await suiClient.getNormalizedMoveModulesByPackage({ package: address }),\n }\n } catch (e) {\n console.error(baseErrMsg, e)\n process.exit(1)\n }\n }\n\n try {\n let resp = await ethApi.contract.getabi(address)\n if (resp.status !== '1') {\n throw Error(resp.message)\n }\n const abi = resp.result\n\n if (!name) {\n await new Promise((resolve) => setTimeout(resolve, 1000))\n resp = await ethApi.contract.getsourcecode(address)\n if (resp.status !== '1') {\n throw Error(resp.message)\n }\n const contractName = resp.result[0].ContractName\n if (contractName) {\n name = contractName\n }\n }\n return {\n name,\n abi,\n }\n } catch (e) {\n console.error(baseErrMsg, e)\n process.exit(1)\n }\n}\n\nexport function getABIFilePath(chain: string, name: string): string {\n let subpath\n switch (chain) {\n case CHAIN_IDS.APTOS_MAINNET:\n subpath = 'aptos'\n break\n case CHAIN_IDS.APTOS_TESTNET:\n subpath = 'aptos/testnet'\n break\n case CHAIN_IDS.SUI_MAINNET:\n subpath = 'sui'\n break\n case CHAIN_IDS.SUI_TESTNET:\n subpath = 'sui/testnet'\n break\n default:\n subpath = 'eth'\n }\n\n return path.join('abis', subpath, name + '.json')\n}\n\nexport function writeABIFile(obj: string | object, output: string) {\n if (typeof obj === 'string') {\n obj = JSON.parse(obj)\n }\n const data = JSON.stringify(obj, null, 2)\n fs.mkdirSync(path.dirname(output), { recursive: true })\n fs.writeFileSync(output, data)\n console.log(chalk.green('ABI has been downloaded to', output))\n}\n"]}
1
+ {"version":3,"file":"abi.js","sourceRoot":"","sources":["../src/abi.ts"],"names":[],"mappings":"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","sourcesContent":["import { AptosClient } from 'aptos-sdk'\nimport { JsonRpcProvider, Connection } from '@mysten/sui.js'\nimport { CHAIN_IDS } from './chain.js'\nimport chalk from 'chalk'\nimport process from 'process'\nimport path from 'path'\nimport fs from 'fs-extra'\nimport fetch from 'node-fetch'\n\nexport const ETH_API_URL_MAP: Record<string, string> = {}\n\nETH_API_URL_MAP[CHAIN_IDS.ETHEREUM] = 'https://api.etherscan.io'\nETH_API_URL_MAP[CHAIN_IDS.RINKEBY] = 'https://api-rinkeby.etherscan.io'\nETH_API_URL_MAP[CHAIN_IDS.ROPSTEN] = 'https://api-ropsten.etherscan.io'\nETH_API_URL_MAP[CHAIN_IDS.GOERLI] = 'https://api-goerli.etherscan.io'\nETH_API_URL_MAP[CHAIN_IDS.SEPOLIA] = 'https://api-sepolia.etherscan.io'\nETH_API_URL_MAP[CHAIN_IDS.ARBITRUM] = 'https://api.arbiscan.io'\nETH_API_URL_MAP[CHAIN_IDS.AVALANCHE] = 'https://api.snowtrace.io'\n\nexport async function getABI(\n chain: string,\n address: string,\n name: string | undefined\n): Promise<{ name?: string; abi: object | string }> {\n let ethApi\n let aptosClient: AptosClient | undefined\n let suiClient: JsonRpcProvider | undefined\n\n switch (chain) {\n case CHAIN_IDS.APTOS_MAINNET:\n aptosClient = new AptosClient('https://mainnet.aptoslabs.com/')\n break\n case CHAIN_IDS.APTOS_TESTNET:\n aptosClient = new AptosClient('https://testnet.aptoslabs.com/')\n break\n case CHAIN_IDS.SUI_MAINNET:\n throw Error('SUI mainnet is not support yet, try sui/testnet')\n // suiClient = new JsonRpcProvider('https://fullnode.mainnet.sui.io/')\n // break\n case CHAIN_IDS.SUI_TESTNET:\n suiClient = new JsonRpcProvider(new Connection({ fullnode: 'https://fullnode.testnet.sui.io/' }))\n break\n default:\n ethApi = ETH_API_URL_MAP[chain]\n if (!ethApi) {\n console.error(chalk.red(`chain ${chain} not supported for direct add, please download the ABI manually`))\n process.exit(1)\n }\n }\n\n const baseErrMsg = chalk.red(\n `Failed to automatic download contract ${address} from ${chain}, please manually download abi and put it into abis/eth directory`\n )\n\n if (aptosClient) {\n try {\n return {\n abi: await aptosClient.getAccountModules(address),\n }\n } catch (e) {\n console.error(baseErrMsg, e)\n process.exit(1)\n }\n }\n if (suiClient) {\n try {\n return {\n abi: await suiClient.getNormalizedMoveModulesByPackage({ package: address }),\n }\n } catch (e) {\n console.error(baseErrMsg, e)\n process.exit(1)\n }\n }\n\n try {\n let resp = (await (await fetch(`${ethApi}/api?module=contract&action=getabi&address=${address}`)).json()) as any\n if (resp.status !== '1') {\n throw Error(resp.message)\n }\n const abi = resp.result\n\n if (!name) {\n await new Promise((resolve) => setTimeout(resolve, 5000))\n resp = (await (\n await fetch(`${ethApi}/api?module=contract&action=getsourcecode&address=${address}`)\n ).json()) as any\n if (resp.status !== '1') {\n throw Error(resp.message)\n }\n const contractName = resp.result[0].ContractName\n if (contractName) {\n name = contractName\n }\n }\n return {\n name,\n abi,\n }\n } catch (e) {\n console.error(baseErrMsg, e)\n process.exit(1)\n }\n}\n\nexport function getABIFilePath(chain: string, name: string): string {\n let subpath\n switch (chain) {\n case CHAIN_IDS.APTOS_MAINNET:\n subpath = 'aptos'\n break\n case CHAIN_IDS.APTOS_TESTNET:\n subpath = 'aptos/testnet'\n break\n case CHAIN_IDS.SUI_MAINNET:\n subpath = 'sui'\n break\n case CHAIN_IDS.SUI_TESTNET:\n subpath = 'sui/testnet'\n break\n default:\n subpath = 'eth'\n }\n\n return path.join('abis', subpath, name + '.json')\n}\n\nexport function writeABIFile(obj: string | object, output: string) {\n if (typeof obj === 'string') {\n obj = JSON.parse(obj)\n }\n const data = JSON.stringify(obj, null, 2)\n fs.mkdirSync(path.dirname(output), { recursive: true })\n fs.writeFileSync(output, data)\n console.log(chalk.green('ABI has been downloaded to', output))\n}\n"]}
@@ -5,8 +5,15 @@ import chalk from 'chalk';
5
5
  import { codegen } from './build.js';
6
6
  import * as process from 'process';
7
7
  import yaml from 'yaml';
8
- import { getABIFilePath, getABI, writeABIFile } from '../abi.js';
8
+ import { getABIFilePath, getABI, writeABIFile, ETH_API_URL_MAP } from '../abi.js';
9
+ import { CHAIN_IDS, getChainName } from '../chain.js';
9
10
  export async function runAdd(argv) {
11
+ const supportedChain = [CHAIN_IDS.APTOS_MAINNET, CHAIN_IDS.APTOS_TESTNET, CHAIN_IDS.SUI_TESTNET];
12
+ supportedChain.push(...Object.keys(ETH_API_URL_MAP));
13
+ const supprtedChainMessage = [
14
+ '',
15
+ ...supportedChain.map((chainId, idx) => ` ${getChainName(chainId)}:\t${chainId}${idx === supportedChain.length - 1 ? '' : '\n'}`),
16
+ ];
10
17
  const optionDefinitions = [
11
18
  {
12
19
  name: 'help',
@@ -19,7 +26,7 @@ export async function runAdd(argv) {
19
26
  alias: 'c',
20
27
  type: String,
21
28
  defaultValue: '1',
22
- description: 'Chain id define from here: https://raw.githubusercontent.com/sentioxyz/sentio-sdk/main/packages/sdk/src/core/chain.ts notice some chain may not support this command',
29
+ description: 'Chain id, current support (chain name: id)s are:\n' + supprtedChainMessage,
23
30
  },
24
31
  {
25
32
  name: 'address',
@@ -1 +1 @@
1
- {"version":3,"file":"run-add.js","sourceRoot":"","sources":["../../src/commands/run-add.ts"],"names":[],"mappings":"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","sourcesContent":["import commandLineArgs from 'command-line-args'\nimport commandLineUsage from 'command-line-usage'\nimport fs from 'fs-extra'\nimport chalk from 'chalk'\n\nimport { codegen } from './build.js'\n\nimport * as process from 'process'\nimport yaml from 'yaml'\nimport { getABIFilePath, getABI, writeABIFile } from '../abi.js'\n\nexport async function runAdd(argv: string[]) {\n const optionDefinitions = [\n {\n name: 'help',\n alias: 'h',\n type: Boolean,\n description: 'Display this usage guide.',\n },\n {\n name: 'chain',\n alias: 'c',\n type: String,\n defaultValue: '1',\n description:\n 'Chain id define from here: https://raw.githubusercontent.com/sentioxyz/sentio-sdk/main/packages/sdk/src/core/chain.ts notice some chain may not support this command',\n },\n {\n name: 'address',\n defaultOption: true,\n description: 'Address of the contract',\n type: String,\n },\n {\n name: 'name',\n alias: 'n',\n description: 'File name for the downloaded contract, if empty, use address as file name',\n type: String,\n },\n ]\n\n const options = commandLineArgs(optionDefinitions, { argv, partial: true })\n const usage = commandLineUsage([\n {\n header: \"Add contract's ABI to the project\",\n content: 'sentio add [--chain <chain> --name <name>] <address>',\n },\n {\n header: 'Options',\n optionList: optionDefinitions,\n },\n ])\n\n if (options.help || !options.address) {\n console.log(usage)\n } else {\n const chain: string = options['chain'].toLowerCase()\n const address: string = options.address\n if (!address.startsWith('0x')) {\n console.error(chalk.red('Address must start with 0x'))\n console.log(usage)\n process.exit(1)\n }\n\n const abiRes = await getABI(chain, address, options.name)\n const filename = abiRes.name || address\n\n writeABIFile(abiRes.abi, getABIFilePath(chain, filename))\n\n // Write contract info to sentio.yaml\n const yamlDocument: yaml.Document = yaml.parseDocument(fs.readFileSync('sentio.yaml', 'utf8'))\n let contracts = yamlDocument.get('contracts') as yaml.YAMLSeq\n if (!contracts) {\n contracts = new yaml.YAMLSeq()\n yamlDocument.set('contracts', contracts)\n }\n\n let hasContract = false\n for (const item of contracts.items as yaml.YAMLMap[]) {\n if (item.get('chain') === chain && item.get('address') === address) {\n hasContract = true\n }\n }\n\n if (!hasContract) {\n const newContract = new yaml.YAMLMap()\n newContract.set('chain', chain)\n newContract.set('address', address)\n if (address !== filename) {\n newContract.set('name', filename)\n }\n contracts.add(newContract)\n fs.writeFileSync('sentio.yaml', yamlDocument.toString(), 'utf8')\n }\n\n // Run gen\n await codegen(false)\n }\n}\n"]}
1
+ {"version":3,"file":"run-add.js","sourceRoot":"","sources":["../../src/commands/run-add.ts"],"names":[],"mappings":"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","sourcesContent":["import commandLineArgs from 'command-line-args'\nimport commandLineUsage from 'command-line-usage'\nimport fs from 'fs-extra'\nimport chalk from 'chalk'\n\nimport { codegen } from './build.js'\n\nimport * as process from 'process'\nimport yaml from 'yaml'\nimport { getABIFilePath, getABI, writeABIFile, ETH_API_URL_MAP } from '../abi.js'\nimport { CHAIN_IDS, getChainName } from '../chain.js'\n\nexport async function runAdd(argv: string[]) {\n const supportedChain: string[] = [CHAIN_IDS.APTOS_MAINNET, CHAIN_IDS.APTOS_TESTNET, CHAIN_IDS.SUI_TESTNET]\n supportedChain.push(...Object.keys(ETH_API_URL_MAP))\n const supprtedChainMessage = [\n '',\n ...supportedChain.map(\n (chainId, idx) => ` ${getChainName(chainId)}:\\t${chainId}${idx === supportedChain.length - 1 ? '' : '\\n'}`\n ),\n ]\n\n const optionDefinitions = [\n {\n name: 'help',\n alias: 'h',\n type: Boolean,\n description: 'Display this usage guide.',\n },\n {\n name: 'chain',\n alias: 'c',\n type: String,\n defaultValue: '1',\n description: 'Chain id, current support (chain name: id)s are:\\n' + supprtedChainMessage,\n },\n {\n name: 'address',\n defaultOption: true,\n description: 'Address of the contract',\n type: String,\n },\n {\n name: 'name',\n alias: 'n',\n description: 'File name for the downloaded contract, if empty, use address as file name',\n type: String,\n },\n ]\n\n const options = commandLineArgs(optionDefinitions, { argv, partial: true })\n const usage = commandLineUsage([\n {\n header: \"Add contract's ABI to the project\",\n content: 'sentio add [--chain <chain> --name <name>] <address>',\n },\n {\n header: 'Options',\n optionList: optionDefinitions,\n },\n ])\n\n if (options.help || !options.address) {\n console.log(usage)\n } else {\n const chain: string = options['chain'].toLowerCase()\n const address: string = options.address\n if (!address.startsWith('0x')) {\n console.error(chalk.red('Address must start with 0x'))\n console.log(usage)\n process.exit(1)\n }\n\n const abiRes = await getABI(chain, address, options.name)\n const filename = abiRes.name || address\n\n writeABIFile(abiRes.abi, getABIFilePath(chain, filename))\n\n // Write contract info to sentio.yaml\n const yamlDocument: yaml.Document = yaml.parseDocument(fs.readFileSync('sentio.yaml', 'utf8'))\n let contracts = yamlDocument.get('contracts') as yaml.YAMLSeq\n if (!contracts) {\n contracts = new yaml.YAMLSeq()\n yamlDocument.set('contracts', contracts)\n }\n\n let hasContract = false\n for (const item of contracts.items as yaml.YAMLMap[]) {\n if (item.get('chain') === chain && item.get('address') === address) {\n hasContract = true\n }\n }\n\n if (!hasContract) {\n const newContract = new yaml.YAMLMap()\n newContract.set('chain', chain)\n newContract.set('address', address)\n if (address !== filename) {\n newContract.set('name', filename)\n }\n contracts.add(newContract)\n fs.writeFileSync('sentio.yaml', yamlDocument.toString(), 'utf8')\n }\n\n // Run gen\n await codegen(false)\n }\n}\n"]}
@@ -5,6 +5,8 @@ import fs from 'fs-extra';
5
5
  import chalk from 'chalk';
6
6
  import latestVersion from 'latest-version';
7
7
  import url from 'url';
8
+ import { exec } from 'child_process';
9
+ import process from 'process';
8
10
  export async function runCreate(argv) {
9
11
  const optionDefinitions = [
10
12
  {
@@ -120,6 +122,18 @@ export async function runCreate(argv) {
120
122
  fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
121
123
  }
122
124
  console.log(chalk.green("successfully create project '" + projectFullName + "'"));
125
+ if (!options.subproject) {
126
+ console.log(chalk.green('running yarn install for initialization'));
127
+ const child = exec('yarn install', { cwd: dstFolder });
128
+ if (!child.stdout || !child.stderr) {
129
+ process.exit(1);
130
+ }
131
+ child.stdout.pipe(process.stdout);
132
+ child.stderr.pipe(process.stderr);
133
+ await new Promise((resolve) => {
134
+ child.on('close', resolve);
135
+ });
136
+ }
123
137
  }
124
138
  }
125
139
  //# sourceMappingURL=run-create.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-create.js","sourceRoot":"","sources":["../../src/commands/run-create.ts"],"names":[],"mappings":"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","sourcesContent":["import commandLineArgs from 'command-line-args'\nimport commandLineUsage from 'command-line-usage'\nimport path from 'path'\nimport fs from 'fs-extra'\nimport chalk from 'chalk'\nimport latestVersion from 'latest-version'\nimport url from 'url'\n\nexport async function runCreate(argv: string[]) {\n const optionDefinitions = [\n {\n name: 'help',\n alias: 'h',\n type: Boolean,\n description: 'Display this usage guide.',\n },\n {\n name: 'name',\n alias: 'n',\n defaultOption: true,\n type: String,\n description: 'Project name',\n },\n {\n name: 'subproject',\n alias: 'p',\n type: Boolean,\n description:\n 'If this is a subproject in mono-repo setup, in this case sdk version is controlled in parent package.json.',\n },\n {\n name: 'directory',\n alias: 'd',\n description: '(Optional) The root direct new project will be created, default current working dir',\n type: String,\n },\n {\n name: 'chain-type',\n alias: 'c',\n description:\n 'The type of project you want to create, can be eth, aptos, solana, raw (if you want to start from scratch and support multiple types of chains)',\n type: String,\n defaultValue: 'eth',\n },\n ]\n\n const options = commandLineArgs(optionDefinitions, { argv })\n const usage = commandLineUsage([\n {\n header: 'Create a template project',\n content: 'sentio create <name>',\n },\n {\n header: 'Options',\n optionList: optionDefinitions,\n },\n ])\n\n if (options.help || !options.name) {\n console.log(usage)\n } else {\n const chainType: string = options['chain-type'].toLowerCase()\n switch (chainType) {\n case 'eth':\n break\n case 'aptos':\n break\n case 'raw':\n break\n case 'solana':\n break\n default:\n console.error(chalk.red('non supported chain-type for template creation, use --help for more information.'))\n console.log(usage)\n process.exit(1)\n }\n\n const templateFolder = url.fileURLToPath(new URL('../../templates/' + chainType, import.meta.url))\n const projectFullName = options.name || 'default'\n let projectSlug = projectFullName\n const projectParts = projectSlug.split('/')\n if (projectParts.length > 1) {\n projectSlug = projectParts[1]\n }\n\n const rootDir = options.directory || process.cwd()\n const dstFolder = path.resolve(rootDir, projectSlug)\n if (fs.existsSync(dstFolder)) {\n console.error(chalk.red(\"can't create project '\" + projectSlug + \"', directory already existed\"))\n process.exit(1)\n }\n\n fs.copySync(templateFolder, dstFolder, {\n filter: (src, _) => {\n // TODO read from .gitignore to be more reliable\n if (\n src.endsWith('types') ||\n src.endsWith('dist') ||\n src.endsWith('node_modules') ||\n src.endsWith('.lock') ||\n src.endsWith('dist')\n ) {\n return false\n }\n return true\n },\n overwrite: false,\n })\n const gitignoreFile = path.join(dstFolder, 'gitignore')\n if (fs.existsSync(gitignoreFile)) {\n fs.renameSync(gitignoreFile, path.join(dstFolder, '.gitignore'))\n }\n if (options.name) {\n const sentioYamlPath = path.resolve(dstFolder, 'sentio.yaml')\n fs.writeFileSync(sentioYamlPath, 'project: ' + projectFullName + '\\n', { flag: 'w+' })\n\n const packageJsonPath = path.resolve(dstFolder, 'package.json')\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))\n\n const sdkVersion = '^' + (await latestVersion('@sentio/sdk'))\n packageJson.dependencies['@sentio/sdk'] = sdkVersion\n\n const cliVersion = '^' + (await latestVersion('@sentio/cli'))\n packageJson.devDependencies['@sentio/cli'] = cliVersion\n packageJson.name = projectSlug\n\n if (options.subproject) {\n delete packageJson.dependencies['@sentio/sdk']\n delete packageJson.devDependencies['@sentio/cli']\n }\n\n // Don't add directly to avoid deps issue\n packageJson.scripts.postinstall = 'sentio gen'\n\n fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2))\n }\n console.log(chalk.green(\"successfully create project '\" + projectFullName + \"'\"))\n }\n}\n"]}
1
+ {"version":3,"file":"run-create.js","sourceRoot":"","sources":["../../src/commands/run-create.ts"],"names":[],"mappings":"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","sourcesContent":["import commandLineArgs from 'command-line-args'\nimport commandLineUsage from 'command-line-usage'\nimport path from 'path'\nimport fs from 'fs-extra'\nimport chalk from 'chalk'\nimport latestVersion from 'latest-version'\nimport url from 'url'\nimport { exec } from 'child_process'\nimport process from 'process'\n\nexport async function runCreate(argv: string[]) {\n const optionDefinitions = [\n {\n name: 'help',\n alias: 'h',\n type: Boolean,\n description: 'Display this usage guide.',\n },\n {\n name: 'name',\n alias: 'n',\n defaultOption: true,\n type: String,\n description: 'Project name',\n },\n {\n name: 'subproject',\n alias: 'p',\n type: Boolean,\n description:\n 'If this is a subproject in mono-repo setup, in this case sdk version is controlled in parent package.json.',\n },\n {\n name: 'directory',\n alias: 'd',\n description: '(Optional) The root direct new project will be created, default current working dir',\n type: String,\n },\n {\n name: 'chain-type',\n alias: 'c',\n description:\n 'The type of project you want to create, can be eth, aptos, solana, raw (if you want to start from scratch and support multiple types of chains)',\n type: String,\n defaultValue: 'eth',\n },\n ]\n\n const options = commandLineArgs(optionDefinitions, { argv })\n const usage = commandLineUsage([\n {\n header: 'Create a template project',\n content: 'sentio create <name>',\n },\n {\n header: 'Options',\n optionList: optionDefinitions,\n },\n ])\n\n if (options.help || !options.name) {\n console.log(usage)\n } else {\n const chainType: string = options['chain-type'].toLowerCase()\n switch (chainType) {\n case 'eth':\n break\n case 'aptos':\n break\n case 'raw':\n break\n case 'solana':\n break\n default:\n console.error(chalk.red('non supported chain-type for template creation, use --help for more information.'))\n console.log(usage)\n process.exit(1)\n }\n\n const templateFolder = url.fileURLToPath(new URL('../../templates/' + chainType, import.meta.url))\n const projectFullName = options.name || 'default'\n let projectSlug = projectFullName\n const projectParts = projectSlug.split('/')\n if (projectParts.length > 1) {\n projectSlug = projectParts[1]\n }\n\n const rootDir = options.directory || process.cwd()\n const dstFolder = path.resolve(rootDir, projectSlug)\n if (fs.existsSync(dstFolder)) {\n console.error(chalk.red(\"can't create project '\" + projectSlug + \"', directory already existed\"))\n process.exit(1)\n }\n\n fs.copySync(templateFolder, dstFolder, {\n filter: (src, _) => {\n // TODO read from .gitignore to be more reliable\n if (\n src.endsWith('types') ||\n src.endsWith('dist') ||\n src.endsWith('node_modules') ||\n src.endsWith('.lock') ||\n src.endsWith('dist')\n ) {\n return false\n }\n return true\n },\n overwrite: false,\n })\n const gitignoreFile = path.join(dstFolder, 'gitignore')\n if (fs.existsSync(gitignoreFile)) {\n fs.renameSync(gitignoreFile, path.join(dstFolder, '.gitignore'))\n }\n if (options.name) {\n const sentioYamlPath = path.resolve(dstFolder, 'sentio.yaml')\n fs.writeFileSync(sentioYamlPath, 'project: ' + projectFullName + '\\n', { flag: 'w+' })\n\n const packageJsonPath = path.resolve(dstFolder, 'package.json')\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))\n\n const sdkVersion = '^' + (await latestVersion('@sentio/sdk'))\n packageJson.dependencies['@sentio/sdk'] = sdkVersion\n\n const cliVersion = '^' + (await latestVersion('@sentio/cli'))\n packageJson.devDependencies['@sentio/cli'] = cliVersion\n packageJson.name = projectSlug\n\n if (options.subproject) {\n delete packageJson.dependencies['@sentio/sdk']\n delete packageJson.devDependencies['@sentio/cli']\n }\n\n // Don't add directly to avoid deps issue\n packageJson.scripts.postinstall = 'sentio gen'\n\n fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2))\n }\n console.log(chalk.green(\"successfully create project '\" + projectFullName + \"'\"))\n if (!options.subproject) {\n console.log(chalk.green('running yarn install for initialization'))\n\n const child = exec('yarn install', { cwd: dstFolder })\n if (!child.stdout || !child.stderr) {\n process.exit(1)\n }\n child.stdout.pipe(process.stdout)\n child.stderr.pipe(process.stderr)\n await new Promise((resolve) => {\n child.on('close', resolve)\n })\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "license": "Apache-2.0",
4
4
  "private": false,
5
5
  "type": "module",
6
- "version": "2.6.0-rc.3",
6
+ "version": "2.6.1-rc.1",
7
7
  "scripts": {
8
8
  "compile": "tsc",
9
9
  "build": "yarn compile",
@@ -20,7 +20,6 @@
20
20
  "chalk": "^5.2.0",
21
21
  "command-line-args": "^5.2.1",
22
22
  "command-line-usage": "^7.0.1",
23
- "etherscan-api": "^10.3.0",
24
23
  "express": "^4.18.2",
25
24
  "form-data": "^4.0.0",
26
25
  "fs-extra": "^11.0.0",
package/src/abi.ts CHANGED
@@ -5,8 +5,17 @@ import chalk from 'chalk'
5
5
  import process from 'process'
6
6
  import path from 'path'
7
7
  import fs from 'fs-extra'
8
- // @ts-ignore no types
9
- import { init } from 'etherscan-api'
8
+ import fetch from 'node-fetch'
9
+
10
+ export const ETH_API_URL_MAP: Record<string, string> = {}
11
+
12
+ ETH_API_URL_MAP[CHAIN_IDS.ETHEREUM] = 'https://api.etherscan.io'
13
+ ETH_API_URL_MAP[CHAIN_IDS.RINKEBY] = 'https://api-rinkeby.etherscan.io'
14
+ ETH_API_URL_MAP[CHAIN_IDS.ROPSTEN] = 'https://api-ropsten.etherscan.io'
15
+ ETH_API_URL_MAP[CHAIN_IDS.GOERLI] = 'https://api-goerli.etherscan.io'
16
+ ETH_API_URL_MAP[CHAIN_IDS.SEPOLIA] = 'https://api-sepolia.etherscan.io'
17
+ ETH_API_URL_MAP[CHAIN_IDS.ARBITRUM] = 'https://api.arbiscan.io'
18
+ ETH_API_URL_MAP[CHAIN_IDS.AVALANCHE] = 'https://api.snowtrace.io'
10
19
 
11
20
  export async function getABI(
12
21
  chain: string,
@@ -31,37 +40,12 @@ export async function getABI(
31
40
  case CHAIN_IDS.SUI_TESTNET:
32
41
  suiClient = new JsonRpcProvider(new Connection({ fullnode: 'https://fullnode.testnet.sui.io/' }))
33
42
  break
34
- case CHAIN_IDS.ETHEREUM:
35
- ethApi = init()
36
- break
37
- // case CHAIN_IDS.ROPSTEN:
38
- // ethApi = init(undefined, "ropsten")
39
- // break
40
- // case CHAIN_IDS.RINKEBY:
41
- // ethApi = init(undefined, "rinkeby")
42
- // break
43
- case CHAIN_IDS.GOERLI:
44
- ethApi = init(undefined, 'goerli')
45
- break
46
- // case CHAIN_IDS.SEPOLIA:
47
- // ethApi = init(undefined, "sepolia")
48
- // break
49
-
50
- case CHAIN_IDS.ARBITRUM:
51
- ethApi = init(undefined, 'arbitrum')
52
- break
53
- case CHAIN_IDS.ARBITRUM_GOERLI:
54
- ethApi = init(undefined, 'arbitrum_rinkeby')
55
- break
56
- case CHAIN_IDS.AVALANCHE:
57
- ethApi = init(undefined, 'avalanche')
58
- break
59
- // case CHAIN_IDS.KOVAN:
60
- // ethApi = init(undefined, "kovan")
61
- // break
62
43
  default:
63
- console.error(chalk.red(`chain ${chain} not supported for direct add, please download the ABI manually`))
64
- process.exit(1)
44
+ ethApi = ETH_API_URL_MAP[chain]
45
+ if (!ethApi) {
46
+ console.error(chalk.red(`chain ${chain} not supported for direct add, please download the ABI manually`))
47
+ process.exit(1)
48
+ }
65
49
  }
66
50
 
67
51
  const baseErrMsg = chalk.red(
@@ -90,15 +74,17 @@ export async function getABI(
90
74
  }
91
75
 
92
76
  try {
93
- let resp = await ethApi.contract.getabi(address)
77
+ let resp = (await (await fetch(`${ethApi}/api?module=contract&action=getabi&address=${address}`)).json()) as any
94
78
  if (resp.status !== '1') {
95
79
  throw Error(resp.message)
96
80
  }
97
81
  const abi = resp.result
98
82
 
99
83
  if (!name) {
100
- await new Promise((resolve) => setTimeout(resolve, 1000))
101
- resp = await ethApi.contract.getsourcecode(address)
84
+ await new Promise((resolve) => setTimeout(resolve, 5000))
85
+ resp = (await (
86
+ await fetch(`${ethApi}/api?module=contract&action=getsourcecode&address=${address}`)
87
+ ).json()) as any
102
88
  if (resp.status !== '1') {
103
89
  throw Error(resp.message)
104
90
  }
@@ -7,9 +7,19 @@ import { codegen } from './build.js'
7
7
 
8
8
  import * as process from 'process'
9
9
  import yaml from 'yaml'
10
- import { getABIFilePath, getABI, writeABIFile } from '../abi.js'
10
+ import { getABIFilePath, getABI, writeABIFile, ETH_API_URL_MAP } from '../abi.js'
11
+ import { CHAIN_IDS, getChainName } from '../chain.js'
11
12
 
12
13
  export async function runAdd(argv: string[]) {
14
+ const supportedChain: string[] = [CHAIN_IDS.APTOS_MAINNET, CHAIN_IDS.APTOS_TESTNET, CHAIN_IDS.SUI_TESTNET]
15
+ supportedChain.push(...Object.keys(ETH_API_URL_MAP))
16
+ const supprtedChainMessage = [
17
+ '',
18
+ ...supportedChain.map(
19
+ (chainId, idx) => ` ${getChainName(chainId)}:\t${chainId}${idx === supportedChain.length - 1 ? '' : '\n'}`
20
+ ),
21
+ ]
22
+
13
23
  const optionDefinitions = [
14
24
  {
15
25
  name: 'help',
@@ -22,8 +32,7 @@ export async function runAdd(argv: string[]) {
22
32
  alias: 'c',
23
33
  type: String,
24
34
  defaultValue: '1',
25
- description:
26
- 'Chain id define from here: https://raw.githubusercontent.com/sentioxyz/sentio-sdk/main/packages/sdk/src/core/chain.ts notice some chain may not support this command',
35
+ description: 'Chain id, current support (chain name: id)s are:\n' + supprtedChainMessage,
27
36
  },
28
37
  {
29
38
  name: 'address',
@@ -5,6 +5,8 @@ import fs from 'fs-extra'
5
5
  import chalk from 'chalk'
6
6
  import latestVersion from 'latest-version'
7
7
  import url from 'url'
8
+ import { exec } from 'child_process'
9
+ import process from 'process'
8
10
 
9
11
  export async function runCreate(argv: string[]) {
10
12
  const optionDefinitions = [
@@ -135,5 +137,18 @@ export async function runCreate(argv: string[]) {
135
137
  fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2))
136
138
  }
137
139
  console.log(chalk.green("successfully create project '" + projectFullName + "'"))
140
+ if (!options.subproject) {
141
+ console.log(chalk.green('running yarn install for initialization'))
142
+
143
+ const child = exec('yarn install', { cwd: dstFolder })
144
+ if (!child.stdout || !child.stderr) {
145
+ process.exit(1)
146
+ }
147
+ child.stdout.pipe(process.stdout)
148
+ child.stderr.pipe(process.stderr)
149
+ await new Promise((resolve) => {
150
+ child.on('close', resolve)
151
+ })
152
+ }
138
153
  }
139
154
  }