@sentio/cli 2.14.3-rc.1 → 2.15.0-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.
@@ -0,0 +1,2 @@
1
+ export declare function runCompile(argv: string[]): Promise<false | undefined>;
2
+ //# sourceMappingURL=run-compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-compile.d.ts","sourceRoot":"","sources":["../../src/commands/run-compile.ts"],"names":[],"mappings":"AAyDA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,8BAoF9C"}
@@ -0,0 +1,199 @@
1
+ import commandLineArgs from 'command-line-args';
2
+ import commandLineUsage from 'command-line-usage';
3
+ import path from 'path';
4
+ import fs from 'fs';
5
+ import { promisify } from 'util';
6
+ import solc from 'solc';
7
+ import { getFinalizedHost } from '../config.js';
8
+ import { ReadKey } from '../key.js';
9
+ import chalk from 'chalk';
10
+ import { URL } from 'url';
11
+ const SRC_ROOT = 'src';
12
+ const optionDefinitions = [
13
+ {
14
+ name: 'help',
15
+ alias: 'h',
16
+ type: Boolean,
17
+ description: 'Display this usage guide.'
18
+ },
19
+ {
20
+ name: 'upload',
21
+ type: Boolean,
22
+ description: '(Optional) Upload to sentio if compiled successfully'
23
+ },
24
+ {
25
+ name: 'project',
26
+ description: '(Optional) Project full name, required in uploading',
27
+ type: String
28
+ },
29
+ {
30
+ name: 'api-key',
31
+ type: String,
32
+ description: '(Optional) Manually provide API key rather than use saved credential, if both api-key and jwt-token is provided, use api-key.'
33
+ },
34
+ {
35
+ name: 'token',
36
+ type: String,
37
+ description: '(Optional) Manually provide token rather than use saved credential, if both api-key and token is provided, use api-key.'
38
+ },
39
+ {
40
+ name: 'host',
41
+ description: '(Optional) Sentio Host name',
42
+ type: String
43
+ }
44
+ ];
45
+ export async function runCompile(argv) {
46
+ const options = commandLineArgs(optionDefinitions, { argv, partial: true });
47
+ if (options.help) {
48
+ const usage = commandLineUsage([
49
+ {
50
+ header: 'Sentio compile',
51
+ content: 'sentio compile'
52
+ },
53
+ {
54
+ header: 'Options',
55
+ optionList: optionDefinitions
56
+ }
57
+ ]);
58
+ console.log(usage);
59
+ process.exit(0);
60
+ }
61
+ let projectOwner, projectSlug;
62
+ const auth = {};
63
+ if (options.upload) {
64
+ if (!options.project) {
65
+ console.error('Project full path is required for upload. Please specify by --project option.');
66
+ process.exit(1);
67
+ }
68
+ ;
69
+ [projectOwner, projectSlug] = options.project.includes('/')
70
+ ? options.project.split('/')
71
+ : [undefined, options.project];
72
+ options.host = getFinalizedHost(options.host);
73
+ let apiKey = ReadKey(options.host);
74
+ if (options['api-key']) {
75
+ apiKey = options['api-key'];
76
+ }
77
+ if (apiKey) {
78
+ auth['api-key'] = apiKey;
79
+ }
80
+ else if (options['token']) {
81
+ auth.authorization = 'Bearer ' + options['token'];
82
+ }
83
+ else {
84
+ const isProd = options.host === 'https://app.sentio.xyz';
85
+ const cmd = isProd ? 'sentio login' : 'sentio login --host=' + options.host;
86
+ console.error(chalk.red('No Credential found for', options.host, '. Please run `' + cmd + '`.'));
87
+ process.exit(1);
88
+ }
89
+ }
90
+ let metadata;
91
+ const mdPath = path.join(process.cwd(), 'metadata.json');
92
+ try {
93
+ metadata = JSON.parse(fs.readFileSync(mdPath, 'utf8'));
94
+ }
95
+ catch (e) {
96
+ console.error('Unable to read metadata, please check if you are in a valid project directory.');
97
+ process.exit(1);
98
+ }
99
+ const ver = metadata.solidityVersion;
100
+ let compiler;
101
+ try {
102
+ const loadRemote = promisify(solc.loadRemoteVersion);
103
+ compiler = await loadRemote(ver);
104
+ }
105
+ catch (e) {
106
+ console.error(`Failed to fetch solc ${ver}:`, e);
107
+ return false;
108
+ }
109
+ console.log('Successfully fetch solc, compiling...');
110
+ const input = prepareCompilerInput(metadata, SRC_ROOT);
111
+ const output = JSON.parse(compiler.compile(JSON.stringify(input)));
112
+ if (Object.keys(output.sources || {}).length == 0) {
113
+ console.error(JSON.stringify(output, null, 2));
114
+ console.error('\nCompilation failed');
115
+ return;
116
+ }
117
+ console.log('Compilation successful.');
118
+ if (options.upload) {
119
+ await upload({
120
+ host: options.host,
121
+ projectOwner,
122
+ projectSlug,
123
+ auth,
124
+ metadata
125
+ });
126
+ }
127
+ return;
128
+ }
129
+ async function upload(args) {
130
+ const { host, projectOwner, projectSlug, auth, metadata } = args;
131
+ const source = readSources(SRC_ROOT, SRC_ROOT);
132
+ console.log('Uploading...');
133
+ const req = {
134
+ projectOwner,
135
+ projectSlug,
136
+ compileSpec: {
137
+ multiFile: {
138
+ source,
139
+ compilerSettings: JSON.stringify(metadata.settings)
140
+ },
141
+ solidityVersion: metadata.solidityVersion,
142
+ contractName: metadata.contractName,
143
+ constructorArgs: metadata.constructorArgs
144
+ }
145
+ };
146
+ const uploadURL = new URL('/api/v1/solidity/user_compilation', host);
147
+ await fetch(uploadURL.href, {
148
+ method: 'POST',
149
+ headers: {
150
+ 'Content-Type': 'application/json',
151
+ ...auth
152
+ },
153
+ body: JSON.stringify(req)
154
+ })
155
+ .then((res) => res.json())
156
+ .then((resp) => {
157
+ const id = resp.userCompilationId;
158
+ if (id) {
159
+ console.log(`Successfully uploaded, check it out at ${host}/${projectOwner}/${projectSlug}/contracts/compilation/${id}`);
160
+ }
161
+ else {
162
+ console.error(resp);
163
+ console.error('Failed to upload.');
164
+ }
165
+ })
166
+ .catch((err) => {
167
+ console.error('Failed to upload:', err);
168
+ });
169
+ }
170
+ function prepareCompilerInput(metadata, root) {
171
+ const input = {
172
+ language: 'Solidity',
173
+ sources: {},
174
+ settings: {
175
+ ...metadata.settings,
176
+ outputSelection: { '*': { '*': [] } }
177
+ }
178
+ };
179
+ const files = readSources(root, root);
180
+ for (const key in files) {
181
+ input.sources[key] = { content: files[key] };
182
+ }
183
+ return input;
184
+ }
185
+ function readSources(dir, root) {
186
+ let ret = {};
187
+ const childs = fs.readdirSync(dir);
188
+ for (const child of childs) {
189
+ const p = path.resolve(dir, child);
190
+ if (fs.statSync(p).isDirectory()) {
191
+ ret = { ...ret, ...readSources(p, root) };
192
+ }
193
+ else if (child.endsWith('.sol')) {
194
+ ret[path.relative(root, p)] = fs.readFileSync(p, 'utf8');
195
+ }
196
+ }
197
+ return ret;
198
+ }
199
+ //# sourceMappingURL=run-compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-compile.js","sourceRoot":"","sources":["../../src/commands/run-compile.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,8 @@
1
1
  import { YamlProjectConfig } from '../config.js';
2
2
  export declare function runUpload(processorConfig: YamlProjectConfig, argv: string[]): Promise<void>;
3
- interface Auth {
3
+ export interface Auth {
4
4
  'api-key'?: string;
5
5
  authorization?: string;
6
6
  }
7
7
  export declare function uploadFile(options: YamlProjectConfig, auth: Auth, continueFrom: number | undefined): Promise<void>;
8
- export {};
9
8
  //# sourceMappingURL=run-upload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-upload.d.ts","sourceRoot":"","sources":["../../src/commands/run-upload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqC,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAgFnF,wBAAsB,SAAS,CAAC,eAAe,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,iBAsDjF;AAcD,UAAU,IAAI;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,iBA8IxG"}
1
+ {"version":3,"file":"run-upload.d.ts","sourceRoot":"","sources":["../../src/commands/run-upload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqC,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAgFnF,wBAAsB,SAAS,CAAC,eAAe,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,iBAsDjF;AAcD,MAAM,WAAW,IAAI;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,iBA8IxG"}
package/lib/index.js CHANGED
@@ -12,9 +12,10 @@ import { runLogin } from './commands/run-login.js';
12
12
  import { runUpload } from './commands/run-upload.js';
13
13
  import { runTest } from './commands/run-test.js';
14
14
  import { runAdd } from './commands/run-add.js';
15
+ import { runCompile } from './commands/run-compile.js';
15
16
  const mainDefinitions = [{ name: 'command', defaultOption: true }];
16
17
  const mainOptions = commandLineArgs(mainDefinitions, {
17
- stopAtFirstUnknown: true,
18
+ stopAtFirstUnknown: true
18
19
  });
19
20
  const argv = mainOptions._unknown || [];
20
21
  if (!mainOptions.command) {
@@ -35,6 +36,9 @@ else if (mainOptions.command === 'test') {
35
36
  else if (mainOptions.command === 'add') {
36
37
  await runAdd(argv);
37
38
  }
39
+ else if (mainOptions.command === 'compile') {
40
+ await runCompile(argv);
41
+ }
38
42
  else {
39
43
  // For all the commands that need read project configs
40
44
  // TODO move them to their own modules
@@ -102,7 +106,7 @@ function usage() {
102
106
  const usage = commandLineUsage([
103
107
  {
104
108
  header: 'Sentio',
105
- content: 'Login & Manage your project files to Sentio.',
109
+ content: 'Login & Manage your project files to Sentio.'
106
110
  },
107
111
  {
108
112
  header: 'Usage',
@@ -115,9 +119,10 @@ function usage() {
115
119
  'sentio gen\t\t\t\tgenerate abi',
116
120
  'sentio build\t\t\t\tgenerate abi and build',
117
121
  'sentio test\t\t\t\trun tests',
118
- 'sentio version\t\t\tcurrent cli version',
119
- ],
120
- },
122
+ 'sentio compile\t\t\tcompile and upload local contract',
123
+ 'sentio version\t\t\tcurrent cli version'
124
+ ]
125
+ }
121
126
  ]);
122
127
  console.log(usage);
123
128
  process.exit(1);
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentio/cli",
3
- "version": "2.14.3-rc.1",
3
+ "version": "2.15.0-rc.1",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
@@ -33,6 +33,7 @@
33
33
  "latest-version": "^9.0.0",
34
34
  "node-fetch": "^3.3.2",
35
35
  "open": "^10.0.3",
36
+ "solc": "^0.8.25",
36
37
  "ts-jest": "^29.1.2",
37
38
  "ts-node": "^10.9.2",
38
39
  "tsup": "npm:@sentio/tsup@^6.7.2",
@@ -0,0 +1,224 @@
1
+ import commandLineArgs from 'command-line-args'
2
+ import commandLineUsage from 'command-line-usage'
3
+ import path from 'path'
4
+ import fs from 'fs'
5
+ import { promisify } from 'util'
6
+ import solc from 'solc'
7
+ import { getFinalizedHost } from '../config.js'
8
+ import { ReadKey } from '../key.js'
9
+ import chalk from 'chalk'
10
+ import { Auth } from './run-upload.js'
11
+ import { URL } from 'url'
12
+
13
+ const SRC_ROOT = 'src'
14
+
15
+ const optionDefinitions = [
16
+ {
17
+ name: 'help',
18
+ alias: 'h',
19
+ type: Boolean,
20
+ description: 'Display this usage guide.'
21
+ },
22
+ {
23
+ name: 'upload',
24
+ type: Boolean,
25
+ description: '(Optional) Upload to sentio if compiled successfully'
26
+ },
27
+ {
28
+ name: 'project',
29
+ description: '(Optional) Project full name, required in uploading',
30
+ type: String
31
+ },
32
+ {
33
+ name: 'api-key',
34
+ type: String,
35
+ description:
36
+ '(Optional) Manually provide API key rather than use saved credential, if both api-key and jwt-token is provided, use api-key.'
37
+ },
38
+ {
39
+ name: 'token',
40
+ type: String,
41
+ description:
42
+ '(Optional) Manually provide token rather than use saved credential, if both api-key and token is provided, use api-key.'
43
+ },
44
+ {
45
+ name: 'host',
46
+ description: '(Optional) Sentio Host name',
47
+ type: String
48
+ }
49
+ ]
50
+
51
+ interface Metadata {
52
+ solidityVersion: string
53
+ contractName: string
54
+ constructorArgs: string
55
+ settings: any
56
+ }
57
+
58
+ export async function runCompile(argv: string[]) {
59
+ const options = commandLineArgs(optionDefinitions, { argv, partial: true })
60
+ if (options.help) {
61
+ const usage = commandLineUsage([
62
+ {
63
+ header: 'Sentio compile',
64
+ content: 'sentio compile'
65
+ },
66
+ {
67
+ header: 'Options',
68
+ optionList: optionDefinitions
69
+ }
70
+ ])
71
+ console.log(usage)
72
+ process.exit(0)
73
+ }
74
+
75
+ let projectOwner, projectSlug
76
+ const auth: Auth = {}
77
+ if (options.upload) {
78
+ if (!options.project) {
79
+ console.error('Project full path is required for upload. Please specify by --project option.')
80
+ process.exit(1)
81
+ }
82
+ ;[projectOwner, projectSlug] = options.project.includes('/')
83
+ ? options.project.split('/')
84
+ : [undefined, options.project]
85
+ options.host = getFinalizedHost(options.host)
86
+
87
+ let apiKey = ReadKey(options.host)
88
+ if (options['api-key']) {
89
+ apiKey = options['api-key']
90
+ }
91
+ if (apiKey) {
92
+ auth['api-key'] = apiKey
93
+ } else if (options['token']) {
94
+ auth.authorization = 'Bearer ' + options['token']
95
+ } else {
96
+ const isProd = options.host === 'https://app.sentio.xyz'
97
+ const cmd = isProd ? 'sentio login' : 'sentio login --host=' + options.host
98
+ console.error(chalk.red('No Credential found for', options.host, '. Please run `' + cmd + '`.'))
99
+ process.exit(1)
100
+ }
101
+ }
102
+
103
+ let metadata: Metadata
104
+ const mdPath = path.join(process.cwd(), 'metadata.json')
105
+ try {
106
+ metadata = JSON.parse(fs.readFileSync(mdPath, 'utf8'))
107
+ } catch (e) {
108
+ console.error('Unable to read metadata, please check if you are in a valid project directory.')
109
+ process.exit(1)
110
+ }
111
+
112
+ const ver = metadata.solidityVersion
113
+ let compiler: solc.Compiler
114
+ try {
115
+ const loadRemote = promisify(solc.loadRemoteVersion)
116
+ compiler = await loadRemote(ver)
117
+ } catch (e) {
118
+ console.error(`Failed to fetch solc ${ver}:`, e)
119
+ return false
120
+ }
121
+ console.log('Successfully fetch solc, compiling...')
122
+
123
+ const input = prepareCompilerInput(metadata, SRC_ROOT)
124
+ const output = JSON.parse(compiler.compile(JSON.stringify(input)))
125
+ if (Object.keys(output.sources || {}).length == 0) {
126
+ console.error(JSON.stringify(output, null, 2))
127
+ console.error('\nCompilation failed')
128
+ return
129
+ }
130
+ console.log('Compilation successful.')
131
+
132
+ if (options.upload) {
133
+ await upload({
134
+ host: options.host,
135
+ projectOwner,
136
+ projectSlug,
137
+ auth,
138
+ metadata
139
+ })
140
+ }
141
+ return
142
+ }
143
+
144
+ async function upload(args: {
145
+ host: string
146
+ projectOwner?: string
147
+ projectSlug: string
148
+ auth: Auth
149
+ metadata: Metadata
150
+ }) {
151
+ const { host, projectOwner, projectSlug, auth, metadata } = args
152
+ const source = readSources(SRC_ROOT, SRC_ROOT)
153
+
154
+ console.log('Uploading...')
155
+
156
+ const req = {
157
+ projectOwner,
158
+ projectSlug,
159
+ compileSpec: {
160
+ multiFile: {
161
+ source,
162
+ compilerSettings: JSON.stringify(metadata.settings)
163
+ },
164
+ solidityVersion: metadata.solidityVersion,
165
+ contractName: metadata.contractName,
166
+ constructorArgs: metadata.constructorArgs
167
+ }
168
+ }
169
+
170
+ const uploadURL = new URL('/api/v1/solidity/user_compilation', host)
171
+ await fetch(uploadURL.href, {
172
+ method: 'POST',
173
+ headers: {
174
+ 'Content-Type': 'application/json',
175
+ ...auth
176
+ },
177
+ body: JSON.stringify(req)
178
+ })
179
+ .then((res) => res.json())
180
+ .then((resp: any) => {
181
+ const id = resp.userCompilationId
182
+ if (id) {
183
+ console.log(
184
+ `Successfully uploaded, check it out at ${host}/${projectOwner}/${projectSlug}/contracts/compilation/${id}`
185
+ )
186
+ } else {
187
+ console.error(resp)
188
+ console.error('Failed to upload.')
189
+ }
190
+ })
191
+ .catch((err) => {
192
+ console.error('Failed to upload:', err)
193
+ })
194
+ }
195
+
196
+ function prepareCompilerInput(metadata: Metadata, root: string) {
197
+ const input: any = {
198
+ language: 'Solidity',
199
+ sources: {},
200
+ settings: {
201
+ ...metadata.settings,
202
+ outputSelection: { '*': { '*': [] } }
203
+ }
204
+ }
205
+ const files = readSources(root, root)
206
+ for (const key in files) {
207
+ input.sources[key] = { content: files[key] }
208
+ }
209
+ return input
210
+ }
211
+
212
+ function readSources(dir: string, root: string) {
213
+ let ret: { [path: string]: string } = {}
214
+ const childs = fs.readdirSync(dir)
215
+ for (const child of childs) {
216
+ const p = path.resolve(dir, child)
217
+ if (fs.statSync(p).isDirectory()) {
218
+ ret = { ...ret, ...readSources(p, root) }
219
+ } else if (child.endsWith('.sol')) {
220
+ ret[path.relative(root, p)] = fs.readFileSync(p, 'utf8')
221
+ }
222
+ }
223
+ return ret
224
+ }
@@ -148,7 +148,7 @@ async function createProject(options: YamlProjectConfig, auth: Auth) {
148
148
  })
149
149
  }
150
150
 
151
- interface Auth {
151
+ export interface Auth {
152
152
  'api-key'?: string
153
153
  authorization?: string
154
154
  }
@@ -0,0 +1,7 @@
1
+ declare module 'solc' {
2
+ export function loadRemoteVersion(version: string, callback: (err: any, solc: Compiler) => void)
3
+
4
+ export interface Compiler {
5
+ compile: (input: string) => string
6
+ }
7
+ }
package/src/index.ts CHANGED
@@ -15,10 +15,11 @@ import { runLogin } from './commands/run-login.js'
15
15
  import { runUpload } from './commands/run-upload.js'
16
16
  import { runTest } from './commands/run-test.js'
17
17
  import { runAdd } from './commands/run-add.js'
18
+ import { runCompile } from './commands/run-compile.js'
18
19
 
19
20
  const mainDefinitions = [{ name: 'command', defaultOption: true }]
20
21
  const mainOptions = commandLineArgs(mainDefinitions, {
21
- stopAtFirstUnknown: true,
22
+ stopAtFirstUnknown: true
22
23
  })
23
24
  const argv = mainOptions._unknown || []
24
25
 
@@ -36,6 +37,8 @@ if (mainOptions.command === 'login') {
36
37
  runTest(argv)
37
38
  } else if (mainOptions.command === 'add') {
38
39
  await runAdd(argv)
40
+ } else if (mainOptions.command === 'compile') {
41
+ await runCompile(argv)
39
42
  } else {
40
43
  // For all the commands that need read project configs
41
44
  // TODO move them to their own modules
@@ -105,7 +108,7 @@ function usage() {
105
108
  const usage = commandLineUsage([
106
109
  {
107
110
  header: 'Sentio',
108
- content: 'Login & Manage your project files to Sentio.',
111
+ content: 'Login & Manage your project files to Sentio.'
109
112
  },
110
113
  {
111
114
  header: 'Usage',
@@ -118,9 +121,10 @@ function usage() {
118
121
  'sentio gen\t\t\t\tgenerate abi',
119
122
  'sentio build\t\t\t\tgenerate abi and build',
120
123
  'sentio test\t\t\t\trun tests',
121
- 'sentio version\t\t\tcurrent cli version',
122
- ],
123
- },
124
+ 'sentio compile\t\t\tcompile and upload local contract',
125
+ 'sentio version\t\t\tcurrent cli version'
126
+ ]
127
+ }
124
128
  ])
125
129
  console.log(usage)
126
130
  process.exit(1)