stylus-toolkit 0.1.0

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.
Files changed (78) hide show
  1. package/.claude/settings.local.json +20 -0
  2. package/CHANGELOG.md +30 -0
  3. package/CONTRIBUTING.md +50 -0
  4. package/LICENSE +21 -0
  5. package/README.md +132 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +62 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/benchmark.d.ts +3 -0
  11. package/dist/commands/benchmark.d.ts.map +1 -0
  12. package/dist/commands/benchmark.js +18 -0
  13. package/dist/commands/benchmark.js.map +1 -0
  14. package/dist/commands/config.d.ts +9 -0
  15. package/dist/commands/config.d.ts.map +1 -0
  16. package/dist/commands/config.js +63 -0
  17. package/dist/commands/config.js.map +1 -0
  18. package/dist/commands/init.d.ts +3 -0
  19. package/dist/commands/init.d.ts.map +1 -0
  20. package/dist/commands/init.js +115 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/profile.d.ts +3 -0
  23. package/dist/commands/profile.d.ts.map +1 -0
  24. package/dist/commands/profile.js +160 -0
  25. package/dist/commands/profile.js.map +1 -0
  26. package/dist/compiler/rust-compiler.d.ts +12 -0
  27. package/dist/compiler/rust-compiler.d.ts.map +1 -0
  28. package/dist/compiler/rust-compiler.js +141 -0
  29. package/dist/compiler/rust-compiler.js.map +1 -0
  30. package/dist/compiler/solidity-compiler.d.ts +10 -0
  31. package/dist/compiler/solidity-compiler.d.ts.map +1 -0
  32. package/dist/compiler/solidity-compiler.js +160 -0
  33. package/dist/compiler/solidity-compiler.js.map +1 -0
  34. package/dist/exporter/exporter.d.ts +13 -0
  35. package/dist/exporter/exporter.d.ts.map +1 -0
  36. package/dist/exporter/exporter.js +322 -0
  37. package/dist/exporter/exporter.js.map +1 -0
  38. package/dist/index.d.ts +11 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +37 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/profiler/comparator.d.ts +10 -0
  43. package/dist/profiler/comparator.d.ts.map +1 -0
  44. package/dist/profiler/comparator.js +96 -0
  45. package/dist/profiler/comparator.js.map +1 -0
  46. package/dist/profiler/gas-profiler.d.ts +11 -0
  47. package/dist/profiler/gas-profiler.d.ts.map +1 -0
  48. package/dist/profiler/gas-profiler.js +143 -0
  49. package/dist/profiler/gas-profiler.js.map +1 -0
  50. package/dist/storage/results-store.d.ts +16 -0
  51. package/dist/storage/results-store.d.ts.map +1 -0
  52. package/dist/storage/results-store.js +107 -0
  53. package/dist/storage/results-store.js.map +1 -0
  54. package/dist/templates/generator.d.ts +11 -0
  55. package/dist/templates/generator.d.ts.map +1 -0
  56. package/dist/templates/generator.js +135 -0
  57. package/dist/templates/generator.js.map +1 -0
  58. package/dist/templates/templates.d.ts +2 -0
  59. package/dist/templates/templates.d.ts.map +1 -0
  60. package/dist/templates/templates.js +324 -0
  61. package/dist/templates/templates.js.map +1 -0
  62. package/dist/types/index.d.ts +115 -0
  63. package/dist/types/index.d.ts.map +1 -0
  64. package/dist/types/index.js +3 -0
  65. package/dist/types/index.js.map +1 -0
  66. package/dist/utils/config.d.ts +15 -0
  67. package/dist/utils/config.d.ts.map +1 -0
  68. package/dist/utils/config.js +77 -0
  69. package/dist/utils/config.js.map +1 -0
  70. package/dist/utils/file-system.d.ts +14 -0
  71. package/dist/utils/file-system.d.ts.map +1 -0
  72. package/dist/utils/file-system.js +84 -0
  73. package/dist/utils/file-system.js.map +1 -0
  74. package/dist/utils/logger.d.ts +20 -0
  75. package/dist/utils/logger.d.ts.map +1 -0
  76. package/dist/utils/logger.js +76 -0
  77. package/dist/utils/logger.js.map +1 -0
  78. package/package.json +75 -0
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.profileCommand = profileCommand;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const cli_table3_1 = __importDefault(require("cli-table3"));
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const logger_1 = require("../utils/logger");
11
+ const config_1 = require("../utils/config");
12
+ const file_system_1 = require("../utils/file-system");
13
+ const rust_compiler_1 = require("../compiler/rust-compiler");
14
+ const solidity_compiler_1 = require("../compiler/solidity-compiler");
15
+ const gas_profiler_1 = require("../profiler/gas-profiler");
16
+ const comparator_1 = require("../profiler/comparator");
17
+ const results_store_1 = require("../storage/results-store");
18
+ const exporter_1 = require("../exporter/exporter");
19
+ async function profileCommand(options) {
20
+ logger_1.logger.header('Stylus Toolkit - Gas Profiling');
21
+ try {
22
+ const rpcUrl = options.rpcUrl || config_1.config.getNetwork(options.network)?.rpcUrl;
23
+ if (!rpcUrl) {
24
+ logger_1.logger.error(`Network "${options.network}" not found in configuration`);
25
+ process.exit(1);
26
+ }
27
+ logger_1.logger.info(`Network: ${options.network}`);
28
+ logger_1.logger.info(`RPC URL: ${rpcUrl}`);
29
+ logger_1.logger.newLine();
30
+ let contractName = options.contract;
31
+ if (!contractName) {
32
+ const rustContracts = await file_system_1.FileSystem.listContracts('rust');
33
+ const solidityContracts = await file_system_1.FileSystem.listContracts('solidity');
34
+ const allContracts = [...new Set([...rustContracts, ...solidityContracts])];
35
+ if (allContracts.length === 0) {
36
+ logger_1.logger.error('No contracts found. Run "stylus-toolkit init" first.');
37
+ process.exit(1);
38
+ }
39
+ if (allContracts.length === 1) {
40
+ contractName = allContracts[0];
41
+ logger_1.logger.info(`Auto-detected contract: ${contractName}`);
42
+ }
43
+ else {
44
+ const answer = await inquirer_1.default.prompt([
45
+ {
46
+ type: 'list',
47
+ name: 'contract',
48
+ message: 'Select contract to profile:',
49
+ choices: allContracts,
50
+ },
51
+ ]);
52
+ contractName = answer.contract;
53
+ }
54
+ }
55
+ logger_1.logger.newLine();
56
+ logger_1.logger.section('Compilation Phase');
57
+ const rustCompiler = new rust_compiler_1.RustCompiler();
58
+ const solidityCompiler = new solidity_compiler_1.SolidityCompiler();
59
+ let rustResult;
60
+ let solidityResult;
61
+ if (options.compile) {
62
+ logger_1.logger.info('Compiling contracts...');
63
+ logger_1.logger.newLine();
64
+ rustResult = await rustCompiler.compile(options.rustPath);
65
+ solidityResult = await solidityCompiler.compile(options.solidityPath);
66
+ }
67
+ else {
68
+ logger_1.logger.info('Skipping compilation (--no-compile flag set)');
69
+ logger_1.logger.error('Compilation results required for profiling');
70
+ process.exit(1);
71
+ }
72
+ if (!rustResult.success || !solidityResult.success) {
73
+ logger_1.logger.error('Compilation failed for one or more contracts');
74
+ if (rustResult.errors) {
75
+ logger_1.logger.error(`Rust errors: ${rustResult.errors.join(', ')}`);
76
+ }
77
+ if (solidityResult.errors) {
78
+ logger_1.logger.error(`Solidity errors: ${solidityResult.errors.join(', ')}`);
79
+ }
80
+ process.exit(1);
81
+ }
82
+ logger_1.logger.newLine();
83
+ logger_1.logger.section('Gas Profiling Phase');
84
+ const profiler = new gas_profiler_1.GasProfiler(rpcUrl);
85
+ const rustProfile = await profiler.profileContract(rustResult);
86
+ const solidityProfile = await profiler.profileContract(solidityResult);
87
+ logger_1.logger.newLine();
88
+ logger_1.logger.section('Comparison Analysis');
89
+ const comparator = new comparator_1.GasComparator();
90
+ const comparison = comparator.compare(rustProfile, solidityProfile);
91
+ displayResults(comparison, options.detailed);
92
+ logger_1.logger.newLine();
93
+ logger_1.logger.section('Saving Results');
94
+ const store = new results_store_1.ResultsStore();
95
+ await store.save(comparison);
96
+ if (options.export) {
97
+ const exporter = new exporter_1.ResultExporter();
98
+ await exporter.export(comparison, {
99
+ format: options.export,
100
+ outputPath: file_system_1.FileSystem.getProjectRoot(),
101
+ includeRawData: options.detailed,
102
+ });
103
+ }
104
+ logger_1.logger.newLine();
105
+ logger_1.logger.success('Gas profiling complete!');
106
+ }
107
+ catch (error) {
108
+ logger_1.logger.error(`Profiling failed: ${error.message}`);
109
+ if (process.env.DEBUG) {
110
+ console.error(error);
111
+ }
112
+ process.exit(1);
113
+ }
114
+ }
115
+ function displayResults(comparison, detailed) {
116
+ const table = new cli_table3_1.default({
117
+ head: ['Metric', 'Rust (Stylus)', 'Solidity', 'Savings', '%'],
118
+ colWidths: [20, 18, 18, 18, 12],
119
+ style: {
120
+ head: ['cyan', 'bold'],
121
+ },
122
+ });
123
+ table.push([
124
+ chalk_1.default.bold('Deployment'),
125
+ comparison.rustProfile.deploymentGas.toLocaleString(),
126
+ comparison.solidityProfile.deploymentGas.toLocaleString(),
127
+ chalk_1.default.green(comparison.savings.deploymentSavings.absolute.toLocaleString()),
128
+ chalk_1.default.green(comparison.savings.deploymentSavings.percentage.toFixed(2) + '%'),
129
+ ]);
130
+ if (comparison.savings.functionSavings.size > 0) {
131
+ table.push([{ colSpan: 5, content: chalk_1.default.bold('Function Gas') }]);
132
+ for (const [functionName, savings] of comparison.savings.functionSavings) {
133
+ const savingsColor = savings.absolute > 0 ? chalk_1.default.green : chalk_1.default.red;
134
+ table.push([
135
+ ` ${functionName}`,
136
+ savings.rustGas.toLocaleString(),
137
+ savings.solidityGas.toLocaleString(),
138
+ savingsColor(savings.absolute.toLocaleString()),
139
+ savingsColor(savings.percentage.toFixed(2) + '%'),
140
+ ]);
141
+ }
142
+ table.push([
143
+ chalk_1.default.bold('Avg Total'),
144
+ '-',
145
+ '-',
146
+ chalk_1.default.green(comparison.savings.totalAvgSavings.absolute.toLocaleString()),
147
+ chalk_1.default.green(comparison.savings.totalAvgSavings.percentage.toFixed(2) + '%'),
148
+ ]);
149
+ }
150
+ console.log(table.toString());
151
+ if (detailed) {
152
+ logger_1.logger.newLine();
153
+ logger_1.logger.section('Detailed Information');
154
+ logger_1.logger.info(`Contract: ${comparison.contractName}`);
155
+ logger_1.logger.info(`Timestamp: ${comparison.timestamp}`);
156
+ logger_1.logger.info(`Network: ${comparison.rustProfile.network}`);
157
+ logger_1.logger.info(`Block: ${comparison.rustProfile.blockNumber}`);
158
+ }
159
+ }
160
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":";;;;;AAcA,wCAqHC;AAnID,wDAAgC;AAChC,4DAA+B;AAC/B,kDAA0B;AAC1B,4CAAyC;AACzC,4CAAyC;AACzC,sDAAkD;AAClD,6DAAyD;AACzD,qEAAiE;AACjE,2DAAuD;AACvD,uDAAuD;AACvD,4DAAwD;AACxD,mDAAsD;AAG/C,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,eAAM,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,eAAM,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAE5E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,eAAM,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,OAAO,8BAA8B,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,eAAM,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,eAAM,CAAC,IAAI,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC;QAClC,eAAM,CAAC,OAAO,EAAE,CAAC;QAEjB,IAAI,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC;QAEpC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,aAAa,GAAG,MAAM,wBAAU,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC7D,MAAM,iBAAiB,GAAG,MAAM,wBAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAErE,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAE5E,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,eAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC/B,eAAM,CAAC,IAAI,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;oBACnC;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU;wBAChB,OAAO,EAAE,6BAA6B;wBACtC,OAAO,EAAE,YAAY;qBACtB;iBACF,CAAC,CAAC;gBACH,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC;YACjC,CAAC;QACH,CAAC;QAED,eAAM,CAAC,OAAO,EAAE,CAAC;QACjB,eAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAEpC,MAAM,YAAY,GAAG,IAAI,4BAAY,EAAE,CAAC;QACxC,MAAM,gBAAgB,GAAG,IAAI,oCAAgB,EAAE,CAAC;QAEhD,IAAI,UAAU,CAAC;QACf,IAAI,cAAc,CAAC;QAEnB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,eAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACtC,eAAM,CAAC,OAAO,EAAE,CAAC;YAEjB,UAAU,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAE1D,cAAc,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;YAC5D,eAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;YACnD,eAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC7D,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtB,eAAM,CAAC,KAAK,CAAC,gBAAgB,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;gBAC1B,eAAM,CAAC,KAAK,CAAC,oBAAoB,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,eAAM,CAAC,OAAO,EAAE,CAAC;QACjB,eAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAEtC,MAAM,QAAQ,GAAG,IAAI,0BAAW,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAEvE,eAAM,CAAC,OAAO,EAAE,CAAC;QACjB,eAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAEtC,MAAM,UAAU,GAAG,IAAI,0BAAa,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAEpE,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE7C,eAAM,CAAC,OAAO,EAAE,CAAC;QACjB,eAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAEjC,MAAM,KAAK,GAAG,IAAI,4BAAY,EAAE,CAAC;QACjC,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE7B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,QAAQ,GAAG,IAAI,yBAAc,EAAE,CAAC;YACtC,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE;gBAChC,MAAM,EAAE,OAAO,CAAC,MAAiC;gBACjD,UAAU,EAAE,wBAAU,CAAC,cAAc,EAAE;gBACvC,cAAc,EAAE,OAAO,CAAC,QAAQ;aACjC,CAAC,CAAC;QACL,CAAC;QAED,eAAM,CAAC,OAAO,EAAE,CAAC;QACjB,eAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,KAAK,CAAC,qBAAsB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,UAAe,EAAE,QAAiB;IACxD,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;QACtB,IAAI,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC;QAC7D,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAC/B,KAAK,EAAE;YACL,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;SACvB;KACF,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CAAC;QACT,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC;QACxB,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,cAAc,EAAE;QACrD,UAAU,CAAC,eAAe,CAAC,aAAa,CAAC,cAAc,EAAE;QACzD,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC3E,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;KAC9E,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;QAElE,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YACzE,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC;YAEpE,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,YAAY,EAAE;gBACnB,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE;gBAChC,OAAO,CAAC,WAAW,CAAC,cAAc,EAAE;gBACpC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;gBAC/C,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;aAClD,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,IAAI,CAAC;YACT,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC;YACvB,GAAG;YACH,GAAG;YACH,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;YACzE,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;SAC5E,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE9B,IAAI,QAAQ,EAAE,CAAC;QACb,eAAM,CAAC,OAAO,EAAE,CAAC;QACjB,eAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAEvC,eAAM,CAAC,IAAI,CAAC,aAAa,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;QACpD,eAAM,CAAC,IAAI,CAAC,cAAc,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;QAClD,eAAM,CAAC,IAAI,CAAC,YAAY,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,eAAM,CAAC,IAAI,CAAC,UAAU,UAAU,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { CompilationResult } from '../types';
2
+ export declare class RustCompiler {
3
+ private projectPath;
4
+ constructor(projectPath?: string);
5
+ compile(contractPath?: string): Promise<CompilationResult>;
6
+ private checkCargoInstalled;
7
+ private checkWasmTarget;
8
+ private getContractName;
9
+ private extractWarnings;
10
+ optimize(wasmPath: string): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=rust-compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust-compiler.d.ts","sourceRoot":"","sources":["../../src/compiler/rust-compiler.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,CAAC,EAAE,MAAM;IAI1B,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;YA2GlD,mBAAmB;YASnB,eAAe;YASf,eAAe;IAQ7B,OAAO,CAAC,eAAe;IAYjB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAYhD"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RustCompiler = void 0;
7
+ const execa_1 = __importDefault(require("execa"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const fs_extra_1 = __importDefault(require("fs-extra"));
10
+ const logger_1 = require("../utils/logger");
11
+ const file_system_1 = require("../utils/file-system");
12
+ class RustCompiler {
13
+ constructor(projectPath) {
14
+ this.projectPath = projectPath || file_system_1.FileSystem.getProjectRoot();
15
+ }
16
+ async compile(contractPath) {
17
+ const startTime = Date.now();
18
+ try {
19
+ const rustProjectPath = contractPath
20
+ ? path_1.default.dirname(contractPath)
21
+ : path_1.default.join(this.projectPath, 'contracts-rust');
22
+ if (!(await file_system_1.FileSystem.fileExists(rustProjectPath))) {
23
+ throw new Error(`Rust project not found at ${rustProjectPath}`);
24
+ }
25
+ logger_1.logger.startSpinner('Compiling Rust contract...');
26
+ const cargoCheck = await this.checkCargoInstalled();
27
+ if (!cargoCheck) {
28
+ throw new Error('Cargo is not installed. Please install Rust and Cargo.');
29
+ }
30
+ const wasmTargetInstalled = await this.checkWasmTarget();
31
+ if (!wasmTargetInstalled) {
32
+ logger_1.logger.updateSpinner('Installing wasm32-unknown-unknown target...');
33
+ await (0, execa_1.default)('rustup', ['target', 'add', 'wasm32-unknown-unknown']);
34
+ }
35
+ logger_1.logger.updateSpinner('Building WASM binary...');
36
+ const { stderr } = await (0, execa_1.default)('cargo', [
37
+ 'build',
38
+ '--release',
39
+ '--target',
40
+ 'wasm32-unknown-unknown',
41
+ '--lib',
42
+ ], {
43
+ cwd: rustProjectPath,
44
+ env: {
45
+ ...process.env,
46
+ RUSTFLAGS: '-C opt-level=z -C link-arg=-s',
47
+ },
48
+ });
49
+ const wasmPath = path_1.default.join(rustProjectPath, 'target', 'wasm32-unknown-unknown', 'release');
50
+ const contractName = await this.getContractName(rustProjectPath);
51
+ const wasmFileName = `${contractName.replace(/-/g, '_')}.wasm`;
52
+ const wasmFilePath = path_1.default.join(wasmPath, wasmFileName);
53
+ if (!(await file_system_1.FileSystem.fileExists(wasmFilePath))) {
54
+ throw new Error(`WASM file not found at ${wasmFilePath}`);
55
+ }
56
+ const wasmBinary = await fs_extra_1.default.readFile(wasmFilePath);
57
+ const wasmSizeKb = wasmBinary.length / 1024;
58
+ logger_1.logger.updateSpinner('Running cargo-stylus check...');
59
+ try {
60
+ await (0, execa_1.default)('cargo', ['stylus', 'check'], {
61
+ cwd: rustProjectPath,
62
+ });
63
+ }
64
+ catch (error) {
65
+ logger_1.logger.warn('cargo-stylus not installed. Skipping Stylus-specific checks.');
66
+ }
67
+ const compilationTime = Date.now() - startTime;
68
+ logger_1.logger.succeedSpinner(`Rust compilation successful (${(compilationTime / 1000).toFixed(2)}s)`);
69
+ const warnings = this.extractWarnings(stderr);
70
+ return {
71
+ success: true,
72
+ language: 'rust',
73
+ contractName,
74
+ bytecode: wasmBinary.toString('hex'),
75
+ wasmSize: wasmBinary.length,
76
+ bytecodeSizeKb: wasmSizeKb,
77
+ compilationTime,
78
+ warnings,
79
+ };
80
+ }
81
+ catch (error) {
82
+ const compilationTime = Date.now() - startTime;
83
+ logger_1.logger.failSpinner('Rust compilation failed');
84
+ return {
85
+ success: false,
86
+ language: 'rust',
87
+ contractName: 'unknown',
88
+ bytecode: '',
89
+ bytecodeSizeKb: 0,
90
+ compilationTime,
91
+ errors: [error.message],
92
+ };
93
+ }
94
+ }
95
+ async checkCargoInstalled() {
96
+ try {
97
+ await (0, execa_1.default)('cargo', ['--version']);
98
+ return true;
99
+ }
100
+ catch {
101
+ return false;
102
+ }
103
+ }
104
+ async checkWasmTarget() {
105
+ try {
106
+ const { stdout } = await (0, execa_1.default)('rustup', ['target', 'list', '--installed']);
107
+ return stdout.includes('wasm32-unknown-unknown');
108
+ }
109
+ catch {
110
+ return false;
111
+ }
112
+ }
113
+ async getContractName(projectPath) {
114
+ const cargoTomlPath = path_1.default.join(projectPath, 'Cargo.toml');
115
+ const cargoToml = await file_system_1.FileSystem.readFile(cargoTomlPath);
116
+ const nameMatch = cargoToml.match(/name\s*=\s*"([^"]+)"/);
117
+ return nameMatch ? nameMatch[1] : 'contract';
118
+ }
119
+ extractWarnings(stderr) {
120
+ const warnings = [];
121
+ const warningRegex = /warning: (.+)/g;
122
+ let match;
123
+ while ((match = warningRegex.exec(stderr)) !== null) {
124
+ warnings.push(match[1]);
125
+ }
126
+ return warnings;
127
+ }
128
+ async optimize(wasmPath) {
129
+ try {
130
+ const { stdout } = await (0, execa_1.default)('wasm-opt', ['--version']);
131
+ logger_1.logger.info(`Using wasm-opt: ${stdout.split('\n')[0]}`);
132
+ await (0, execa_1.default)('wasm-opt', ['-Oz', wasmPath, '-o', wasmPath]);
133
+ logger_1.logger.success('WASM optimization complete');
134
+ }
135
+ catch {
136
+ logger_1.logger.warn('wasm-opt not found. Install binaryen for optimization.');
137
+ }
138
+ }
139
+ }
140
+ exports.RustCompiler = RustCompiler;
141
+ //# sourceMappingURL=rust-compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust-compiler.js","sourceRoot":"","sources":["../../src/compiler/rust-compiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { CompilationResult } from '../types';
2
+ export declare class SolidityCompiler {
3
+ private projectPath;
4
+ constructor(projectPath?: string);
5
+ compile(contractPath?: string): Promise<CompilationResult>;
6
+ private compileWithSolc;
7
+ private compileWithSolcJs;
8
+ private checkSolcInstalled;
9
+ }
10
+ //# sourceMappingURL=solidity-compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solidity-compiler.d.ts","sourceRoot":"","sources":["../../src/compiler/solidity-compiler.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,CAAC,EAAE,MAAM;IAI1B,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;YA4BlD,eAAe;YAgEf,iBAAiB;YAiFjB,kBAAkB;CAQjC"}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SolidityCompiler = void 0;
7
+ const execa_1 = __importDefault(require("execa"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const fs_extra_1 = __importDefault(require("fs-extra"));
10
+ const logger_1 = require("../utils/logger");
11
+ const file_system_1 = require("../utils/file-system");
12
+ class SolidityCompiler {
13
+ constructor(projectPath) {
14
+ this.projectPath = projectPath || file_system_1.FileSystem.getProjectRoot();
15
+ }
16
+ async compile(contractPath) {
17
+ const startTime = Date.now();
18
+ try {
19
+ const solcInstalled = await this.checkSolcInstalled();
20
+ if (!solcInstalled) {
21
+ logger_1.logger.warn('solc not found. Attempting to use solc-js...');
22
+ return await this.compileWithSolcJs(contractPath);
23
+ }
24
+ return await this.compileWithSolc(contractPath);
25
+ }
26
+ catch (error) {
27
+ const compilationTime = Date.now() - startTime;
28
+ logger_1.logger.failSpinner('Solidity compilation failed');
29
+ return {
30
+ success: false,
31
+ language: 'solidity',
32
+ contractName: 'unknown',
33
+ bytecode: '',
34
+ bytecodeSizeKb: 0,
35
+ compilationTime,
36
+ errors: [error.message],
37
+ };
38
+ }
39
+ }
40
+ async compileWithSolc(contractPath) {
41
+ const startTime = Date.now();
42
+ const solidityPath = contractPath
43
+ ? path_1.default.dirname(contractPath)
44
+ : path_1.default.join(this.projectPath, 'contracts-solidity');
45
+ if (!(await file_system_1.FileSystem.fileExists(solidityPath))) {
46
+ throw new Error(`Solidity contracts not found at ${solidityPath}`);
47
+ }
48
+ logger_1.logger.startSpinner('Compiling Solidity contract...');
49
+ const files = await fs_extra_1.default.readdir(solidityPath);
50
+ const solFiles = files.filter((f) => f.endsWith('.sol'));
51
+ if (solFiles.length === 0) {
52
+ throw new Error('No Solidity files found');
53
+ }
54
+ const contractFile = contractPath
55
+ ? path_1.default.basename(contractPath)
56
+ : solFiles[0];
57
+ const fullPath = path_1.default.join(solidityPath, contractFile);
58
+ const { stdout } = await (0, execa_1.default)('solc', [
59
+ '--combined-json',
60
+ 'abi,bin',
61
+ '--optimize',
62
+ '--optimize-runs',
63
+ '200',
64
+ fullPath,
65
+ ]);
66
+ const output = JSON.parse(stdout);
67
+ const contracts = output.contracts;
68
+ const contractKey = Object.keys(contracts)[0];
69
+ const contract = contracts[contractKey];
70
+ const bytecode = contract.bin;
71
+ const abi = JSON.parse(contract.abi);
72
+ const bytecodeSizeKb = Buffer.from(bytecode, 'hex').length / 1024;
73
+ const compilationTime = Date.now() - startTime;
74
+ const contractName = contractFile.replace('.sol', '');
75
+ logger_1.logger.succeedSpinner(`Solidity compilation successful (${(compilationTime / 1000).toFixed(2)}s)`);
76
+ return {
77
+ success: true,
78
+ language: 'solidity',
79
+ contractName,
80
+ bytecode,
81
+ abi,
82
+ bytecodeSizeKb,
83
+ compilationTime,
84
+ };
85
+ }
86
+ async compileWithSolcJs(contractPath) {
87
+ const solc = require('solc');
88
+ const startTime = Date.now();
89
+ const solidityPath = contractPath
90
+ ? path_1.default.dirname(contractPath)
91
+ : path_1.default.join(this.projectPath, 'contracts-solidity');
92
+ if (!(await file_system_1.FileSystem.fileExists(solidityPath))) {
93
+ throw new Error(`Solidity contracts not found at ${solidityPath}`);
94
+ }
95
+ logger_1.logger.startSpinner('Compiling Solidity contract with solc-js...');
96
+ const files = await fs_extra_1.default.readdir(solidityPath);
97
+ const solFiles = files.filter((f) => f.endsWith('.sol'));
98
+ if (solFiles.length === 0) {
99
+ throw new Error('No Solidity files found');
100
+ }
101
+ const contractFile = contractPath
102
+ ? path_1.default.basename(contractPath)
103
+ : solFiles[0];
104
+ const fullPath = path_1.default.join(solidityPath, contractFile);
105
+ const source = await file_system_1.FileSystem.readFile(fullPath);
106
+ const input = {
107
+ language: 'Solidity',
108
+ sources: {
109
+ [contractFile]: {
110
+ content: source,
111
+ },
112
+ },
113
+ settings: {
114
+ optimizer: {
115
+ enabled: true,
116
+ runs: 200,
117
+ },
118
+ outputSelection: {
119
+ '*': {
120
+ '*': ['abi', 'evm.bytecode'],
121
+ },
122
+ },
123
+ },
124
+ };
125
+ const output = JSON.parse(solc.compile(JSON.stringify(input)));
126
+ if (output.errors) {
127
+ const errors = output.errors.filter((e) => e.severity === 'error');
128
+ if (errors.length > 0) {
129
+ throw new Error(errors.map((e) => e.message).join('\n'));
130
+ }
131
+ }
132
+ const contractName = Object.keys(output.contracts[contractFile])[0];
133
+ const contract = output.contracts[contractFile][contractName];
134
+ const bytecode = contract.evm.bytecode.object;
135
+ const abi = contract.abi;
136
+ const bytecodeSizeKb = Buffer.from(bytecode, 'hex').length / 1024;
137
+ const compilationTime = Date.now() - startTime;
138
+ logger_1.logger.succeedSpinner(`Solidity compilation successful (${(compilationTime / 1000).toFixed(2)}s)`);
139
+ return {
140
+ success: true,
141
+ language: 'solidity',
142
+ contractName,
143
+ bytecode,
144
+ abi,
145
+ bytecodeSizeKb,
146
+ compilationTime,
147
+ };
148
+ }
149
+ async checkSolcInstalled() {
150
+ try {
151
+ await (0, execa_1.default)('solc', ['--version']);
152
+ return true;
153
+ }
154
+ catch {
155
+ return false;
156
+ }
157
+ }
158
+ }
159
+ exports.SolidityCompiler = SolidityCompiler;
160
+ //# sourceMappingURL=solidity-compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solidity-compiler.js","sourceRoot":"","sources":["../../src/compiler/solidity-compiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { ComparisonResult, ExportOptions } from '../types';
2
+ export declare class ResultExporter {
3
+ export(comparison: ComparisonResult, options: ExportOptions): Promise<string>;
4
+ private exportJson;
5
+ private exportCsv;
6
+ private exportHtml;
7
+ private createSummaryData;
8
+ private createCsvRecords;
9
+ private generateHtml;
10
+ private getHtmlTemplate;
11
+ private serializeComparison;
12
+ }
13
+ //# sourceMappingURL=exporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../src/exporter/exporter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG3D,qBAAa,cAAc;IACnB,MAAM,CACV,UAAU,EAAE,gBAAgB,EAC5B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC;YAeJ,UAAU;YAmBV,SAAS;YA4BT,UAAU;IAgBxB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,gBAAgB;IAkCxB,OAAO,CAAC,YAAY;IAgCpB,OAAO,CAAC,eAAe;IA6JvB,OAAO,CAAC,mBAAmB;CAiB5B"}