@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.
- package/lib/commands/run-compile.d.ts +2 -0
- package/lib/commands/run-compile.d.ts.map +1 -0
- package/lib/commands/run-compile.js +199 -0
- package/lib/commands/run-compile.js.map +1 -0
- package/lib/commands/run-upload.d.ts +1 -2
- package/lib/commands/run-upload.d.ts.map +1 -1
- package/lib/index.js +10 -5
- package/lib/index.js.map +1 -1
- package/package.json +2 -1
- package/src/commands/run-compile.ts +224 -0
- package/src/commands/run-upload.ts +1 -1
- package/src/commands/solc.d.ts +7 -0
- package/src/index.ts +9 -5
|
@@ -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,
|
|
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
|
|
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":";AAEA,OAAO,eAAe,MAAM,mBAAmB,CAAA;AAC/C,OAAO,gBAAgB,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;
|
|
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.
|
|
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
|
+
}
|
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
|
|
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)
|