gnoman 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 (606) hide show
  1. package/.eslintrc.cjs +24 -0
  2. package/.gnoman/contracts.json +4094 -0
  3. package/.gnoman/exec_package/runtime-debug.jsonl +45 -0
  4. package/.gnoman/holds.sqlite +0 -0
  5. package/.gnoman/license.json +7 -0
  6. package/.gnoman/safes.json +37 -0
  7. package/.gnoman/vanity-jobs.json +67 -0
  8. package/.gnoman/wallets.db +0 -0
  9. package/.prettierrc.json +6 -0
  10. package/CODex_TASKS.md +124 -0
  11. package/LICENSE.md +164 -0
  12. package/README.md +95 -0
  13. package/assets/GnoLogo.jpg +0 -0
  14. package/assets/self.png +0 -0
  15. package/backend/controllers/contractController.ts +49 -0
  16. package/backend/controllers/devToolsController.ts +76 -0
  17. package/backend/controllers/etherscanController.ts +59 -0
  18. package/backend/controllers/historyController.ts +7 -0
  19. package/backend/controllers/keyringController.ts +134 -0
  20. package/backend/controllers/robinhoodController.ts +80 -0
  21. package/backend/controllers/safeController.ts +167 -0
  22. package/backend/controllers/sandboxController.ts +63 -0
  23. package/backend/controllers/settingsController.ts +38 -0
  24. package/backend/controllers/walletController.ts +151 -0
  25. package/backend/index.ts +133 -0
  26. package/backend/licenses/license_public.pem +3 -0
  27. package/backend/licenses/verify_license.py +43 -0
  28. package/backend/routes/contractRoutes.ts +11 -0
  29. package/backend/routes/devToolsRoutes.ts +11 -0
  30. package/backend/routes/etherscanRoutes.ts +11 -0
  31. package/backend/routes/historyRoutes.ts +8 -0
  32. package/backend/routes/keyringRoutes.ts +25 -0
  33. package/backend/routes/licenseRoutes.ts +35 -0
  34. package/backend/routes/robinhoodRoutes.ts +22 -0
  35. package/backend/routes/runtimeRoutes.ts +29 -0
  36. package/backend/routes/safeRoutes.ts +28 -0
  37. package/backend/routes/sandboxRoutes.ts +17 -0
  38. package/backend/routes/settingsRoutes.ts +14 -0
  39. package/backend/routes/walletRoutes.ts +21 -0
  40. package/backend/services/chainlinkService.ts +65 -0
  41. package/backend/services/contractRegistryService.ts +205 -0
  42. package/backend/services/devToolsService.ts +251 -0
  43. package/backend/services/diagnosticsService.ts +350 -0
  44. package/backend/services/etherscanService.ts +152 -0
  45. package/backend/services/historyService.ts +89 -0
  46. package/backend/services/keyringAccessor.ts +4 -0
  47. package/backend/services/licenseService.ts +163 -0
  48. package/backend/services/onchain/abiRegistry.ts +57 -0
  49. package/backend/services/onchain/chainlinkClient.ts +56 -0
  50. package/backend/services/onchain/errors.ts +16 -0
  51. package/backend/services/onchain/etherscanClient.ts +94 -0
  52. package/backend/services/onchain/index.ts +76 -0
  53. package/backend/services/onchain/tenderlyRpcClient.ts +74 -0
  54. package/backend/services/onchain/types.ts +33 -0
  55. package/backend/services/onchainAutomationService.ts +424 -0
  56. package/backend/services/robinhood/auth.ts +42 -0
  57. package/backend/services/robinhood/client.ts +123 -0
  58. package/backend/services/robinhood/integrationService.ts +140 -0
  59. package/backend/services/robinhood/provider.ts +22 -0
  60. package/backend/services/robinhood/unofficialClient.ts +66 -0
  61. package/backend/services/rpcService.ts +44 -0
  62. package/backend/services/runtimeTelemetryService.ts +158 -0
  63. package/backend/services/safeConfigRepository.ts +205 -0
  64. package/backend/services/safeService.ts +588 -0
  65. package/backend/services/sandboxService.ts +157 -0
  66. package/backend/services/secureSettingsService.ts +45 -0
  67. package/backend/services/transactionHoldService.ts +223 -0
  68. package/backend/services/vanityService.ts +293 -0
  69. package/backend/services/walletService.ts +290 -0
  70. package/backend/services/walletStore.ts +179 -0
  71. package/backend/types/express-async-handler.d.ts +13 -0
  72. package/backend/types/keyring.d.ts +19 -0
  73. package/backend/utils/abiResolver.ts +208 -0
  74. package/backend/utils/http.ts +6 -0
  75. package/backend/utils/secretsResolver.ts +150 -0
  76. package/backend/utils/signer.ts +11 -0
  77. package/backend/workers/vanityWorker.ts +76 -0
  78. package/capacitor.config.ts +13 -0
  79. package/cli/gnoman.ts +424 -0
  80. package/contracts/OracleConsumer.sol +20 -0
  81. package/contracts/PriceFeedConsumer.sol +22 -0
  82. package/dist/backend/backend/controllers/contractController.js +41 -0
  83. package/dist/backend/backend/controllers/contractController.js.map +1 -0
  84. package/dist/backend/backend/controllers/devToolsController.js +63 -0
  85. package/dist/backend/backend/controllers/devToolsController.js.map +1 -0
  86. package/dist/backend/backend/controllers/etherscanController.js +53 -0
  87. package/dist/backend/backend/controllers/etherscanController.js.map +1 -0
  88. package/dist/backend/backend/controllers/historyController.js +12 -0
  89. package/dist/backend/backend/controllers/historyController.js.map +1 -0
  90. package/dist/backend/backend/controllers/keyringController.js +126 -0
  91. package/dist/backend/backend/controllers/keyringController.js.map +1 -0
  92. package/dist/backend/backend/controllers/robinhoodController.js +69 -0
  93. package/dist/backend/backend/controllers/robinhoodController.js.map +1 -0
  94. package/dist/backend/backend/controllers/safeController.js +137 -0
  95. package/dist/backend/backend/controllers/safeController.js.map +1 -0
  96. package/dist/backend/backend/controllers/sandboxController.js +48 -0
  97. package/dist/backend/backend/controllers/sandboxController.js.map +1 -0
  98. package/dist/backend/backend/controllers/settingsController.js +34 -0
  99. package/dist/backend/backend/controllers/settingsController.js.map +1 -0
  100. package/dist/backend/backend/controllers/walletController.js +140 -0
  101. package/dist/backend/backend/controllers/walletController.js.map +1 -0
  102. package/dist/backend/backend/index.js +119 -0
  103. package/dist/backend/backend/index.js.map +1 -0
  104. package/dist/backend/backend/routes/contractRoutes.js +44 -0
  105. package/dist/backend/backend/routes/contractRoutes.js.map +1 -0
  106. package/dist/backend/backend/routes/devToolsRoutes.js +44 -0
  107. package/dist/backend/backend/routes/devToolsRoutes.js.map +1 -0
  108. package/dist/backend/backend/routes/etherscanRoutes.js +44 -0
  109. package/dist/backend/backend/routes/etherscanRoutes.js.map +1 -0
  110. package/dist/backend/backend/routes/historyRoutes.js +41 -0
  111. package/dist/backend/backend/routes/historyRoutes.js.map +1 -0
  112. package/dist/backend/backend/routes/keyringRoutes.js +18 -0
  113. package/dist/backend/backend/routes/keyringRoutes.js.map +1 -0
  114. package/dist/backend/backend/routes/licenseRoutes.js +30 -0
  115. package/dist/backend/backend/routes/licenseRoutes.js.map +1 -0
  116. package/dist/backend/backend/routes/robinhoodRoutes.js +14 -0
  117. package/dist/backend/backend/routes/robinhoodRoutes.js.map +1 -0
  118. package/dist/backend/backend/routes/runtimeRoutes.js +26 -0
  119. package/dist/backend/backend/routes/runtimeRoutes.js.map +1 -0
  120. package/dist/backend/backend/routes/safeRoutes.js +61 -0
  121. package/dist/backend/backend/routes/safeRoutes.js.map +1 -0
  122. package/dist/backend/backend/routes/sandboxRoutes.js +50 -0
  123. package/dist/backend/backend/routes/sandboxRoutes.js.map +1 -0
  124. package/dist/backend/backend/routes/settingsRoutes.js +10 -0
  125. package/dist/backend/backend/routes/settingsRoutes.js.map +1 -0
  126. package/dist/backend/backend/routes/walletRoutes.js +54 -0
  127. package/dist/backend/backend/routes/walletRoutes.js.map +1 -0
  128. package/dist/backend/backend/services/chainlinkService.js +48 -0
  129. package/dist/backend/backend/services/chainlinkService.js.map +1 -0
  130. package/dist/backend/backend/services/contractRegistryService.js +138 -0
  131. package/dist/backend/backend/services/contractRegistryService.js.map +1 -0
  132. package/dist/backend/backend/services/devToolsService.js +213 -0
  133. package/dist/backend/backend/services/devToolsService.js.map +1 -0
  134. package/dist/backend/backend/services/diagnosticsService.js +286 -0
  135. package/dist/backend/backend/services/diagnosticsService.js.map +1 -0
  136. package/dist/backend/backend/services/etherscanService.js +125 -0
  137. package/dist/backend/backend/services/etherscanService.js.map +1 -0
  138. package/dist/backend/backend/services/historyService.js +75 -0
  139. package/dist/backend/backend/services/historyService.js.map +1 -0
  140. package/dist/backend/backend/services/keyringAccessor.js +40 -0
  141. package/dist/backend/backend/services/keyringAccessor.js.map +1 -0
  142. package/dist/backend/backend/services/licenseService.js +130 -0
  143. package/dist/backend/backend/services/licenseService.js.map +1 -0
  144. package/dist/backend/backend/services/onchain/abiRegistry.js +47 -0
  145. package/dist/backend/backend/services/onchain/abiRegistry.js.map +1 -0
  146. package/dist/backend/backend/services/onchain/chainlinkClient.js +43 -0
  147. package/dist/backend/backend/services/onchain/chainlinkClient.js.map +1 -0
  148. package/dist/backend/backend/services/onchain/errors.js +13 -0
  149. package/dist/backend/backend/services/onchain/errors.js.map +1 -0
  150. package/dist/backend/backend/services/onchain/etherscanClient.js +82 -0
  151. package/dist/backend/backend/services/onchain/etherscanClient.js.map +1 -0
  152. package/dist/backend/backend/services/onchain/index.js +79 -0
  153. package/dist/backend/backend/services/onchain/index.js.map +1 -0
  154. package/dist/backend/backend/services/onchain/tenderlyRpcClient.js +60 -0
  155. package/dist/backend/backend/services/onchain/tenderlyRpcClient.js.map +1 -0
  156. package/dist/backend/backend/services/onchain/types.js +14 -0
  157. package/dist/backend/backend/services/onchain/types.js.map +1 -0
  158. package/dist/backend/backend/services/onchainAutomationService.js +316 -0
  159. package/dist/backend/backend/services/onchainAutomationService.js.map +1 -0
  160. package/dist/backend/backend/services/robinhood/auth.js +26 -0
  161. package/dist/backend/backend/services/robinhood/auth.js.map +1 -0
  162. package/dist/backend/backend/services/robinhood/client.js +73 -0
  163. package/dist/backend/backend/services/robinhood/client.js.map +1 -0
  164. package/dist/backend/backend/services/robinhood/integrationService.js +119 -0
  165. package/dist/backend/backend/services/robinhood/integrationService.js.map +1 -0
  166. package/dist/backend/backend/services/robinhood/provider.js +17 -0
  167. package/dist/backend/backend/services/robinhood/provider.js.map +1 -0
  168. package/dist/backend/backend/services/robinhood/unofficialClient.js +61 -0
  169. package/dist/backend/backend/services/robinhood/unofficialClient.js.map +1 -0
  170. package/dist/backend/backend/services/rpcService.js +48 -0
  171. package/dist/backend/backend/services/rpcService.js.map +1 -0
  172. package/dist/backend/backend/services/runtimeTelemetryService.js +96 -0
  173. package/dist/backend/backend/services/runtimeTelemetryService.js.map +1 -0
  174. package/dist/backend/backend/services/safeConfigRepository.js +147 -0
  175. package/dist/backend/backend/services/safeConfigRepository.js.map +1 -0
  176. package/dist/backend/backend/services/safeService.js +527 -0
  177. package/dist/backend/backend/services/safeService.js.map +1 -0
  178. package/dist/backend/backend/services/sandboxService.js +135 -0
  179. package/dist/backend/backend/services/sandboxService.js.map +1 -0
  180. package/dist/backend/backend/services/secureSettingsService.js +50 -0
  181. package/dist/backend/backend/services/secureSettingsService.js.map +1 -0
  182. package/dist/backend/backend/services/transactionHoldService.js +184 -0
  183. package/dist/backend/backend/services/transactionHoldService.js.map +1 -0
  184. package/dist/backend/backend/services/vanityService.js +235 -0
  185. package/dist/backend/backend/services/vanityService.js.map +1 -0
  186. package/dist/backend/backend/services/walletService.js +202 -0
  187. package/dist/backend/backend/services/walletService.js.map +1 -0
  188. package/dist/backend/backend/services/walletStore.js +132 -0
  189. package/dist/backend/backend/services/walletStore.js.map +1 -0
  190. package/dist/backend/backend/utils/abiResolver.js +182 -0
  191. package/dist/backend/backend/utils/abiResolver.js.map +1 -0
  192. package/dist/backend/backend/utils/http.js +12 -0
  193. package/dist/backend/backend/utils/http.js.map +1 -0
  194. package/dist/backend/backend/utils/secretsResolver.js +137 -0
  195. package/dist/backend/backend/utils/secretsResolver.js.map +1 -0
  196. package/dist/backend/backend/utils/signer.js +15 -0
  197. package/dist/backend/backend/utils/signer.js.map +1 -0
  198. package/dist/backend/backend/workers/vanityWorker.js +63 -0
  199. package/dist/backend/backend/workers/vanityWorker.js.map +1 -0
  200. package/dist/backend/cli/gnoman.js +387 -0
  201. package/dist/backend/cli/gnoman.js.map +1 -0
  202. package/dist/backend/modules/sandbox/abiLoader.js +78 -0
  203. package/dist/backend/modules/sandbox/abiLoader.js.map +1 -0
  204. package/dist/backend/modules/sandbox/contractSimulator.js +205 -0
  205. package/dist/backend/modules/sandbox/contractSimulator.js.map +1 -0
  206. package/dist/backend/modules/sandbox/formBuilder.js +14 -0
  207. package/dist/backend/modules/sandbox/formBuilder.js.map +1 -0
  208. package/dist/backend/modules/sandbox/index.js +24 -0
  209. package/dist/backend/modules/sandbox/index.js.map +1 -0
  210. package/dist/backend/modules/sandbox/localFork.js +103 -0
  211. package/dist/backend/modules/sandbox/localFork.js.map +1 -0
  212. package/dist/backend/modules/sandbox/sandboxManager.js +130 -0
  213. package/dist/backend/modules/sandbox/sandboxManager.js.map +1 -0
  214. package/dist/backend/modules/sandbox/types.js +3 -0
  215. package/dist/backend/modules/sandbox/types.js.map +1 -0
  216. package/dist/backend/src/core/backends/fileBackend.js +136 -0
  217. package/dist/backend/src/core/backends/fileBackend.js.map +1 -0
  218. package/dist/backend/src/core/backends/memoryBackend.js +26 -0
  219. package/dist/backend/src/core/backends/memoryBackend.js.map +1 -0
  220. package/dist/backend/src/core/backends/systemBackend.js +86 -0
  221. package/dist/backend/src/core/backends/systemBackend.js.map +1 -0
  222. package/dist/backend/src/core/backends/types.js +12 -0
  223. package/dist/backend/src/core/backends/types.js.map +1 -0
  224. package/dist/backend/src/core/keyringManager.js +178 -0
  225. package/dist/backend/src/core/keyringManager.js.map +1 -0
  226. package/dist/backend/src/utils/abiResolver.js +180 -0
  227. package/dist/backend/src/utils/abiResolver.js.map +1 -0
  228. package/dist/backend/src/utils/runtimeObservability.js +78 -0
  229. package/dist/backend/src/utils/runtimeObservability.js.map +1 -0
  230. package/dist/backend/src/utils/secretsResolver.js +138 -0
  231. package/dist/backend/src/utils/secretsResolver.js.map +1 -0
  232. package/dist/cli/backend/services/diagnosticsService.js +286 -0
  233. package/dist/cli/backend/services/diagnosticsService.js.map +1 -0
  234. package/dist/cli/backend/services/keyringAccessor.js +40 -0
  235. package/dist/cli/backend/services/keyringAccessor.js.map +1 -0
  236. package/dist/cli/backend/services/rpcService.js +48 -0
  237. package/dist/cli/backend/services/rpcService.js.map +1 -0
  238. package/dist/cli/backend/services/runtimeTelemetryService.js +96 -0
  239. package/dist/cli/backend/services/runtimeTelemetryService.js.map +1 -0
  240. package/dist/cli/backend/services/walletService.js +202 -0
  241. package/dist/cli/backend/services/walletService.js.map +1 -0
  242. package/dist/cli/backend/services/walletStore.js +132 -0
  243. package/dist/cli/backend/services/walletStore.js.map +1 -0
  244. package/dist/cli/backend/utils/http.js +12 -0
  245. package/dist/cli/backend/utils/http.js.map +1 -0
  246. package/dist/cli/backend/utils/secretsResolver.js +137 -0
  247. package/dist/cli/backend/utils/secretsResolver.js.map +1 -0
  248. package/dist/cli/cli/gnoman.js +387 -0
  249. package/dist/cli/cli/gnoman.js.map +1 -0
  250. package/dist/cli/src/core/backends/fileBackend.js +136 -0
  251. package/dist/cli/src/core/backends/fileBackend.js.map +1 -0
  252. package/dist/cli/src/core/backends/memoryBackend.js +26 -0
  253. package/dist/cli/src/core/backends/memoryBackend.js.map +1 -0
  254. package/dist/cli/src/core/backends/systemBackend.js +86 -0
  255. package/dist/cli/src/core/backends/systemBackend.js.map +1 -0
  256. package/dist/cli/src/core/backends/types.js +12 -0
  257. package/dist/cli/src/core/backends/types.js.map +1 -0
  258. package/dist/cli/src/core/keyringManager.js +178 -0
  259. package/dist/cli/src/core/keyringManager.js.map +1 -0
  260. package/dist/cli/src/utils/abiResolver.js +180 -0
  261. package/dist/cli/src/utils/abiResolver.js.map +1 -0
  262. package/dist/cli/src/utils/runtimeObservability.js +78 -0
  263. package/dist/cli/src/utils/runtimeObservability.js.map +1 -0
  264. package/dist/cli/src/utils/secretsResolver.js +138 -0
  265. package/dist/cli/src/utils/secretsResolver.js.map +1 -0
  266. package/dist/main/backend/services/keyringAccessor.js +40 -0
  267. package/dist/main/backend/services/keyringAccessor.js.map +1 -0
  268. package/dist/main/backend/utils/http.js +12 -0
  269. package/dist/main/backend/utils/http.js.map +1 -0
  270. package/dist/main/main/ipcHandlers/index.js +26 -0
  271. package/dist/main/main/ipcHandlers/index.js.map +1 -0
  272. package/dist/main/main/keyring/keyringmanager.js +101 -0
  273. package/dist/main/main/keyring/keyringmanager.js.map +1 -0
  274. package/dist/main/main/main.js +224 -0
  275. package/dist/main/main/main.js.map +1 -0
  276. package/dist/main/main/preload/index.js +19 -0
  277. package/dist/main/main/preload/index.js.map +1 -0
  278. package/dist/main/main/preload/licenseBridge.js +105 -0
  279. package/dist/main/main/preload/licenseBridge.js.map +1 -0
  280. package/dist/main/src/core/backends/fileBackend.js +136 -0
  281. package/dist/main/src/core/backends/fileBackend.js.map +1 -0
  282. package/dist/main/src/core/backends/memoryBackend.js +26 -0
  283. package/dist/main/src/core/backends/memoryBackend.js.map +1 -0
  284. package/dist/main/src/core/backends/systemBackend.js +86 -0
  285. package/dist/main/src/core/backends/systemBackend.js.map +1 -0
  286. package/dist/main/src/core/backends/types.js +12 -0
  287. package/dist/main/src/core/backends/types.js.map +1 -0
  288. package/dist/main/src/core/keyringManager.js +178 -0
  289. package/dist/main/src/core/keyringManager.js.map +1 -0
  290. package/dist/main/src/utils/abiResolver.js +180 -0
  291. package/dist/main/src/utils/abiResolver.js.map +1 -0
  292. package/dist/main/src/utils/runtimeObservability.js +78 -0
  293. package/dist/main/src/utils/runtimeObservability.js.map +1 -0
  294. package/dist/main/src/utils/secretsResolver.js +138 -0
  295. package/dist/main/src/utils/secretsResolver.js.map +1 -0
  296. package/docs/development-guide.md +203 -0
  297. package/docs/etherscan-chainlink-integration.md +44 -0
  298. package/docs/gnoman-20-user-manual-STANDARD-PRINT-READY.pdf +0 -0
  299. package/docs/gnoman-20-user-manual-STANDARD.pdf +0 -0
  300. package/docs/license-dev-guide.md +106 -0
  301. package/docs/robinhood-integration.md +30 -0
  302. package/docs/system-audit-gpt-guide.md +208 -0
  303. package/docs/system-robustness-audit.md +50 -0
  304. package/docs/user-guide.md +73 -0
  305. package/docs/wiki/development-guide.md +203 -0
  306. package/docs/wiki/license-dev-guide.md +106 -0
  307. package/docs/wiki/user-guide.md +73 -0
  308. package/eslint.config.js +85 -0
  309. package/gnoman2.0/.eslintrc.cjs +24 -0
  310. package/gnoman2.0/.prettierrc.json +6 -0
  311. package/gnoman2.0/CODex_TASKS.md +124 -0
  312. package/gnoman2.0/LICENSE.md +164 -0
  313. package/gnoman2.0/README.md +95 -0
  314. package/gnoman2.0/assets/GnoLogo.jpg +0 -0
  315. package/gnoman2.0/assets/self.png +0 -0
  316. package/gnoman2.0/backend/controllers/contractController.ts +49 -0
  317. package/gnoman2.0/backend/controllers/devToolsController.ts +76 -0
  318. package/gnoman2.0/backend/controllers/etherscanController.ts +59 -0
  319. package/gnoman2.0/backend/controllers/historyController.ts +7 -0
  320. package/gnoman2.0/backend/controllers/keyringController.ts +134 -0
  321. package/gnoman2.0/backend/controllers/robinhoodController.ts +80 -0
  322. package/gnoman2.0/backend/controllers/safeController.ts +167 -0
  323. package/gnoman2.0/backend/controllers/sandboxController.ts +63 -0
  324. package/gnoman2.0/backend/controllers/settingsController.ts +38 -0
  325. package/gnoman2.0/backend/controllers/walletController.ts +151 -0
  326. package/gnoman2.0/backend/index.ts +133 -0
  327. package/gnoman2.0/backend/licenses/license_public.pem +3 -0
  328. package/gnoman2.0/backend/licenses/verify_license.py +43 -0
  329. package/gnoman2.0/backend/routes/contractRoutes.ts +11 -0
  330. package/gnoman2.0/backend/routes/devToolsRoutes.ts +11 -0
  331. package/gnoman2.0/backend/routes/etherscanRoutes.ts +11 -0
  332. package/gnoman2.0/backend/routes/historyRoutes.ts +8 -0
  333. package/gnoman2.0/backend/routes/keyringRoutes.ts +25 -0
  334. package/gnoman2.0/backend/routes/licenseRoutes.ts +35 -0
  335. package/gnoman2.0/backend/routes/robinhoodRoutes.ts +22 -0
  336. package/gnoman2.0/backend/routes/runtimeRoutes.ts +29 -0
  337. package/gnoman2.0/backend/routes/safeRoutes.ts +28 -0
  338. package/gnoman2.0/backend/routes/sandboxRoutes.ts +17 -0
  339. package/gnoman2.0/backend/routes/settingsRoutes.ts +14 -0
  340. package/gnoman2.0/backend/routes/walletRoutes.ts +21 -0
  341. package/gnoman2.0/backend/services/chainlinkService.ts +65 -0
  342. package/gnoman2.0/backend/services/contractRegistryService.ts +205 -0
  343. package/gnoman2.0/backend/services/devToolsService.ts +251 -0
  344. package/gnoman2.0/backend/services/diagnosticsService.ts +350 -0
  345. package/gnoman2.0/backend/services/etherscanService.ts +152 -0
  346. package/gnoman2.0/backend/services/historyService.ts +89 -0
  347. package/gnoman2.0/backend/services/keyringAccessor.ts +4 -0
  348. package/gnoman2.0/backend/services/licenseService.ts +163 -0
  349. package/gnoman2.0/backend/services/onchain/abiRegistry.ts +57 -0
  350. package/gnoman2.0/backend/services/onchain/chainlinkClient.ts +56 -0
  351. package/gnoman2.0/backend/services/onchain/errors.ts +16 -0
  352. package/gnoman2.0/backend/services/onchain/etherscanClient.ts +94 -0
  353. package/gnoman2.0/backend/services/onchain/index.ts +76 -0
  354. package/gnoman2.0/backend/services/onchain/tenderlyRpcClient.ts +74 -0
  355. package/gnoman2.0/backend/services/onchain/types.ts +33 -0
  356. package/gnoman2.0/backend/services/onchainAutomationService.ts +424 -0
  357. package/gnoman2.0/backend/services/robinhood/auth.ts +42 -0
  358. package/gnoman2.0/backend/services/robinhood/client.ts +123 -0
  359. package/gnoman2.0/backend/services/robinhood/integrationService.ts +140 -0
  360. package/gnoman2.0/backend/services/robinhood/provider.ts +22 -0
  361. package/gnoman2.0/backend/services/robinhood/unofficialClient.ts +66 -0
  362. package/gnoman2.0/backend/services/rpcService.ts +44 -0
  363. package/gnoman2.0/backend/services/runtimeTelemetryService.ts +158 -0
  364. package/gnoman2.0/backend/services/safeConfigRepository.ts +205 -0
  365. package/gnoman2.0/backend/services/safeService.ts +588 -0
  366. package/gnoman2.0/backend/services/sandboxService.ts +157 -0
  367. package/gnoman2.0/backend/services/secureSettingsService.ts +45 -0
  368. package/gnoman2.0/backend/services/transactionHoldService.ts +223 -0
  369. package/gnoman2.0/backend/services/vanityService.ts +293 -0
  370. package/gnoman2.0/backend/services/walletService.ts +290 -0
  371. package/gnoman2.0/backend/services/walletStore.ts +179 -0
  372. package/gnoman2.0/backend/types/express-async-handler.d.ts +13 -0
  373. package/gnoman2.0/backend/types/keyring.d.ts +19 -0
  374. package/gnoman2.0/backend/utils/abiResolver.ts +208 -0
  375. package/gnoman2.0/backend/utils/http.ts +6 -0
  376. package/gnoman2.0/backend/utils/secretsResolver.ts +150 -0
  377. package/gnoman2.0/backend/utils/signer.ts +11 -0
  378. package/gnoman2.0/backend/workers/vanityWorker.ts +76 -0
  379. package/gnoman2.0/capacitor.config.ts +13 -0
  380. package/gnoman2.0/cli/gnoman.ts +424 -0
  381. package/gnoman2.0/contracts/OracleConsumer.sol +20 -0
  382. package/gnoman2.0/contracts/PriceFeedConsumer.sol +22 -0
  383. package/gnoman2.0/docs/development-guide.md +203 -0
  384. package/gnoman2.0/docs/etherscan-chainlink-integration.md +44 -0
  385. package/gnoman2.0/docs/gnoman-20-user-manual-STANDARD-PRINT-READY.pdf +0 -0
  386. package/gnoman2.0/docs/gnoman-20-user-manual-STANDARD.pdf +0 -0
  387. package/gnoman2.0/docs/license-dev-guide.md +106 -0
  388. package/gnoman2.0/docs/robinhood-integration.md +30 -0
  389. package/gnoman2.0/docs/system-audit-gpt-guide.md +208 -0
  390. package/gnoman2.0/docs/system-robustness-audit.md +50 -0
  391. package/gnoman2.0/docs/user-guide.md +73 -0
  392. package/gnoman2.0/docs/wiki/development-guide.md +203 -0
  393. package/gnoman2.0/docs/wiki/license-dev-guide.md +106 -0
  394. package/gnoman2.0/docs/wiki/user-guide.md +73 -0
  395. package/gnoman2.0/eslint.config.js +85 -0
  396. package/gnoman2.0/gnomon/__init__.py +0 -0
  397. package/gnoman2.0/gnomon/api/__init__.py +0 -0
  398. package/gnoman2.0/gnomon/api/etherscan_tracker.py +72 -0
  399. package/gnoman2.0/gnomon/core/__init__.py +0 -0
  400. package/gnoman2.0/gnomon/core/safe_manager.py +111 -0
  401. package/gnoman2.0/gnomon/tests/test_abi_resolver.py +181 -0
  402. package/gnoman2.0/gnomon/tests/test_safe_persistence_and_etherscan.py +97 -0
  403. package/gnoman2.0/gnomon/utils/__init__.py +5 -0
  404. package/gnoman2.0/gnomon/utils/abi_resolver.py +255 -0
  405. package/gnoman2.0/ios/ExportOptions.plist +16 -0
  406. package/gnoman2.0/ios/README.md +33 -0
  407. package/gnoman2.0/jest.config.ts +18 -0
  408. package/gnoman2.0/keyring/__init__.py +17 -0
  409. package/gnoman2.0/licensingServer/package.json +23 -0
  410. package/gnoman2.0/licensingServer/src/config/keys.ts +84 -0
  411. package/gnoman2.0/licensingServer/src/index.ts +30 -0
  412. package/gnoman2.0/licensingServer/src/lib/canonicalize.ts +5 -0
  413. package/gnoman2.0/licensingServer/src/lib/crypto.ts +25 -0
  414. package/gnoman2.0/licensingServer/src/lib/validate.ts +62 -0
  415. package/gnoman2.0/licensingServer/src/middleware/auth.ts +20 -0
  416. package/gnoman2.0/licensingServer/src/routes/licenses.ts +110 -0
  417. package/gnoman2.0/licensingServer/tsconfig.json +12 -0
  418. package/gnoman2.0/main/ipcHandlers/index.ts +23 -0
  419. package/gnoman2.0/main/keyring/keyringmanager.ts +154 -0
  420. package/gnoman2.0/main/main.ts +234 -0
  421. package/gnoman2.0/main/preload/index.ts +31 -0
  422. package/gnoman2.0/main/preload/licenseBridge.ts +73 -0
  423. package/gnoman2.0/modules/sandbox/abiLoader.ts +78 -0
  424. package/gnoman2.0/modules/sandbox/contractSimulator.ts +241 -0
  425. package/gnoman2.0/modules/sandbox/formBuilder.ts +16 -0
  426. package/gnoman2.0/modules/sandbox/index.ts +6 -0
  427. package/gnoman2.0/modules/sandbox/localFork.ts +129 -0
  428. package/gnoman2.0/modules/sandbox/safe.abi.json +82 -0
  429. package/gnoman2.0/modules/sandbox/sandboxManager.ts +154 -0
  430. package/gnoman2.0/modules/sandbox/types.ts +84 -0
  431. package/gnoman2.0/modules/sandbox/ui/LogViewer.tsx +30 -0
  432. package/gnoman2.0/modules/sandbox/ui/ParameterForm.tsx +49 -0
  433. package/gnoman2.0/modules/sandbox/ui/SandboxPanel.tsx +568 -0
  434. package/gnoman2.0/package-lock.json +10904 -0
  435. package/gnoman2.0/package.json +82 -0
  436. package/gnoman2.0/renderer/components/LicenseScreen.tsx +134 -0
  437. package/gnoman2.0/renderer/index.html +12 -0
  438. package/gnoman2.0/renderer/package-lock.json +4104 -0
  439. package/gnoman2.0/renderer/package.json +35 -0
  440. package/gnoman2.0/renderer/postcss.config.cjs +6 -0
  441. package/gnoman2.0/renderer/src/App.tsx +229 -0
  442. package/gnoman2.0/renderer/src/context/KeyringContext.tsx +217 -0
  443. package/gnoman2.0/renderer/src/context/SafeContext.tsx +49 -0
  444. package/gnoman2.0/renderer/src/context/ThemeContext.tsx +60 -0
  445. package/gnoman2.0/renderer/src/context/WalletContext.tsx +50 -0
  446. package/gnoman2.0/renderer/src/context/main.tsx +18 -0
  447. package/gnoman2.0/renderer/src/main.tsx +18 -0
  448. package/gnoman2.0/renderer/src/pages/Contracts.tsx +482 -0
  449. package/gnoman2.0/renderer/src/pages/Dashboard.tsx +653 -0
  450. package/gnoman2.0/renderer/src/pages/DeveloperTools.tsx +270 -0
  451. package/gnoman2.0/renderer/src/pages/History.tsx +149 -0
  452. package/gnoman2.0/renderer/src/pages/Keyring.tsx +449 -0
  453. package/gnoman2.0/renderer/src/pages/Safes.tsx +1089 -0
  454. package/gnoman2.0/renderer/src/pages/Sandbox.tsx +146 -0
  455. package/gnoman2.0/renderer/src/pages/Settings.tsx +871 -0
  456. package/gnoman2.0/renderer/src/pages/Wallets.tsx +752 -0
  457. package/gnoman2.0/renderer/src/pages/WikiGuide.tsx +75 -0
  458. package/gnoman2.0/renderer/src/styles.css +32 -0
  459. package/gnoman2.0/renderer/src/types/gnoman.d.ts +9 -0
  460. package/gnoman2.0/renderer/src/types/license.ts +8 -0
  461. package/gnoman2.0/renderer/src/types/safevault.d.ts +17 -0
  462. package/gnoman2.0/renderer/src/utils/backend.ts +88 -0
  463. package/gnoman2.0/renderer/tailwind.config.cjs +8 -0
  464. package/gnoman2.0/renderer/tsconfig.json +13 -0
  465. package/gnoman2.0/renderer/tsconfig.node.json +9 -0
  466. package/gnoman2.0/renderer/vite.config.ts +19 -0
  467. package/gnoman2.0/requests/__init__.py +35 -0
  468. package/gnoman2.0/scripts/build-ios.sh +30 -0
  469. package/gnoman2.0/scripts/copyBackendAssets.js +24 -0
  470. package/gnoman2.0/scripts/copyRenderer.js +87 -0
  471. package/gnoman2.0/scripts/launchElectron.js +51 -0
  472. package/gnoman2.0/src/core/backends/fileBackend.ts +154 -0
  473. package/gnoman2.0/src/core/backends/memoryBackend.ts +27 -0
  474. package/gnoman2.0/src/core/backends/systemBackend.ts +66 -0
  475. package/gnoman2.0/src/core/backends/types.ts +17 -0
  476. package/gnoman2.0/src/core/keyringManager.ts +208 -0
  477. package/gnoman2.0/src/utils/abiCache/.gitkeep +0 -0
  478. package/gnoman2.0/src/utils/abiResolver.ts +200 -0
  479. package/gnoman2.0/src/utils/runtimeObservability.ts +110 -0
  480. package/gnoman2.0/src/utils/secretsResolver.ts +144 -0
  481. package/gnoman2.0/tests/chainlinkService.test.ts +32 -0
  482. package/gnoman2.0/tests/diagnosticsService.test.ts +68 -0
  483. package/gnoman2.0/tests/etherscanController.test.ts +99 -0
  484. package/gnoman2.0/tests/etherscanService.test.ts +116 -0
  485. package/gnoman2.0/tests/keyringManager.test.ts +135 -0
  486. package/gnoman2.0/tests/onchainToolkit.test.ts +71 -0
  487. package/gnoman2.0/tests/robinhoodClient.test.ts +54 -0
  488. package/gnoman2.0/tests/robinhoodController.test.ts +81 -0
  489. package/gnoman2.0/tests/robinhoodIntegrationService.test.ts +50 -0
  490. package/gnoman2.0/tests/safeServicePersistence.test.ts +81 -0
  491. package/gnoman2.0/tests/test_contract_sandbox/sandbox.test.js +407 -0
  492. package/gnoman2.0/tests/walletController.test.ts +57 -0
  493. package/gnoman2.0/tsconfig.backend.json +7 -0
  494. package/gnoman2.0/tsconfig.cli.json +7 -0
  495. package/gnoman2.0/tsconfig.json +18 -0
  496. package/gnoman2.0/tsconfig.main.json +7 -0
  497. package/gnomon/__init__.py +0 -0
  498. package/gnomon/__pycache__/__init__.cpython-310.pyc +0 -0
  499. package/gnomon/api/__init__.py +0 -0
  500. package/gnomon/api/__pycache__/__init__.cpython-310.pyc +0 -0
  501. package/gnomon/api/__pycache__/etherscan_tracker.cpython-310.pyc +0 -0
  502. package/gnomon/api/etherscan_tracker.py +72 -0
  503. package/gnomon/core/__init__.py +0 -0
  504. package/gnomon/core/safe_manager.py +111 -0
  505. package/gnomon/tests/__pycache__/test_safe_persistence_and_etherscan.cpython-310-pytest-8.3.3.pyc +0 -0
  506. package/gnomon/tests/test_abi_resolver.py +181 -0
  507. package/gnomon/tests/test_safe_persistence_and_etherscan.py +97 -0
  508. package/gnomon/utils/__init__.py +5 -0
  509. package/gnomon/utils/abi_resolver.py +255 -0
  510. package/ios/ExportOptions.plist +16 -0
  511. package/ios/README.md +33 -0
  512. package/jest.config.ts +18 -0
  513. package/keyring/__init__.py +17 -0
  514. package/launcher.sh +57 -0
  515. package/license.env +2 -0
  516. package/licensingServer/package.json +23 -0
  517. package/licensingServer/src/config/keys.ts +84 -0
  518. package/licensingServer/src/index.ts +30 -0
  519. package/licensingServer/src/lib/canonicalize.ts +5 -0
  520. package/licensingServer/src/lib/crypto.ts +25 -0
  521. package/licensingServer/src/lib/validate.ts +62 -0
  522. package/licensingServer/src/middleware/auth.ts +20 -0
  523. package/licensingServer/src/routes/licenses.ts +110 -0
  524. package/licensingServer/tsconfig.json +12 -0
  525. package/main/ipcHandlers/index.ts +23 -0
  526. package/main/keyring/keyringmanager.ts +154 -0
  527. package/main/main.ts +234 -0
  528. package/main/preload/index.ts +31 -0
  529. package/main/preload/licenseBridge.ts +73 -0
  530. package/modules/sandbox/abiLoader.ts +78 -0
  531. package/modules/sandbox/contractSimulator.ts +241 -0
  532. package/modules/sandbox/formBuilder.ts +16 -0
  533. package/modules/sandbox/index.ts +6 -0
  534. package/modules/sandbox/localFork.ts +129 -0
  535. package/modules/sandbox/safe.abi.json +82 -0
  536. package/modules/sandbox/sandboxManager.ts +154 -0
  537. package/modules/sandbox/types.ts +84 -0
  538. package/modules/sandbox/ui/LogViewer.tsx +30 -0
  539. package/modules/sandbox/ui/ParameterForm.tsx +49 -0
  540. package/modules/sandbox/ui/SandboxPanel.tsx +568 -0
  541. package/package.json +82 -0
  542. package/renderer/components/LicenseScreen.tsx +134 -0
  543. package/renderer/index.html +12 -0
  544. package/renderer/package-lock.json +4104 -0
  545. package/renderer/package.json +35 -0
  546. package/renderer/postcss.config.cjs +6 -0
  547. package/renderer/src/App.tsx +229 -0
  548. package/renderer/src/context/KeyringContext.tsx +217 -0
  549. package/renderer/src/context/SafeContext.tsx +49 -0
  550. package/renderer/src/context/ThemeContext.tsx +60 -0
  551. package/renderer/src/context/WalletContext.tsx +50 -0
  552. package/renderer/src/context/main.tsx +18 -0
  553. package/renderer/src/main.tsx +18 -0
  554. package/renderer/src/pages/Contracts.tsx +482 -0
  555. package/renderer/src/pages/Dashboard.tsx +653 -0
  556. package/renderer/src/pages/DeveloperTools.tsx +270 -0
  557. package/renderer/src/pages/History.tsx +149 -0
  558. package/renderer/src/pages/Keyring.tsx +449 -0
  559. package/renderer/src/pages/Safes.tsx +1089 -0
  560. package/renderer/src/pages/Sandbox.tsx +146 -0
  561. package/renderer/src/pages/Settings.tsx +871 -0
  562. package/renderer/src/pages/Wallets.tsx +752 -0
  563. package/renderer/src/pages/WikiGuide.tsx +75 -0
  564. package/renderer/src/styles.css +32 -0
  565. package/renderer/src/types/gnoman.d.ts +9 -0
  566. package/renderer/src/types/license.ts +8 -0
  567. package/renderer/src/types/safevault.d.ts +17 -0
  568. package/renderer/src/utils/backend.ts +88 -0
  569. package/renderer/tailwind.config.cjs +8 -0
  570. package/renderer/tsconfig.json +13 -0
  571. package/renderer/tsconfig.node.json +9 -0
  572. package/renderer/vite.config.ts +19 -0
  573. package/requests/__init__.py +35 -0
  574. package/requests/__pycache__/__init__.cpython-310.pyc +0 -0
  575. package/scripts/build-ios.sh +30 -0
  576. package/scripts/copyBackendAssets.js +24 -0
  577. package/scripts/copyRenderer.js +87 -0
  578. package/scripts/deployBackend.sh +24 -0
  579. package/scripts/launchElectron.js +51 -0
  580. package/src/core/backends/fileBackend.ts +154 -0
  581. package/src/core/backends/memoryBackend.ts +27 -0
  582. package/src/core/backends/systemBackend.ts +66 -0
  583. package/src/core/backends/types.ts +17 -0
  584. package/src/core/keyringManager.ts +208 -0
  585. package/src/utils/abiCache/.gitkeep +0 -0
  586. package/src/utils/abiResolver.ts +200 -0
  587. package/src/utils/runtimeObservability.ts +110 -0
  588. package/src/utils/secretsResolver.ts +144 -0
  589. package/tests/chainlinkService.test.ts +32 -0
  590. package/tests/diagnosticsService.test.ts +68 -0
  591. package/tests/etherscanController.test.ts +99 -0
  592. package/tests/etherscanService.test.ts +116 -0
  593. package/tests/keyringManager.test.ts +135 -0
  594. package/tests/onchainToolkit.test.ts +71 -0
  595. package/tests/robinhoodClient.test.ts +54 -0
  596. package/tests/robinhoodController.test.ts +81 -0
  597. package/tests/robinhoodIntegrationService.test.ts +50 -0
  598. package/tests/safeServicePersistence.test.ts +81 -0
  599. package/tests/test_contract_sandbox/sandbox.test.js +407 -0
  600. package/tests/walletController.test.ts +57 -0
  601. package/touch +14 -0
  602. package/tsconfig.backend.json +7 -0
  603. package/tsconfig.cli.json +7 -0
  604. package/tsconfig.json +18 -0
  605. package/tsconfig.main.json +7 -0
  606. package/webhook-shim.js +50 -0
@@ -0,0 +1,73 @@
1
+ @@ -109,57 +109,59 @@ The renderer surfaces the core workflows through a set of tabs defined in
2
+ `GET /api/safes/:address/owners` and `GET /api/safes/:address/transactions/held`
3
+ to populate data and to surface aggregated hold counters plus the effective
4
+ policy (global defaults + Safe override).
5
+ - Tune Safe-specific hold duration and enable/disable flags directly from the
6
+ page. Changes are persisted to SQLite (`holds.sqlite`) and mirrored back via
7
+ `POST /api/safes/:address/hold`.
8
+ - Held transactions reflect entries tracked by the SQLite-backed hold service in
9
+ `backend/services/transactionHoldService.ts`, complete with live countdowns
10
+ and manual release controls.
11
+
12
+ ### 4.4 Sandbox
13
+ - Toggle between the legacy Safe callStatic form and the advanced sandbox panel
14
+ in `modules/sandbox/ui/SandboxPanel.tsx`.
15
+ - Upload or paste ABIs, select contract functions, provide parameters, and run
16
+ simulations via `POST /api/sandbox/contract/simulate`.
17
+ - Replay previous simulations pulled from `GET /api/sandbox/contract/history`
18
+ and optionally run them against a local fork started with
19
+ `POST /api/sandbox/fork/start` (defaults to the `anvil` command).
20
+ - Provide a `forkRpcUrl` to execute simulations against a remote Hardhat/Anvil
21
+ fork when no managed local fork is available—the backend automatically falls
22
+ back to standard RPC calls if neither option is configured.
23
+ - Use the Safe-focused tab to call `POST /api/sandbox/call-static` for quick
24
+ guard checks.
25
+
26
+ ### 4.5 Keyring
27
+ - Lists secrets registered through the Electron IPC bridge (`window.gnoman.invoke('keyring:list')`).
28
+ - Proxies every request to the backend AES keyring service (`/api/keyring/*`),
29
+ which stores encrypted payloads under `.gnoman/keyrings/<service>.json`.
30
+ - Reveals a selected secret via `keyring:get`, which maps to `POST /api/keyring/get`.
31
+ If the `keyring` module cannot load (for example, inside a sandbox), the backend
32
+ switches to an in-memory store and logs a warning so you know the data is
33
+ ephemeral.
34
+ - Encrypt, reveal, and delete secrets entirely inside the renderer. Each UI action
35
+ forwards to `/api/keyring/*`, guaranteeing parity with the legacy CLI while
36
+ capturing an auditable activity feed for operators.
37
+ - Switch between keyring services (for example `production`, `staging`, or
38
+ `aes`) without leaving the UI. The currently active service is displayed in the
39
+ global header and sidebar so you never lose track of your namespace.
40
+ - The backend still falls back to an in-memory store if the native `keyring`
41
+ module is unavailable. The UI highlights this state and keeps secrets scoped to
42
+ the session, while the CLI bridge remains for legacy automation only.
43
+
44
+ ### 4.6 License & Settings
45
+ - The activation screen uses the preload bridge (`window.safevault`) to run the
46
+ Python verifier (`backend/licenses/verify_license.py`) entirely offline.
47
+ - Successful validation writes `.safevault/license.env` with the raw token and a
48
+ `VALIDATED_AT` timestamp. The preload re-verifies this token on every launch.
49
+ - Settings exposes the stored license metadata, the global transaction hold
50
+ toggle/duration (persisted in the AES keyring via `SAFE_TX_HOLD_ENABLED`), and a
51
+ vanity wallet generator surface with live job dashboards.
52
+ - Vanity jobs are executed in worker threads, persisted to `.gnoman/vanity-jobs.json`
53
+ for auditability, and only expose mnemonic aliases so secrets stay in the
54
+ secure store.
55
+ - For automation, the backend still accepts `POST /api/license`, which stores a
56
+ JSON record in `.gnoman/license.json`. This endpoint exists for legacy flows
57
+ that expect the previous storage format.
58
+
59
+ ### 4.7 Wiki Guide
60
+ - Renders Markdown content from `docs/wiki/`, including the mirrored developer
61
+ and licensing guides.
62
+
63
+ ---
64
+
65
+ ## 5. Offline licensing quick reference
66
+
67
+ | Task | Command |
68
+
69
+ ### 4.8 Integrations & Runtime Features (Settings)
70
+ - Settings now includes a dedicated **Integrations & Runtime Features** section that surfaces one-glance enablement + reason status for `safe`, `etherscan`, and `robinhood`.
71
+ - Status values come from `GET /api/runtime/capabilities`, which reflects backend runtime decisions instead of UI guesses.
72
+ - Robinhood credential management is grouped under **Integration Configuration: Robinhood Crypto Trading API** to keep integration setup separate from license/hold/vanity controls.
73
+ - Runtime diagnostics remain available under **Runtime Diagnostics** for detailed ABI cache activity, secrets source status, Safe runtime state, and Robinhood request telemetry.
@@ -0,0 +1,85 @@
1
+ import js from '@eslint/js';
2
+ import globals from 'globals';
3
+ import tsParser from '@typescript-eslint/parser';
4
+ import tsPlugin from '@typescript-eslint/eslint-plugin';
5
+ import reactPlugin from 'eslint-plugin-react';
6
+ import eslintConfigPrettier from 'eslint-config-prettier';
7
+
8
+ export default [
9
+ {
10
+ ignores: ['dist/**', 'renderer/dist/**', 'node_modules/**']
11
+ },
12
+ {
13
+ files: ['**/*.{ts,tsx,js,jsx}'],
14
+ languageOptions: {
15
+ parser: tsParser,
16
+ parserOptions: {
17
+ ecmaVersion: 2020,
18
+ sourceType: 'module',
19
+ ecmaFeatures: {
20
+ jsx: true
21
+ }
22
+ },
23
+ globals: {
24
+ ...globals.es2021,
25
+ ...globals.node
26
+ }
27
+ },
28
+ plugins: {
29
+ '@typescript-eslint': tsPlugin,
30
+ react: reactPlugin
31
+ },
32
+ rules: {
33
+ ...js.configs.recommended.rules,
34
+ ...tsPlugin.configs.recommended.rules,
35
+ ...reactPlugin.configs.recommended.rules,
36
+ '@typescript-eslint/no-unused-vars': [
37
+ 'error',
38
+ { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }
39
+ ],
40
+ 'react/react-in-jsx-scope': 'off'
41
+ },
42
+ settings: {
43
+ react: {
44
+ version: 'detect'
45
+ }
46
+ }
47
+ },
48
+ {
49
+ files: ['**/*.{ts,tsx}'],
50
+ rules: {
51
+ 'no-undef': 'off'
52
+ }
53
+ },
54
+ {
55
+ files: ['renderer/**/*.{ts,tsx,js,jsx}'],
56
+ languageOptions: {
57
+ globals: {
58
+ ...globals.es2021,
59
+ ...globals.browser
60
+ }
61
+ }
62
+ },
63
+ {
64
+ files: ['modules/**/*.{ts,tsx,js,jsx}'],
65
+ languageOptions: {
66
+ globals: {
67
+ ...globals.es2021,
68
+ ...globals.browser
69
+ }
70
+ }
71
+ },
72
+ {
73
+ files: ['**/*.d.ts'],
74
+ rules: {
75
+ '@typescript-eslint/no-explicit-any': 'off'
76
+ }
77
+ },
78
+ {
79
+ files: ['**/*.js'],
80
+ rules: {
81
+ '@typescript-eslint/no-var-requires': 'off'
82
+ }
83
+ },
84
+ eslintConfigPrettier
85
+ ];
@@ -0,0 +1,24 @@
1
+ module.exports = {
2
+ root: true,
3
+ parser: '@typescript-eslint/parser',
4
+ parserOptions: {
5
+ ecmaVersion: 2020,
6
+ sourceType: 'module'
7
+ },
8
+ env: {
9
+ node: true,
10
+ browser: true,
11
+ es2020: true
12
+ },
13
+ plugins: ['@typescript-eslint', 'react'],
14
+ extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react/recommended', 'prettier'],
15
+ settings: {
16
+ react: {
17
+ version: 'detect'
18
+ }
19
+ },
20
+ ignorePatterns: ['dist', 'renderer/dist', 'renderer/node_modules'],
21
+ rules: {
22
+ 'react/react-in-jsx-scope': 'off'
23
+ }
24
+ };
@@ -0,0 +1,6 @@
1
+ {
2
+ "singleQuote": true,
3
+ "semi": true,
4
+ "trailingComma": "es5",
5
+ "printWidth": 100
6
+ }
@@ -0,0 +1,124 @@
1
+ Codex: You are upgrading GNOMAN 2.0 into a fully self-sufficient, multi-platform application.
2
+
3
+ Your tasks:
4
+
5
+ ────────────────────────────────────────
6
+ 1) CORE ARCHITECTURE
7
+ ────────────────────────────────────────
8
+ Convert GNOMAN 2.0 into a modular, self-contained system with:
9
+
10
+ - A unified backend service (Node.js, Python, or Rust — use existing project language)
11
+ - A cross-platform UI layer
12
+ - A shared API layer for all platforms
13
+ - A plugin system for future extensions
14
+
15
+ Ensure the backend can run:
16
+ - As a local service
17
+ - As a remote server
18
+ - As a bundled embedded service inside desktop/mobile apps
19
+
20
+ ────────────────────────────────────────
21
+ 2) CROSS-PLATFORM BUILD TARGETS
22
+ ────────────────────────────────────────
23
+ Add build support for:
24
+
25
+ ✔ Windows (x64 + ARM64)
26
+ ✔ Linux (x64 + ARM64)
27
+ ✔ macOS (Intel + Apple Silicon)
28
+ ✔ Android (APK)
29
+ ✔ iOS (IPA) — MOST IMPORTANT
30
+
31
+ Use the following technologies:
32
+
33
+ Desktop:
34
+ - Electron OR Tauri (prefer Tauri for smaller footprint)
35
+ Mobile:
36
+ - React Native OR Flutter (choose whichever integrates best with existing code)
37
+ Backend:
38
+ - Package backend as a standalone binary AND as a library callable from mobile/desktop.
39
+
40
+ ────────────────────────────────────────
41
+ 3) SELF-SUFFICIENCY REQUIREMENTS
42
+ ────────────────────────────────────────
43
+ GNOMAN 2.0 must run with:
44
+
45
+ - No external dependencies except:
46
+ - Configured APIs (Etherscan, Chainlink, Tenderly, etc.)
47
+ - Local database (SQLite recommended)
48
+ - Local caching layer
49
+ - Built-in update checker
50
+ - Built-in logging + diagnostics
51
+ - Built-in configuration UI
52
+
53
+ Add:
54
+ - Auto-migration for DB schema
55
+ - Auto-recovery if config is missing or corrupted
56
+
57
+ ────────────────────────────────────────
58
+ 4) SERVER MODE
59
+ ────────────────────────────────────────
60
+ Add a “server mode” where GNOMAN 2.0 can run as:
61
+
62
+ - A headless daemon
63
+ - A system service (systemd, Windows service, macOS launchd)
64
+ - A remote API endpoint
65
+
66
+ Expose:
67
+ - REST API
68
+ - WebSocket events
69
+ - Authentication (token-based)
70
+
71
+ ────────────────────────────────────────
72
+ 5) MOBILE (iOS PRIORITY)
73
+ ────────────────────────────────────────
74
+ For iOS:
75
+
76
+ - Use React Native or Flutter with a native bridge to the backend library.
77
+ - Backend must compile to iOS ARM64.
78
+ - Provide a local HTTP or direct native bridge for API calls.
79
+ - Ensure sandbox-safe storage for config + DB.
80
+ - Add offline mode.
81
+ - Add background task support where allowed by iOS.
82
+
83
+ For Android:
84
+ - Mirror the iOS architecture.
85
+ - Use the same shared backend library.
86
+
87
+ ────────────────────────────────────────
88
+ 6) INSTALLERS + PACKAGING
89
+ ────────────────────────────────────────
90
+ Generate installers for:
91
+
92
+ Windows:
93
+ - MSI or EXE installer
94
+ Linux:
95
+ - .deb, .rpm, AppImage
96
+ macOS:
97
+ - .dmg or .pkg
98
+ Android:
99
+ - .apk
100
+ iOS:
101
+ - Xcode project + build scripts for IPA generation
102
+
103
+ ────────────────────────────────────────
104
+ 7) CONFIG + ENV
105
+ ────────────────────────────────────────
106
+ Wire in all existing .env keys and ensure:
107
+
108
+ - Desktop apps read from local config file
109
+ - Mobile apps use secure storage
110
+ - Server mode uses environment variables
111
+
112
+ ────────────────────────────────────────
113
+ 8) VALIDATION
114
+ ────────────────────────────────────────
115
+ After implementing:
116
+
117
+ - Confirm all platforms build successfully
118
+ - Confirm backend runs identically on all platforms
119
+ - Confirm mobile apps can call the backend
120
+ - Confirm server mode works remotely
121
+ - Confirm no breaking changes to existing features
122
+
123
+ Do NOT redesign existing logic.
124
+ Extend GNOMAN 2.0 to be fully self-sufficient and multi-platform.
@@ -0,0 +1,164 @@
1
+ # **PROPRIETARY LICENSE AGREEMENT — GNOMAN 2.0 SECURITY & ADMINISTRATION PLATFORM**
2
+
3
+ **Version:** 1.0  **Effective Date:** 10.26.2025
4
+
5
+ **Licensor:** **C. Hirschauer**, an individual residing in Iowa (“Licensor”)
6
+
7
+ **Licensee:** The purchaser, recipient, or authorized operator of a valid GNOMAN 2.0 license (“Licensee”).
8
+
9
+ ---
10
+
11
+ ## 1. Definitions
12
+
13
+ 1.1 **“Software”** means the GNOMAN 2.0 desktop application, associated executables, libraries, Electron/React renderer, backend services, modules, APIs, plug-ins, data stores, simulation tools, key-management utilities, documentation, and any updates, patches, or derivatives provided by Licensor (including object and source code).
14
+ 1.2 **“Documentation”** means all user guides, technical manuals, wiki pages, and other written or electronic materials accompanying the Software.
15
+ 1.3 **“Personal License”** means a non-transferable license limited to one natural person for personal or educational use only.
16
+ 1.4 **“Business License”** means a non-exclusive license to deploy and operate the Software for the internal operations of one legal entity (including its employees and contractors under NDA), subject to this Agreement.
17
+ 1.5 **“License Fee”** means the non-refundable payment required to obtain a License.
18
+ 1.6 **“License Token”** means a digitally-signed activation string generated by Licensor’s Ed25519 private key and verified by the Software offline using its embedded public key.
19
+
20
+ ---
21
+
22
+ ## 2. Grant of License — Limited and Conditional
23
+
24
+ 2.1 **Personal License.** Upon full payment and acceptance of this Agreement, Licensor grants Licensee a limited, non-transferable, non-sublicensable, revocable license to install and use one copy of the Software solely for personal, non-commercial purposes on a single device.
25
+ 2.2 **Business License.** Upon full payment and compliance, Licensor grants Licensee a limited, non-transferable (except as provided in §16), non-sublicensable, revocable license to use the Software solely for internal business operations on the number of devices or environments purchased.
26
+ 2.3 **Reservation of Rights.** All rights not expressly granted remain with Licensor. The Software and Documentation are licensed, not sold.
27
+
28
+ ---
29
+
30
+ ## 3. Prohibited Uses — Zero Tolerance
31
+
32
+ Licensee shall not, and shall not permit others to:
33
+ a) Copy, distribute, rent, lease, sell, sublicense, or transfer the Software or Documentation;
34
+ b) Reverse-engineer, decompile, disassemble, or modify the Software (except as required by law after notice to Licensor);
35
+ c) Use the Software to offer third-party services (e.g., hosting, SaaS, multi-tenant management) without a separate commercial agreement;
36
+ d) Remove or obscure any copyright or proprietary markings;
37
+ e) Bypass, disable, or tamper with license-verification or cryptographic controls, including Ed25519 signature checks or token validation;
38
+ f) Combine the Software with open-source components in a manner that would require disclosure of its source; or
39
+ g) Use the Software in violation of any law or third-party rights.
40
+
41
+ ---
42
+
43
+ ## 4. Delivery, Activation, and Fees
44
+
45
+ 4.1 **Delivery.** The Software is delivered electronically after receipt of payment and identity verification (if applicable).
46
+ 4.2 **Fees.** License Fees are non-refundable unless expressly agreed in writing. Failure to pay when due constitutes material breach.
47
+ 4.3 **Activation.** Each license requires a valid offline License Token digitally signed by Licensor. The Software verifies the token using its embedded public key without internet communication. Tampering with this mechanism voids the License.
48
+
49
+ ---
50
+
51
+ ## 5. Ownership and Intellectual Property
52
+
53
+ Licensor retains all title, ownership, and intellectual-property rights in the Software and Documentation. This Agreement conveys only the limited rights expressly granted.
54
+
55
+ ---
56
+
57
+ ## 6. Audit and Verification
58
+
59
+ Licensor may request reasonable evidence of proper license activation or valid License Token(s). Licensee must cooperate by providing token files or logs on request. Non-compliance is a material breach.
60
+
61
+ ---
62
+
63
+ ## 7. Support and Updates
64
+
65
+ Support or maintenance is not included unless purchased separately. Licensor may release updates at its sole discretion. Nothing herein obligates Licensor to continue development or compatibility.
66
+
67
+ ---
68
+
69
+ ## 8. Confidentiality
70
+
71
+ Licensee shall treat the Software, Documentation, and licensing utilities as confidential, using no less care than for its own confidential information.
72
+
73
+ ---
74
+
75
+ ## 9. Warranties and Disclaimers
76
+
77
+ 9.1 **Limited Warranty.** For thirty (30) days after delivery, Licensor warrants the Software will substantially conform to the Documentation. Remedy: repair or replacement at Licensor’s option.
78
+ 9.2 **Disclaimer.** EXCEPT AS SET FORTH ABOVE, THE SOFTWARE IS PROVIDED “AS IS.” ALL OTHER WARRANTIES, EXPRESS OR IMPLIED (INCLUDING MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE), ARE DISCLAIMED TO THE MAXIMUM EXTENT PERMITTED BY LAW.
79
+
80
+ ---
81
+
82
+ ## 10. Indemnification
83
+
84
+ Licensee shall indemnify and hold Licensor harmless from all claims, damages, or expenses (including attorneys’ fees) arising from Licensee’s use or breach of this Agreement.
85
+
86
+ ---
87
+
88
+ ## 11. Limitation of Liability
89
+
90
+ TO THE MAXIMUM EXTENT PERMITTED BY LAW, LICENSOR WILL NOT BE LIABLE FOR INDIRECT, INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES (INCLUDING LOSS OF PROFITS OR DATA). TOTAL LIABILITY WILL NOT EXCEED THE LICENSE FEE PAID BY LICENSEE.
91
+
92
+ ---
93
+
94
+ ## 12. Remedies and Equitable Relief
95
+
96
+ 12.1 **Injunctive Relief.** Breach of Sections 3, 5, or 8 causes irreparable harm. Licensor may seek injunction or specific performance without bond.
97
+ 12.2 **Liquidated Damages.** Each intentional breach of Sections 3 or 8 incurs liquidated damages of USD $50,000 (or greater actual damages proven), plus costs and attorneys’ fees.
98
+
99
+ ---
100
+
101
+ ## 13. Enforcement and Attorneys’ Fees
102
+
103
+ The prevailing party in any enforcement action arising from this Agreement is entitled to recover reasonable attorneys’ fees and costs, including appeals and collection.
104
+
105
+ ---
106
+
107
+ ## 14. Termination
108
+
109
+ Upon any material breach, this Agreement terminates immediately. Licensee must cease all use, destroy all copies, and certify destruction in writing. Licensor may invalidate tokens or disable verification where legally permitted.
110
+
111
+ ---
112
+
113
+ ## 15. Export and Compliance
114
+
115
+ Licensee shall comply with all export, import, and sanctions laws. The Software shall not be exported to prohibited regions or persons.
116
+
117
+ ---
118
+
119
+ ## 16. Transfer and Assignment
120
+
121
+ Licenses are non-transferable without Licensor’s written consent. Business License assignment to a successor in interest requires Licensor’s prior approval and assumption of this Agreement.
122
+
123
+ ---
124
+
125
+ ## 17. Severability
126
+
127
+ If any provision is held invalid, the remainder remains in force. The parties shall replace invalid terms with ones closest in intent and effect.
128
+
129
+ ---
130
+
131
+ ## 18. Governing Law and Venue
132
+
133
+ This Agreement is governed by the laws of [STATE/COUNTRY OF RESIDENCE]. Exclusive venue for disputes shall be the state or federal courts of that jurisdiction. Each party waives objection to inconvenient forum.
134
+
135
+ ---
136
+
137
+ ## 19. Notices
138
+
139
+ All notices must be in writing and sent to the addresses listed in the invoice or order. Notices take effect upon receipt.
140
+
141
+ ---
142
+
143
+ ## 20. Entire Agreement and Amendment
144
+
145
+ This document is the entire agreement regarding the Software and supersedes all prior understandings. Amendments require a written instrument signed by both parties.
146
+
147
+ ---
148
+
149
+ ## 21. Miscellaneous
150
+
151
+ 21.1 **No Implied Licenses.** None are granted by implication or estoppel.
152
+ 21.2 **Publicity.** Licensee shall not use Licensor’s name or trademarks without written consent.
153
+ 21.3 **Survival.** Ownership, confidentiality, indemnity, liability, and other provisions that by their nature should survive termination will do so.
154
+
155
+ ---
156
+
157
+ ## 22. Signature and Acceptance
158
+
159
+ By installing, activating, or using GNOMAN 2.0, Licensee acknowledges having read and agreed to be bound by this Agreement.
160
+ Activation of the Software with a valid Ed25519-signed License Token constitutes electronic acceptance of this Agreement.
161
+
162
+ ---
163
+
164
+ *(End of Agreement — GNOMAN 2.0 v1.0 — Licensor: C. Hirschauer, Individual)*
@@ -0,0 +1,95 @@
1
+ ![Sheen Banner](https://github.com/74Thirsty/74Thirsty/blob/main/assets/gnoman.svg)
2
+
3
+ GNOMAN 2.0 is a cross-platform Electron desktop application that combines a local Express API with a React
4
+ renderer to manage Gnosis Safe workflows from a single secured workspace. The project is written entirely
5
+ in TypeScript and ships with tooling for simulating Safe transactions, managing wallets, and enforcing
6
+ offline license policies before operators can act on production Safes.
7
+
8
+ ## Graphical-first operations
9
+
10
+ The graphical client is the primary control plane. Every historic `gnoman` CLI capability now maps to a
11
+ dedicated UI workflow—keyring management, wallet administration, Safe tooling, sandbox orchestration, and
12
+ configuration live behind buttons, panels, and activity feeds. The CLI continues to exist for legacy
13
+ automation, but receives no new features and is treated as a fallback transport only.
14
+
15
+ ## Tech stack
16
+
17
+ - **Electron 28** for the desktop shell, preload isolation, and IPC keyring bridge (`main/`).
18
+ - **Electron 28** for the desktop shell, preload isolation, and IPC keyring bridge (`main/`). Legacy IPC
19
+ handlers remain for backwards compatibility but all user journeys originate in the renderer.
20
+ - **Express** with TypeScript for the local API that powers wallet, Safe, sandbox, and license flows
21
+ (`backend/`).
22
+ - **React + Tailwind (Vite)** for the renderer UI (`renderer/`).
23
+ - **Better SQLite3** for persisting transaction holds and vanity job history under a local
24
+ `.gnoman/` directory.
25
+ - **Ethers v6** for wallet creation, encryption, and contract simulation utilities.
26
+
27
+ ## Repository layout
28
+
29
+ ```
30
+ / (root)
31
+ ├── backend/ # Express API, services, and route handlers
32
+ ├── main/ # Electron entrypoint, preload, and AES keyring integration
33
+ ├── modules/sandbox/ # Shared sandbox engine, ABI parser, local fork helper, and UI panel
34
+ ├── renderer/ # React renderer bundled with Vite
35
+ ├── scripts/ # Build utilities for packaging renderer output and launching Electron
36
+ ├── docs/ # Markdown documentation surfaced in the app and project wiki
37
+ ├── tests/ # API smoke tests and fixtures
38
+ ├── package.json # Root npm scripts and dependencies
39
+ └── tsconfig*.json # TypeScript project references for each process
40
+ ```
41
+
42
+ ## Prerequisites
43
+
44
+ | Requirement | Notes |
45
+ @@ -155,47 +163,48 @@ The sandbox writes JSON logs to `modules/sandbox/logs/` and coordinates optional
46
+
47
+ Validated tokens are re-verified at startup through the preload bridge and persist as a simple
48
+ `.safevault/license.env` file that contains the raw token and a timestamp indicating when the
49
+ desktop client last confirmed the signature. The REST endpoint continues to mirror metadata to
50
+ `.gnoman/license.json` for legacy automation that reads the old format.
51
+
52
+ ### Offline license workflow (developer tooling)
53
+
54
+ | Purpose | Command | Output |
55
+ | --- | --- | --- |
56
+ | Generate keypair (one-time) | `python backend/licenses/make_keys.py` | `license_private.pem`, `license_public.pem` |
57
+ | Generate license token | `python backend/licenses/gen_license.py --id "Customer"` | Signed token (raw + Base32) |
58
+ | Embed public key | Ship the checked-in `backend/licenses/license_public.pem` alongside the backend build | Used by verifier |
59
+ | Validate offline | `python -c "from backend.licenses.verify_license import verify_token; print(verify_token('backend/licenses/license_public.pem', '<token>', 'GNOMAN', '2.0.0'))"` | Prints `True`/`False` |
60
+
61
+ ## Desktop application features
62
+
63
+ - **Dashboard** – high-level overview of stored wallets and the currently connected Safe.
64
+ - **Wallets** – generate encrypted wallets with optional aliases, hidden flag, and password overrides, then
65
+ list stored metadata.
66
+ - **Safes** – connect to a Safe, review owners/modules, audit hold policy summaries, and monitor queued
67
+ transactions with live countdowns.
68
+ - **Sandbox** – switch between the legacy Safe callStatic form and the advanced sandbox panel powered by
69
+ `modules/sandbox/ui`. Upload or paste ABIs, choose functions, provide parameters, replay historical
70
+ simulations, and manage an optional local fork.
71
+ - **Keyring** – interact with the Electron IPC bridge (`window.gnoman`) to list and reveal secrets stored
72
+ in the AES keyring service (with a logged warning and in-memory fallback when the `keyring` module is unavailable).
73
+ - **Keyring** – encrypt, reveal, switch, and audit secrets directly inside the UI. Requests flow through
74
+ the local REST API so every operation is recorded in the on-screen activity log. The CLI bridge remains
75
+ available for legacy scripts but no longer surfaces new behavior.
76
+ - **Settings** – activate offline licensing, configure global hold defaults, launch vanity generators, and
77
+ jump to the in-app wiki.
78
+ - **Wiki Guide** – render Markdown documentation from `docs/wiki` directly inside the renderer.
79
+
80
+ ## Data directories & security
81
+
82
+ - Transaction-hold records and vanity job ledgers are stored under `.gnoman/` in the project working
83
+ directory (`holds.sqlite`, `vanity-jobs.json`), while validated license tokens live in
84
+ `.safevault/license.env`.
85
+ - Sandbox logs persist to `modules/sandbox/logs/` for replay and auditing purposes.
86
+ - Wallet private keys stay encrypted in-memory using AES-256-GCM with PBKDF2 key derivation. Exported
87
+ keystores require the caller-supplied password.
88
+ - The Electron preload exposes a minimal `window.gnoman.invoke` surface to keep privileged operations
89
+ isolated from the renderer context.
90
+
91
+ ## Documentation
92
+
93
+ Additional guides live under `docs/`. Start with `docs/user-guide.md` for a comprehensive walkthrough,
94
+ `docs/license-dev-guide.md` for offline licensing workflows, and `docs/wiki/` for content surfaced in the
95
+ in-app knowledge base.
Binary file
Binary file
@@ -0,0 +1,49 @@
1
+ import asyncHandler from 'express-async-handler';
2
+ import type { Request, Response } from 'express';
3
+ import { addContract, listContracts, removeContract } from '../services/contractRegistryService';
4
+ import { abiResolver } from '../utils/abiResolver';
5
+ import { getBalance } from '../services/rpcService';
6
+
7
+ export const listContractsHandler = asyncHandler(async (_req: Request, res: Response) => {
8
+ const records = listContracts();
9
+ const balances = await Promise.all(records.map((record) => getBalance(record.address)));
10
+ res.json(
11
+ records.map((record, index) => ({
12
+ ...record,
13
+ balance: balances[index]
14
+ }))
15
+ );
16
+ });
17
+
18
+ export const addContractHandler = asyncHandler(async (req: Request, res: Response) => {
19
+ const { address, name, network, tags, type, abi } = req.body as {
20
+ address: string;
21
+ name?: string;
22
+ network?: string;
23
+ tags?: string[];
24
+ type?: string;
25
+ abi?: string;
26
+ };
27
+ const record = addContract({ address, name, network, tags, type, abi });
28
+ res.status(201).json(record);
29
+ });
30
+
31
+ export const removeContractHandler = asyncHandler(async (req: Request, res: Response) => {
32
+ const removed = removeContract(req.params.id);
33
+ if (!removed) {
34
+ res.status(404).json({ message: 'Contract not found' });
35
+ return;
36
+ }
37
+ res.json(removed);
38
+ });
39
+
40
+
41
+ export const resolveContractAbiHandler = asyncHandler(async (req: Request, res: Response) => {
42
+ const { chainId, address, contractName } = req.body as { chainId?: number; address?: string; contractName?: string };
43
+ if (!address?.trim()) {
44
+ res.status(400).json({ message: 'address is required.' });
45
+ return;
46
+ }
47
+ const result = await abiResolver.resolve(Number(chainId) || 1, address, contractName);
48
+ res.json(result);
49
+ });