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.
- package/.eslintrc.cjs +24 -0
- package/.gnoman/contracts.json +4094 -0
- package/.gnoman/exec_package/runtime-debug.jsonl +45 -0
- package/.gnoman/holds.sqlite +0 -0
- package/.gnoman/license.json +7 -0
- package/.gnoman/safes.json +37 -0
- package/.gnoman/vanity-jobs.json +67 -0
- package/.gnoman/wallets.db +0 -0
- package/.prettierrc.json +6 -0
- package/CODex_TASKS.md +124 -0
- package/LICENSE.md +164 -0
- package/README.md +95 -0
- package/assets/GnoLogo.jpg +0 -0
- package/assets/self.png +0 -0
- package/backend/controllers/contractController.ts +49 -0
- package/backend/controllers/devToolsController.ts +76 -0
- package/backend/controllers/etherscanController.ts +59 -0
- package/backend/controllers/historyController.ts +7 -0
- package/backend/controllers/keyringController.ts +134 -0
- package/backend/controllers/robinhoodController.ts +80 -0
- package/backend/controllers/safeController.ts +167 -0
- package/backend/controllers/sandboxController.ts +63 -0
- package/backend/controllers/settingsController.ts +38 -0
- package/backend/controllers/walletController.ts +151 -0
- package/backend/index.ts +133 -0
- package/backend/licenses/license_public.pem +3 -0
- package/backend/licenses/verify_license.py +43 -0
- package/backend/routes/contractRoutes.ts +11 -0
- package/backend/routes/devToolsRoutes.ts +11 -0
- package/backend/routes/etherscanRoutes.ts +11 -0
- package/backend/routes/historyRoutes.ts +8 -0
- package/backend/routes/keyringRoutes.ts +25 -0
- package/backend/routes/licenseRoutes.ts +35 -0
- package/backend/routes/robinhoodRoutes.ts +22 -0
- package/backend/routes/runtimeRoutes.ts +29 -0
- package/backend/routes/safeRoutes.ts +28 -0
- package/backend/routes/sandboxRoutes.ts +17 -0
- package/backend/routes/settingsRoutes.ts +14 -0
- package/backend/routes/walletRoutes.ts +21 -0
- package/backend/services/chainlinkService.ts +65 -0
- package/backend/services/contractRegistryService.ts +205 -0
- package/backend/services/devToolsService.ts +251 -0
- package/backend/services/diagnosticsService.ts +350 -0
- package/backend/services/etherscanService.ts +152 -0
- package/backend/services/historyService.ts +89 -0
- package/backend/services/keyringAccessor.ts +4 -0
- package/backend/services/licenseService.ts +163 -0
- package/backend/services/onchain/abiRegistry.ts +57 -0
- package/backend/services/onchain/chainlinkClient.ts +56 -0
- package/backend/services/onchain/errors.ts +16 -0
- package/backend/services/onchain/etherscanClient.ts +94 -0
- package/backend/services/onchain/index.ts +76 -0
- package/backend/services/onchain/tenderlyRpcClient.ts +74 -0
- package/backend/services/onchain/types.ts +33 -0
- package/backend/services/onchainAutomationService.ts +424 -0
- package/backend/services/robinhood/auth.ts +42 -0
- package/backend/services/robinhood/client.ts +123 -0
- package/backend/services/robinhood/integrationService.ts +140 -0
- package/backend/services/robinhood/provider.ts +22 -0
- package/backend/services/robinhood/unofficialClient.ts +66 -0
- package/backend/services/rpcService.ts +44 -0
- package/backend/services/runtimeTelemetryService.ts +158 -0
- package/backend/services/safeConfigRepository.ts +205 -0
- package/backend/services/safeService.ts +588 -0
- package/backend/services/sandboxService.ts +157 -0
- package/backend/services/secureSettingsService.ts +45 -0
- package/backend/services/transactionHoldService.ts +223 -0
- package/backend/services/vanityService.ts +293 -0
- package/backend/services/walletService.ts +290 -0
- package/backend/services/walletStore.ts +179 -0
- package/backend/types/express-async-handler.d.ts +13 -0
- package/backend/types/keyring.d.ts +19 -0
- package/backend/utils/abiResolver.ts +208 -0
- package/backend/utils/http.ts +6 -0
- package/backend/utils/secretsResolver.ts +150 -0
- package/backend/utils/signer.ts +11 -0
- package/backend/workers/vanityWorker.ts +76 -0
- package/capacitor.config.ts +13 -0
- package/cli/gnoman.ts +424 -0
- package/contracts/OracleConsumer.sol +20 -0
- package/contracts/PriceFeedConsumer.sol +22 -0
- package/dist/backend/backend/controllers/contractController.js +41 -0
- package/dist/backend/backend/controllers/contractController.js.map +1 -0
- package/dist/backend/backend/controllers/devToolsController.js +63 -0
- package/dist/backend/backend/controllers/devToolsController.js.map +1 -0
- package/dist/backend/backend/controllers/etherscanController.js +53 -0
- package/dist/backend/backend/controllers/etherscanController.js.map +1 -0
- package/dist/backend/backend/controllers/historyController.js +12 -0
- package/dist/backend/backend/controllers/historyController.js.map +1 -0
- package/dist/backend/backend/controllers/keyringController.js +126 -0
- package/dist/backend/backend/controllers/keyringController.js.map +1 -0
- package/dist/backend/backend/controllers/robinhoodController.js +69 -0
- package/dist/backend/backend/controllers/robinhoodController.js.map +1 -0
- package/dist/backend/backend/controllers/safeController.js +137 -0
- package/dist/backend/backend/controllers/safeController.js.map +1 -0
- package/dist/backend/backend/controllers/sandboxController.js +48 -0
- package/dist/backend/backend/controllers/sandboxController.js.map +1 -0
- package/dist/backend/backend/controllers/settingsController.js +34 -0
- package/dist/backend/backend/controllers/settingsController.js.map +1 -0
- package/dist/backend/backend/controllers/walletController.js +140 -0
- package/dist/backend/backend/controllers/walletController.js.map +1 -0
- package/dist/backend/backend/index.js +119 -0
- package/dist/backend/backend/index.js.map +1 -0
- package/dist/backend/backend/routes/contractRoutes.js +44 -0
- package/dist/backend/backend/routes/contractRoutes.js.map +1 -0
- package/dist/backend/backend/routes/devToolsRoutes.js +44 -0
- package/dist/backend/backend/routes/devToolsRoutes.js.map +1 -0
- package/dist/backend/backend/routes/etherscanRoutes.js +44 -0
- package/dist/backend/backend/routes/etherscanRoutes.js.map +1 -0
- package/dist/backend/backend/routes/historyRoutes.js +41 -0
- package/dist/backend/backend/routes/historyRoutes.js.map +1 -0
- package/dist/backend/backend/routes/keyringRoutes.js +18 -0
- package/dist/backend/backend/routes/keyringRoutes.js.map +1 -0
- package/dist/backend/backend/routes/licenseRoutes.js +30 -0
- package/dist/backend/backend/routes/licenseRoutes.js.map +1 -0
- package/dist/backend/backend/routes/robinhoodRoutes.js +14 -0
- package/dist/backend/backend/routes/robinhoodRoutes.js.map +1 -0
- package/dist/backend/backend/routes/runtimeRoutes.js +26 -0
- package/dist/backend/backend/routes/runtimeRoutes.js.map +1 -0
- package/dist/backend/backend/routes/safeRoutes.js +61 -0
- package/dist/backend/backend/routes/safeRoutes.js.map +1 -0
- package/dist/backend/backend/routes/sandboxRoutes.js +50 -0
- package/dist/backend/backend/routes/sandboxRoutes.js.map +1 -0
- package/dist/backend/backend/routes/settingsRoutes.js +10 -0
- package/dist/backend/backend/routes/settingsRoutes.js.map +1 -0
- package/dist/backend/backend/routes/walletRoutes.js +54 -0
- package/dist/backend/backend/routes/walletRoutes.js.map +1 -0
- package/dist/backend/backend/services/chainlinkService.js +48 -0
- package/dist/backend/backend/services/chainlinkService.js.map +1 -0
- package/dist/backend/backend/services/contractRegistryService.js +138 -0
- package/dist/backend/backend/services/contractRegistryService.js.map +1 -0
- package/dist/backend/backend/services/devToolsService.js +213 -0
- package/dist/backend/backend/services/devToolsService.js.map +1 -0
- package/dist/backend/backend/services/diagnosticsService.js +286 -0
- package/dist/backend/backend/services/diagnosticsService.js.map +1 -0
- package/dist/backend/backend/services/etherscanService.js +125 -0
- package/dist/backend/backend/services/etherscanService.js.map +1 -0
- package/dist/backend/backend/services/historyService.js +75 -0
- package/dist/backend/backend/services/historyService.js.map +1 -0
- package/dist/backend/backend/services/keyringAccessor.js +40 -0
- package/dist/backend/backend/services/keyringAccessor.js.map +1 -0
- package/dist/backend/backend/services/licenseService.js +130 -0
- package/dist/backend/backend/services/licenseService.js.map +1 -0
- package/dist/backend/backend/services/onchain/abiRegistry.js +47 -0
- package/dist/backend/backend/services/onchain/abiRegistry.js.map +1 -0
- package/dist/backend/backend/services/onchain/chainlinkClient.js +43 -0
- package/dist/backend/backend/services/onchain/chainlinkClient.js.map +1 -0
- package/dist/backend/backend/services/onchain/errors.js +13 -0
- package/dist/backend/backend/services/onchain/errors.js.map +1 -0
- package/dist/backend/backend/services/onchain/etherscanClient.js +82 -0
- package/dist/backend/backend/services/onchain/etherscanClient.js.map +1 -0
- package/dist/backend/backend/services/onchain/index.js +79 -0
- package/dist/backend/backend/services/onchain/index.js.map +1 -0
- package/dist/backend/backend/services/onchain/tenderlyRpcClient.js +60 -0
- package/dist/backend/backend/services/onchain/tenderlyRpcClient.js.map +1 -0
- package/dist/backend/backend/services/onchain/types.js +14 -0
- package/dist/backend/backend/services/onchain/types.js.map +1 -0
- package/dist/backend/backend/services/onchainAutomationService.js +316 -0
- package/dist/backend/backend/services/onchainAutomationService.js.map +1 -0
- package/dist/backend/backend/services/robinhood/auth.js +26 -0
- package/dist/backend/backend/services/robinhood/auth.js.map +1 -0
- package/dist/backend/backend/services/robinhood/client.js +73 -0
- package/dist/backend/backend/services/robinhood/client.js.map +1 -0
- package/dist/backend/backend/services/robinhood/integrationService.js +119 -0
- package/dist/backend/backend/services/robinhood/integrationService.js.map +1 -0
- package/dist/backend/backend/services/robinhood/provider.js +17 -0
- package/dist/backend/backend/services/robinhood/provider.js.map +1 -0
- package/dist/backend/backend/services/robinhood/unofficialClient.js +61 -0
- package/dist/backend/backend/services/robinhood/unofficialClient.js.map +1 -0
- package/dist/backend/backend/services/rpcService.js +48 -0
- package/dist/backend/backend/services/rpcService.js.map +1 -0
- package/dist/backend/backend/services/runtimeTelemetryService.js +96 -0
- package/dist/backend/backend/services/runtimeTelemetryService.js.map +1 -0
- package/dist/backend/backend/services/safeConfigRepository.js +147 -0
- package/dist/backend/backend/services/safeConfigRepository.js.map +1 -0
- package/dist/backend/backend/services/safeService.js +527 -0
- package/dist/backend/backend/services/safeService.js.map +1 -0
- package/dist/backend/backend/services/sandboxService.js +135 -0
- package/dist/backend/backend/services/sandboxService.js.map +1 -0
- package/dist/backend/backend/services/secureSettingsService.js +50 -0
- package/dist/backend/backend/services/secureSettingsService.js.map +1 -0
- package/dist/backend/backend/services/transactionHoldService.js +184 -0
- package/dist/backend/backend/services/transactionHoldService.js.map +1 -0
- package/dist/backend/backend/services/vanityService.js +235 -0
- package/dist/backend/backend/services/vanityService.js.map +1 -0
- package/dist/backend/backend/services/walletService.js +202 -0
- package/dist/backend/backend/services/walletService.js.map +1 -0
- package/dist/backend/backend/services/walletStore.js +132 -0
- package/dist/backend/backend/services/walletStore.js.map +1 -0
- package/dist/backend/backend/utils/abiResolver.js +182 -0
- package/dist/backend/backend/utils/abiResolver.js.map +1 -0
- package/dist/backend/backend/utils/http.js +12 -0
- package/dist/backend/backend/utils/http.js.map +1 -0
- package/dist/backend/backend/utils/secretsResolver.js +137 -0
- package/dist/backend/backend/utils/secretsResolver.js.map +1 -0
- package/dist/backend/backend/utils/signer.js +15 -0
- package/dist/backend/backend/utils/signer.js.map +1 -0
- package/dist/backend/backend/workers/vanityWorker.js +63 -0
- package/dist/backend/backend/workers/vanityWorker.js.map +1 -0
- package/dist/backend/cli/gnoman.js +387 -0
- package/dist/backend/cli/gnoman.js.map +1 -0
- package/dist/backend/modules/sandbox/abiLoader.js +78 -0
- package/dist/backend/modules/sandbox/abiLoader.js.map +1 -0
- package/dist/backend/modules/sandbox/contractSimulator.js +205 -0
- package/dist/backend/modules/sandbox/contractSimulator.js.map +1 -0
- package/dist/backend/modules/sandbox/formBuilder.js +14 -0
- package/dist/backend/modules/sandbox/formBuilder.js.map +1 -0
- package/dist/backend/modules/sandbox/index.js +24 -0
- package/dist/backend/modules/sandbox/index.js.map +1 -0
- package/dist/backend/modules/sandbox/localFork.js +103 -0
- package/dist/backend/modules/sandbox/localFork.js.map +1 -0
- package/dist/backend/modules/sandbox/sandboxManager.js +130 -0
- package/dist/backend/modules/sandbox/sandboxManager.js.map +1 -0
- package/dist/backend/modules/sandbox/types.js +3 -0
- package/dist/backend/modules/sandbox/types.js.map +1 -0
- package/dist/backend/src/core/backends/fileBackend.js +136 -0
- package/dist/backend/src/core/backends/fileBackend.js.map +1 -0
- package/dist/backend/src/core/backends/memoryBackend.js +26 -0
- package/dist/backend/src/core/backends/memoryBackend.js.map +1 -0
- package/dist/backend/src/core/backends/systemBackend.js +86 -0
- package/dist/backend/src/core/backends/systemBackend.js.map +1 -0
- package/dist/backend/src/core/backends/types.js +12 -0
- package/dist/backend/src/core/backends/types.js.map +1 -0
- package/dist/backend/src/core/keyringManager.js +178 -0
- package/dist/backend/src/core/keyringManager.js.map +1 -0
- package/dist/backend/src/utils/abiResolver.js +180 -0
- package/dist/backend/src/utils/abiResolver.js.map +1 -0
- package/dist/backend/src/utils/runtimeObservability.js +78 -0
- package/dist/backend/src/utils/runtimeObservability.js.map +1 -0
- package/dist/backend/src/utils/secretsResolver.js +138 -0
- package/dist/backend/src/utils/secretsResolver.js.map +1 -0
- package/dist/cli/backend/services/diagnosticsService.js +286 -0
- package/dist/cli/backend/services/diagnosticsService.js.map +1 -0
- package/dist/cli/backend/services/keyringAccessor.js +40 -0
- package/dist/cli/backend/services/keyringAccessor.js.map +1 -0
- package/dist/cli/backend/services/rpcService.js +48 -0
- package/dist/cli/backend/services/rpcService.js.map +1 -0
- package/dist/cli/backend/services/runtimeTelemetryService.js +96 -0
- package/dist/cli/backend/services/runtimeTelemetryService.js.map +1 -0
- package/dist/cli/backend/services/walletService.js +202 -0
- package/dist/cli/backend/services/walletService.js.map +1 -0
- package/dist/cli/backend/services/walletStore.js +132 -0
- package/dist/cli/backend/services/walletStore.js.map +1 -0
- package/dist/cli/backend/utils/http.js +12 -0
- package/dist/cli/backend/utils/http.js.map +1 -0
- package/dist/cli/backend/utils/secretsResolver.js +137 -0
- package/dist/cli/backend/utils/secretsResolver.js.map +1 -0
- package/dist/cli/cli/gnoman.js +387 -0
- package/dist/cli/cli/gnoman.js.map +1 -0
- package/dist/cli/src/core/backends/fileBackend.js +136 -0
- package/dist/cli/src/core/backends/fileBackend.js.map +1 -0
- package/dist/cli/src/core/backends/memoryBackend.js +26 -0
- package/dist/cli/src/core/backends/memoryBackend.js.map +1 -0
- package/dist/cli/src/core/backends/systemBackend.js +86 -0
- package/dist/cli/src/core/backends/systemBackend.js.map +1 -0
- package/dist/cli/src/core/backends/types.js +12 -0
- package/dist/cli/src/core/backends/types.js.map +1 -0
- package/dist/cli/src/core/keyringManager.js +178 -0
- package/dist/cli/src/core/keyringManager.js.map +1 -0
- package/dist/cli/src/utils/abiResolver.js +180 -0
- package/dist/cli/src/utils/abiResolver.js.map +1 -0
- package/dist/cli/src/utils/runtimeObservability.js +78 -0
- package/dist/cli/src/utils/runtimeObservability.js.map +1 -0
- package/dist/cli/src/utils/secretsResolver.js +138 -0
- package/dist/cli/src/utils/secretsResolver.js.map +1 -0
- package/dist/main/backend/services/keyringAccessor.js +40 -0
- package/dist/main/backend/services/keyringAccessor.js.map +1 -0
- package/dist/main/backend/utils/http.js +12 -0
- package/dist/main/backend/utils/http.js.map +1 -0
- package/dist/main/main/ipcHandlers/index.js +26 -0
- package/dist/main/main/ipcHandlers/index.js.map +1 -0
- package/dist/main/main/keyring/keyringmanager.js +101 -0
- package/dist/main/main/keyring/keyringmanager.js.map +1 -0
- package/dist/main/main/main.js +224 -0
- package/dist/main/main/main.js.map +1 -0
- package/dist/main/main/preload/index.js +19 -0
- package/dist/main/main/preload/index.js.map +1 -0
- package/dist/main/main/preload/licenseBridge.js +105 -0
- package/dist/main/main/preload/licenseBridge.js.map +1 -0
- package/dist/main/src/core/backends/fileBackend.js +136 -0
- package/dist/main/src/core/backends/fileBackend.js.map +1 -0
- package/dist/main/src/core/backends/memoryBackend.js +26 -0
- package/dist/main/src/core/backends/memoryBackend.js.map +1 -0
- package/dist/main/src/core/backends/systemBackend.js +86 -0
- package/dist/main/src/core/backends/systemBackend.js.map +1 -0
- package/dist/main/src/core/backends/types.js +12 -0
- package/dist/main/src/core/backends/types.js.map +1 -0
- package/dist/main/src/core/keyringManager.js +178 -0
- package/dist/main/src/core/keyringManager.js.map +1 -0
- package/dist/main/src/utils/abiResolver.js +180 -0
- package/dist/main/src/utils/abiResolver.js.map +1 -0
- package/dist/main/src/utils/runtimeObservability.js +78 -0
- package/dist/main/src/utils/runtimeObservability.js.map +1 -0
- package/dist/main/src/utils/secretsResolver.js +138 -0
- package/dist/main/src/utils/secretsResolver.js.map +1 -0
- package/docs/development-guide.md +203 -0
- package/docs/etherscan-chainlink-integration.md +44 -0
- package/docs/gnoman-20-user-manual-STANDARD-PRINT-READY.pdf +0 -0
- package/docs/gnoman-20-user-manual-STANDARD.pdf +0 -0
- package/docs/license-dev-guide.md +106 -0
- package/docs/robinhood-integration.md +30 -0
- package/docs/system-audit-gpt-guide.md +208 -0
- package/docs/system-robustness-audit.md +50 -0
- package/docs/user-guide.md +73 -0
- package/docs/wiki/development-guide.md +203 -0
- package/docs/wiki/license-dev-guide.md +106 -0
- package/docs/wiki/user-guide.md +73 -0
- package/eslint.config.js +85 -0
- package/gnoman2.0/.eslintrc.cjs +24 -0
- package/gnoman2.0/.prettierrc.json +6 -0
- package/gnoman2.0/CODex_TASKS.md +124 -0
- package/gnoman2.0/LICENSE.md +164 -0
- package/gnoman2.0/README.md +95 -0
- package/gnoman2.0/assets/GnoLogo.jpg +0 -0
- package/gnoman2.0/assets/self.png +0 -0
- package/gnoman2.0/backend/controllers/contractController.ts +49 -0
- package/gnoman2.0/backend/controllers/devToolsController.ts +76 -0
- package/gnoman2.0/backend/controllers/etherscanController.ts +59 -0
- package/gnoman2.0/backend/controllers/historyController.ts +7 -0
- package/gnoman2.0/backend/controllers/keyringController.ts +134 -0
- package/gnoman2.0/backend/controllers/robinhoodController.ts +80 -0
- package/gnoman2.0/backend/controllers/safeController.ts +167 -0
- package/gnoman2.0/backend/controllers/sandboxController.ts +63 -0
- package/gnoman2.0/backend/controllers/settingsController.ts +38 -0
- package/gnoman2.0/backend/controllers/walletController.ts +151 -0
- package/gnoman2.0/backend/index.ts +133 -0
- package/gnoman2.0/backend/licenses/license_public.pem +3 -0
- package/gnoman2.0/backend/licenses/verify_license.py +43 -0
- package/gnoman2.0/backend/routes/contractRoutes.ts +11 -0
- package/gnoman2.0/backend/routes/devToolsRoutes.ts +11 -0
- package/gnoman2.0/backend/routes/etherscanRoutes.ts +11 -0
- package/gnoman2.0/backend/routes/historyRoutes.ts +8 -0
- package/gnoman2.0/backend/routes/keyringRoutes.ts +25 -0
- package/gnoman2.0/backend/routes/licenseRoutes.ts +35 -0
- package/gnoman2.0/backend/routes/robinhoodRoutes.ts +22 -0
- package/gnoman2.0/backend/routes/runtimeRoutes.ts +29 -0
- package/gnoman2.0/backend/routes/safeRoutes.ts +28 -0
- package/gnoman2.0/backend/routes/sandboxRoutes.ts +17 -0
- package/gnoman2.0/backend/routes/settingsRoutes.ts +14 -0
- package/gnoman2.0/backend/routes/walletRoutes.ts +21 -0
- package/gnoman2.0/backend/services/chainlinkService.ts +65 -0
- package/gnoman2.0/backend/services/contractRegistryService.ts +205 -0
- package/gnoman2.0/backend/services/devToolsService.ts +251 -0
- package/gnoman2.0/backend/services/diagnosticsService.ts +350 -0
- package/gnoman2.0/backend/services/etherscanService.ts +152 -0
- package/gnoman2.0/backend/services/historyService.ts +89 -0
- package/gnoman2.0/backend/services/keyringAccessor.ts +4 -0
- package/gnoman2.0/backend/services/licenseService.ts +163 -0
- package/gnoman2.0/backend/services/onchain/abiRegistry.ts +57 -0
- package/gnoman2.0/backend/services/onchain/chainlinkClient.ts +56 -0
- package/gnoman2.0/backend/services/onchain/errors.ts +16 -0
- package/gnoman2.0/backend/services/onchain/etherscanClient.ts +94 -0
- package/gnoman2.0/backend/services/onchain/index.ts +76 -0
- package/gnoman2.0/backend/services/onchain/tenderlyRpcClient.ts +74 -0
- package/gnoman2.0/backend/services/onchain/types.ts +33 -0
- package/gnoman2.0/backend/services/onchainAutomationService.ts +424 -0
- package/gnoman2.0/backend/services/robinhood/auth.ts +42 -0
- package/gnoman2.0/backend/services/robinhood/client.ts +123 -0
- package/gnoman2.0/backend/services/robinhood/integrationService.ts +140 -0
- package/gnoman2.0/backend/services/robinhood/provider.ts +22 -0
- package/gnoman2.0/backend/services/robinhood/unofficialClient.ts +66 -0
- package/gnoman2.0/backend/services/rpcService.ts +44 -0
- package/gnoman2.0/backend/services/runtimeTelemetryService.ts +158 -0
- package/gnoman2.0/backend/services/safeConfigRepository.ts +205 -0
- package/gnoman2.0/backend/services/safeService.ts +588 -0
- package/gnoman2.0/backend/services/sandboxService.ts +157 -0
- package/gnoman2.0/backend/services/secureSettingsService.ts +45 -0
- package/gnoman2.0/backend/services/transactionHoldService.ts +223 -0
- package/gnoman2.0/backend/services/vanityService.ts +293 -0
- package/gnoman2.0/backend/services/walletService.ts +290 -0
- package/gnoman2.0/backend/services/walletStore.ts +179 -0
- package/gnoman2.0/backend/types/express-async-handler.d.ts +13 -0
- package/gnoman2.0/backend/types/keyring.d.ts +19 -0
- package/gnoman2.0/backend/utils/abiResolver.ts +208 -0
- package/gnoman2.0/backend/utils/http.ts +6 -0
- package/gnoman2.0/backend/utils/secretsResolver.ts +150 -0
- package/gnoman2.0/backend/utils/signer.ts +11 -0
- package/gnoman2.0/backend/workers/vanityWorker.ts +76 -0
- package/gnoman2.0/capacitor.config.ts +13 -0
- package/gnoman2.0/cli/gnoman.ts +424 -0
- package/gnoman2.0/contracts/OracleConsumer.sol +20 -0
- package/gnoman2.0/contracts/PriceFeedConsumer.sol +22 -0
- package/gnoman2.0/docs/development-guide.md +203 -0
- package/gnoman2.0/docs/etherscan-chainlink-integration.md +44 -0
- package/gnoman2.0/docs/gnoman-20-user-manual-STANDARD-PRINT-READY.pdf +0 -0
- package/gnoman2.0/docs/gnoman-20-user-manual-STANDARD.pdf +0 -0
- package/gnoman2.0/docs/license-dev-guide.md +106 -0
- package/gnoman2.0/docs/robinhood-integration.md +30 -0
- package/gnoman2.0/docs/system-audit-gpt-guide.md +208 -0
- package/gnoman2.0/docs/system-robustness-audit.md +50 -0
- package/gnoman2.0/docs/user-guide.md +73 -0
- package/gnoman2.0/docs/wiki/development-guide.md +203 -0
- package/gnoman2.0/docs/wiki/license-dev-guide.md +106 -0
- package/gnoman2.0/docs/wiki/user-guide.md +73 -0
- package/gnoman2.0/eslint.config.js +85 -0
- package/gnoman2.0/gnomon/__init__.py +0 -0
- package/gnoman2.0/gnomon/api/__init__.py +0 -0
- package/gnoman2.0/gnomon/api/etherscan_tracker.py +72 -0
- package/gnoman2.0/gnomon/core/__init__.py +0 -0
- package/gnoman2.0/gnomon/core/safe_manager.py +111 -0
- package/gnoman2.0/gnomon/tests/test_abi_resolver.py +181 -0
- package/gnoman2.0/gnomon/tests/test_safe_persistence_and_etherscan.py +97 -0
- package/gnoman2.0/gnomon/utils/__init__.py +5 -0
- package/gnoman2.0/gnomon/utils/abi_resolver.py +255 -0
- package/gnoman2.0/ios/ExportOptions.plist +16 -0
- package/gnoman2.0/ios/README.md +33 -0
- package/gnoman2.0/jest.config.ts +18 -0
- package/gnoman2.0/keyring/__init__.py +17 -0
- package/gnoman2.0/licensingServer/package.json +23 -0
- package/gnoman2.0/licensingServer/src/config/keys.ts +84 -0
- package/gnoman2.0/licensingServer/src/index.ts +30 -0
- package/gnoman2.0/licensingServer/src/lib/canonicalize.ts +5 -0
- package/gnoman2.0/licensingServer/src/lib/crypto.ts +25 -0
- package/gnoman2.0/licensingServer/src/lib/validate.ts +62 -0
- package/gnoman2.0/licensingServer/src/middleware/auth.ts +20 -0
- package/gnoman2.0/licensingServer/src/routes/licenses.ts +110 -0
- package/gnoman2.0/licensingServer/tsconfig.json +12 -0
- package/gnoman2.0/main/ipcHandlers/index.ts +23 -0
- package/gnoman2.0/main/keyring/keyringmanager.ts +154 -0
- package/gnoman2.0/main/main.ts +234 -0
- package/gnoman2.0/main/preload/index.ts +31 -0
- package/gnoman2.0/main/preload/licenseBridge.ts +73 -0
- package/gnoman2.0/modules/sandbox/abiLoader.ts +78 -0
- package/gnoman2.0/modules/sandbox/contractSimulator.ts +241 -0
- package/gnoman2.0/modules/sandbox/formBuilder.ts +16 -0
- package/gnoman2.0/modules/sandbox/index.ts +6 -0
- package/gnoman2.0/modules/sandbox/localFork.ts +129 -0
- package/gnoman2.0/modules/sandbox/safe.abi.json +82 -0
- package/gnoman2.0/modules/sandbox/sandboxManager.ts +154 -0
- package/gnoman2.0/modules/sandbox/types.ts +84 -0
- package/gnoman2.0/modules/sandbox/ui/LogViewer.tsx +30 -0
- package/gnoman2.0/modules/sandbox/ui/ParameterForm.tsx +49 -0
- package/gnoman2.0/modules/sandbox/ui/SandboxPanel.tsx +568 -0
- package/gnoman2.0/package-lock.json +10904 -0
- package/gnoman2.0/package.json +82 -0
- package/gnoman2.0/renderer/components/LicenseScreen.tsx +134 -0
- package/gnoman2.0/renderer/index.html +12 -0
- package/gnoman2.0/renderer/package-lock.json +4104 -0
- package/gnoman2.0/renderer/package.json +35 -0
- package/gnoman2.0/renderer/postcss.config.cjs +6 -0
- package/gnoman2.0/renderer/src/App.tsx +229 -0
- package/gnoman2.0/renderer/src/context/KeyringContext.tsx +217 -0
- package/gnoman2.0/renderer/src/context/SafeContext.tsx +49 -0
- package/gnoman2.0/renderer/src/context/ThemeContext.tsx +60 -0
- package/gnoman2.0/renderer/src/context/WalletContext.tsx +50 -0
- package/gnoman2.0/renderer/src/context/main.tsx +18 -0
- package/gnoman2.0/renderer/src/main.tsx +18 -0
- package/gnoman2.0/renderer/src/pages/Contracts.tsx +482 -0
- package/gnoman2.0/renderer/src/pages/Dashboard.tsx +653 -0
- package/gnoman2.0/renderer/src/pages/DeveloperTools.tsx +270 -0
- package/gnoman2.0/renderer/src/pages/History.tsx +149 -0
- package/gnoman2.0/renderer/src/pages/Keyring.tsx +449 -0
- package/gnoman2.0/renderer/src/pages/Safes.tsx +1089 -0
- package/gnoman2.0/renderer/src/pages/Sandbox.tsx +146 -0
- package/gnoman2.0/renderer/src/pages/Settings.tsx +871 -0
- package/gnoman2.0/renderer/src/pages/Wallets.tsx +752 -0
- package/gnoman2.0/renderer/src/pages/WikiGuide.tsx +75 -0
- package/gnoman2.0/renderer/src/styles.css +32 -0
- package/gnoman2.0/renderer/src/types/gnoman.d.ts +9 -0
- package/gnoman2.0/renderer/src/types/license.ts +8 -0
- package/gnoman2.0/renderer/src/types/safevault.d.ts +17 -0
- package/gnoman2.0/renderer/src/utils/backend.ts +88 -0
- package/gnoman2.0/renderer/tailwind.config.cjs +8 -0
- package/gnoman2.0/renderer/tsconfig.json +13 -0
- package/gnoman2.0/renderer/tsconfig.node.json +9 -0
- package/gnoman2.0/renderer/vite.config.ts +19 -0
- package/gnoman2.0/requests/__init__.py +35 -0
- package/gnoman2.0/scripts/build-ios.sh +30 -0
- package/gnoman2.0/scripts/copyBackendAssets.js +24 -0
- package/gnoman2.0/scripts/copyRenderer.js +87 -0
- package/gnoman2.0/scripts/launchElectron.js +51 -0
- package/gnoman2.0/src/core/backends/fileBackend.ts +154 -0
- package/gnoman2.0/src/core/backends/memoryBackend.ts +27 -0
- package/gnoman2.0/src/core/backends/systemBackend.ts +66 -0
- package/gnoman2.0/src/core/backends/types.ts +17 -0
- package/gnoman2.0/src/core/keyringManager.ts +208 -0
- package/gnoman2.0/src/utils/abiCache/.gitkeep +0 -0
- package/gnoman2.0/src/utils/abiResolver.ts +200 -0
- package/gnoman2.0/src/utils/runtimeObservability.ts +110 -0
- package/gnoman2.0/src/utils/secretsResolver.ts +144 -0
- package/gnoman2.0/tests/chainlinkService.test.ts +32 -0
- package/gnoman2.0/tests/diagnosticsService.test.ts +68 -0
- package/gnoman2.0/tests/etherscanController.test.ts +99 -0
- package/gnoman2.0/tests/etherscanService.test.ts +116 -0
- package/gnoman2.0/tests/keyringManager.test.ts +135 -0
- package/gnoman2.0/tests/onchainToolkit.test.ts +71 -0
- package/gnoman2.0/tests/robinhoodClient.test.ts +54 -0
- package/gnoman2.0/tests/robinhoodController.test.ts +81 -0
- package/gnoman2.0/tests/robinhoodIntegrationService.test.ts +50 -0
- package/gnoman2.0/tests/safeServicePersistence.test.ts +81 -0
- package/gnoman2.0/tests/test_contract_sandbox/sandbox.test.js +407 -0
- package/gnoman2.0/tests/walletController.test.ts +57 -0
- package/gnoman2.0/tsconfig.backend.json +7 -0
- package/gnoman2.0/tsconfig.cli.json +7 -0
- package/gnoman2.0/tsconfig.json +18 -0
- package/gnoman2.0/tsconfig.main.json +7 -0
- package/gnomon/__init__.py +0 -0
- package/gnomon/__pycache__/__init__.cpython-310.pyc +0 -0
- package/gnomon/api/__init__.py +0 -0
- package/gnomon/api/__pycache__/__init__.cpython-310.pyc +0 -0
- package/gnomon/api/__pycache__/etherscan_tracker.cpython-310.pyc +0 -0
- package/gnomon/api/etherscan_tracker.py +72 -0
- package/gnomon/core/__init__.py +0 -0
- package/gnomon/core/safe_manager.py +111 -0
- package/gnomon/tests/__pycache__/test_safe_persistence_and_etherscan.cpython-310-pytest-8.3.3.pyc +0 -0
- package/gnomon/tests/test_abi_resolver.py +181 -0
- package/gnomon/tests/test_safe_persistence_and_etherscan.py +97 -0
- package/gnomon/utils/__init__.py +5 -0
- package/gnomon/utils/abi_resolver.py +255 -0
- package/ios/ExportOptions.plist +16 -0
- package/ios/README.md +33 -0
- package/jest.config.ts +18 -0
- package/keyring/__init__.py +17 -0
- package/launcher.sh +57 -0
- package/license.env +2 -0
- package/licensingServer/package.json +23 -0
- package/licensingServer/src/config/keys.ts +84 -0
- package/licensingServer/src/index.ts +30 -0
- package/licensingServer/src/lib/canonicalize.ts +5 -0
- package/licensingServer/src/lib/crypto.ts +25 -0
- package/licensingServer/src/lib/validate.ts +62 -0
- package/licensingServer/src/middleware/auth.ts +20 -0
- package/licensingServer/src/routes/licenses.ts +110 -0
- package/licensingServer/tsconfig.json +12 -0
- package/main/ipcHandlers/index.ts +23 -0
- package/main/keyring/keyringmanager.ts +154 -0
- package/main/main.ts +234 -0
- package/main/preload/index.ts +31 -0
- package/main/preload/licenseBridge.ts +73 -0
- package/modules/sandbox/abiLoader.ts +78 -0
- package/modules/sandbox/contractSimulator.ts +241 -0
- package/modules/sandbox/formBuilder.ts +16 -0
- package/modules/sandbox/index.ts +6 -0
- package/modules/sandbox/localFork.ts +129 -0
- package/modules/sandbox/safe.abi.json +82 -0
- package/modules/sandbox/sandboxManager.ts +154 -0
- package/modules/sandbox/types.ts +84 -0
- package/modules/sandbox/ui/LogViewer.tsx +30 -0
- package/modules/sandbox/ui/ParameterForm.tsx +49 -0
- package/modules/sandbox/ui/SandboxPanel.tsx +568 -0
- package/package.json +82 -0
- package/renderer/components/LicenseScreen.tsx +134 -0
- package/renderer/index.html +12 -0
- package/renderer/package-lock.json +4104 -0
- package/renderer/package.json +35 -0
- package/renderer/postcss.config.cjs +6 -0
- package/renderer/src/App.tsx +229 -0
- package/renderer/src/context/KeyringContext.tsx +217 -0
- package/renderer/src/context/SafeContext.tsx +49 -0
- package/renderer/src/context/ThemeContext.tsx +60 -0
- package/renderer/src/context/WalletContext.tsx +50 -0
- package/renderer/src/context/main.tsx +18 -0
- package/renderer/src/main.tsx +18 -0
- package/renderer/src/pages/Contracts.tsx +482 -0
- package/renderer/src/pages/Dashboard.tsx +653 -0
- package/renderer/src/pages/DeveloperTools.tsx +270 -0
- package/renderer/src/pages/History.tsx +149 -0
- package/renderer/src/pages/Keyring.tsx +449 -0
- package/renderer/src/pages/Safes.tsx +1089 -0
- package/renderer/src/pages/Sandbox.tsx +146 -0
- package/renderer/src/pages/Settings.tsx +871 -0
- package/renderer/src/pages/Wallets.tsx +752 -0
- package/renderer/src/pages/WikiGuide.tsx +75 -0
- package/renderer/src/styles.css +32 -0
- package/renderer/src/types/gnoman.d.ts +9 -0
- package/renderer/src/types/license.ts +8 -0
- package/renderer/src/types/safevault.d.ts +17 -0
- package/renderer/src/utils/backend.ts +88 -0
- package/renderer/tailwind.config.cjs +8 -0
- package/renderer/tsconfig.json +13 -0
- package/renderer/tsconfig.node.json +9 -0
- package/renderer/vite.config.ts +19 -0
- package/requests/__init__.py +35 -0
- package/requests/__pycache__/__init__.cpython-310.pyc +0 -0
- package/scripts/build-ios.sh +30 -0
- package/scripts/copyBackendAssets.js +24 -0
- package/scripts/copyRenderer.js +87 -0
- package/scripts/deployBackend.sh +24 -0
- package/scripts/launchElectron.js +51 -0
- package/src/core/backends/fileBackend.ts +154 -0
- package/src/core/backends/memoryBackend.ts +27 -0
- package/src/core/backends/systemBackend.ts +66 -0
- package/src/core/backends/types.ts +17 -0
- package/src/core/keyringManager.ts +208 -0
- package/src/utils/abiCache/.gitkeep +0 -0
- package/src/utils/abiResolver.ts +200 -0
- package/src/utils/runtimeObservability.ts +110 -0
- package/src/utils/secretsResolver.ts +144 -0
- package/tests/chainlinkService.test.ts +32 -0
- package/tests/diagnosticsService.test.ts +68 -0
- package/tests/etherscanController.test.ts +99 -0
- package/tests/etherscanService.test.ts +116 -0
- package/tests/keyringManager.test.ts +135 -0
- package/tests/onchainToolkit.test.ts +71 -0
- package/tests/robinhoodClient.test.ts +54 -0
- package/tests/robinhoodController.test.ts +81 -0
- package/tests/robinhoodIntegrationService.test.ts +50 -0
- package/tests/safeServicePersistence.test.ts +81 -0
- package/tests/test_contract_sandbox/sandbox.test.js +407 -0
- package/tests/walletController.test.ts +57 -0
- package/touch +14 -0
- package/tsconfig.backend.json +7 -0
- package/tsconfig.cli.json +7 -0
- package/tsconfig.json +18 -0
- package/tsconfig.main.json +7 -0
- package/webhook-shim.js +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abiResolver.js","sourceRoot":"","sources":["../../../../src/utils/abiResolver.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,4CAAoB;AACpB,gDAAwB;AACxB,mCAA+C;AAC/C,mDAAgD;AAChD,uDAAkD;AAClD,iEAA8D;AAW9D,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;AAEzD,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,EAAE;IAC3C,IAAI,CAAC,IAAA,kBAAS,EAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,IAAA,mBAAU,EAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,OAAe,EAAE,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;AAClH,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC;AAI5F,MAAM,SAAS,GAAG,CAAC,OAAe,EAA8B,EAAE;IAChE,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA+B,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,KAAiC,EAAE,EAAE;IACxE,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,YAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,OAAe,EAAE,OAAyB,EAAE,EAAE;IACjF,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzC,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,YAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,OAAO,CAAC,GAAG;QACf,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACtF,OAAO;KACR,CAAC;IACF,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,GAAY,EAAa,EAAE;IACpD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,KAAK,EAAE,OAAe,EAAE,OAAe,EAAE,EAAE;IACrE,MAAM,GAAG,GAAG,kDAAkD,OAAO,IAAI,OAAO,gBAAgB,CAAC;IACjG,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,WAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,MAAM,GAAI,QAAQ,CAAC,IAAoG,IAAI,EAAE,CAAC;QACpI,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QACxF,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACpI,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,KAAK,EAAE,OAAe,EAAE,OAAe,EAAE,EAAE;IACtE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,+BAAa,EAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACzE,MAAM,cAAc,GAAG,MAAM,WAAI,CAAC,GAAG,CAAC,EAAE,EAAE;QACxC,MAAM,EAAE;YACN,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE,OAAO;YAChB,OAAO;YACP,MAAM,EAAE,MAAM;SACf;KACF,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,cAAc,CAAC,IAA8E,CAAC;IAC7G,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IACxD,MAAM,UAAU,GAAG,IAAI,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,4CAA4C,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAExJ,MAAM,WAAW,GAAG,MAAM,WAAI,CAAC,GAAG,CAAC,EAAE,EAAE;QACrC,MAAM,EAAE;YACN,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,UAAU;YACnB,MAAM,EAAE,MAAM;SACf;KACF,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,WAAW,CAAC,IAA4C,CAAC;IACzE,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,0CAA0C,OAAO,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO;QACL,GAAG;QACH,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,IAAI;QAC9D,MAAM,EAAE,WAAoB;QAC5B,QAAQ,EAAE,IAAI;KACf,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,OAAe,EAAE,OAAe,EAAE,EAAE;IACrE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,EAAE,CAAC;IAClE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAA8E,CAAC;IAC/I,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;QACtC,MAAM,EAAE,QAAiB;QACzB,QAAQ,EAAE,KAAK;KAChB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAa,WAAW;IACtB,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,YAAoB;QACjD,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAqB,CAAC;YACtF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC/K,2CAAoB,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAClP,OAAO,MAAM,CAAC;QAChB,CAAC;QAGD,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;QAClG,IAAI,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAoC,CAAC;YAClG,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;YAC9D,MAAM,OAAO,GAAqB;gBAChC,GAAG;gBACH,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI;gBAC/D,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,SAAS,EAAE,aAAa;gBACxB,QAAQ,EAAE,KAAK;aAChB,CAAC;YACF,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACjL,2CAAoB,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtP,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1F,MAAM,QAAQ,GAAG,QAAQ,IAAI,SAAS,IAAI,MAAM,CAAC;QACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,aAAa,OAAO,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,OAAO,GAAqB;YAChC,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,aAAa;YACxB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,CAAC;QACF,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAEtC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzL,2CAAoB,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9P,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AApDD,kCAoDC;AAEY,QAAA,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
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.runtimeObservability = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const MAX_EVENTS = 20;
|
|
10
|
+
const debugPath = path_1.default.join(process.cwd(), '.gnoman', 'run-debug.jsonl');
|
|
11
|
+
const state = {
|
|
12
|
+
secrets: [],
|
|
13
|
+
abiResolves: [],
|
|
14
|
+
robinhoodEnabled: false,
|
|
15
|
+
robinhoodAuth: { ok: false, reason: 'Not attempted' },
|
|
16
|
+
robinhoodRequests: [],
|
|
17
|
+
robinhoodOrders: [],
|
|
18
|
+
noBroadcastReason: null,
|
|
19
|
+
safeExecutionTrace: null
|
|
20
|
+
};
|
|
21
|
+
const pushBounded = (arr, value) => {
|
|
22
|
+
arr.unshift(value);
|
|
23
|
+
if (arr.length > MAX_EVENTS) {
|
|
24
|
+
arr.splice(MAX_EVENTS);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const appendArtifact = (type, payload) => {
|
|
28
|
+
fs_1.default.mkdirSync(path_1.default.dirname(debugPath), { recursive: true });
|
|
29
|
+
fs_1.default.appendFileSync(debugPath, `${JSON.stringify({ type, at: new Date().toISOString(), payload })}\n`, 'utf8');
|
|
30
|
+
};
|
|
31
|
+
exports.runtimeObservability = {
|
|
32
|
+
setSecretAudit(records) {
|
|
33
|
+
state.secrets = records;
|
|
34
|
+
appendArtifact('SECRET_AUDIT', records);
|
|
35
|
+
},
|
|
36
|
+
pushAbiResolved(event) {
|
|
37
|
+
pushBounded(state.abiResolves, event);
|
|
38
|
+
appendArtifact('ABI_RESOLVED', event);
|
|
39
|
+
},
|
|
40
|
+
setRobinhoodEnabled(enabled) {
|
|
41
|
+
state.robinhoodEnabled = enabled;
|
|
42
|
+
},
|
|
43
|
+
setRobinhoodAuth(ok, reason) {
|
|
44
|
+
state.robinhoodAuth = { ok, reason };
|
|
45
|
+
appendArtifact('ROBINHOOD_AUTH', state.robinhoodAuth);
|
|
46
|
+
},
|
|
47
|
+
pushRobinhoodRequest(event) {
|
|
48
|
+
pushBounded(state.robinhoodRequests, event);
|
|
49
|
+
appendArtifact('ROBINHOOD_REQUEST', event);
|
|
50
|
+
},
|
|
51
|
+
pushRobinhoodOrder(event) {
|
|
52
|
+
pushBounded(state.robinhoodOrders, event);
|
|
53
|
+
appendArtifact('ROBINHOOD_ORDER', event);
|
|
54
|
+
},
|
|
55
|
+
setNoBroadcastReason(reason) {
|
|
56
|
+
state.noBroadcastReason = reason;
|
|
57
|
+
appendArtifact('NO_BROADCAST_REASON', reason);
|
|
58
|
+
},
|
|
59
|
+
setSafeExecutionTrace(trace) {
|
|
60
|
+
state.safeExecutionTrace = trace;
|
|
61
|
+
appendArtifact('SAFE_EXECUTION_TRACE', trace);
|
|
62
|
+
},
|
|
63
|
+
snapshot() {
|
|
64
|
+
return {
|
|
65
|
+
secrets: state.secrets,
|
|
66
|
+
abiResolves: state.abiResolves,
|
|
67
|
+
robinhood: {
|
|
68
|
+
enabled: state.robinhoodEnabled,
|
|
69
|
+
auth: state.robinhoodAuth,
|
|
70
|
+
requests: state.robinhoodRequests,
|
|
71
|
+
orders: state.robinhoodOrders
|
|
72
|
+
},
|
|
73
|
+
noBroadcastReason: state.noBroadcastReason,
|
|
74
|
+
safeExecutionTrace: state.safeExecutionTrace
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=runtimeObservability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeObservability.js","sourceRoot":"","sources":["../../../../src/utils/runtimeObservability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
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.auditSecretsAtBoot = exports.resolveSecret = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const fileBackend_1 = require("../core/backends/fileBackend");
|
|
10
|
+
const keyringAccessor_1 = __importDefault(require("../../backend/services/keyringAccessor"));
|
|
11
|
+
const runtimeObservability_1 = require("./runtimeObservability");
|
|
12
|
+
const bootEnvKeys = new Set(Object.keys(process.env));
|
|
13
|
+
let dotenvLoaded = false;
|
|
14
|
+
let fileBackend = null;
|
|
15
|
+
let fileSecrets = new Map();
|
|
16
|
+
const GUI_KEYRING_ALLOWED = Boolean(process.env.DISPLAY && process.env.DBUS_SESSION_BUS_ADDRESS);
|
|
17
|
+
const redact = (value) => {
|
|
18
|
+
if (!value) {
|
|
19
|
+
return 'MISSING';
|
|
20
|
+
}
|
|
21
|
+
const trimmed = value.trim();
|
|
22
|
+
if (trimmed.length <= 4) {
|
|
23
|
+
return '****';
|
|
24
|
+
}
|
|
25
|
+
return `****${trimmed.slice(-4)}`;
|
|
26
|
+
};
|
|
27
|
+
const loadDotenvFile = () => {
|
|
28
|
+
const envPath = path_1.default.join(process.cwd(), '.env');
|
|
29
|
+
if (!fs_1.default.existsSync(envPath)) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const raw = fs_1.default.readFileSync(envPath, 'utf8');
|
|
33
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
34
|
+
const trimmed = line.trim();
|
|
35
|
+
if (!trimmed || trimmed.startsWith('#')) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const eq = trimmed.indexOf('=');
|
|
39
|
+
if (eq === -1) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const key = trimmed.slice(0, eq).trim();
|
|
43
|
+
const value = trimmed.slice(eq + 1).trim().replace(/^['"]|['"]$/g, '');
|
|
44
|
+
if (!(key in process.env)) {
|
|
45
|
+
process.env[key] = value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const ensureDotenvLoaded = () => {
|
|
50
|
+
if (dotenvLoaded) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
loadDotenvFile();
|
|
54
|
+
dotenvLoaded = true;
|
|
55
|
+
};
|
|
56
|
+
const ensureFileSecretsLoaded = async () => {
|
|
57
|
+
if (fileBackend) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const filePath = process.env.GNOMAN_KEYRING_FILE ?? path_1.default.join(process.cwd(), '.gnoman', 'secrets.enc');
|
|
61
|
+
fileBackend = new fileBackend_1.FileBackend(filePath);
|
|
62
|
+
try {
|
|
63
|
+
await fileBackend.initialize();
|
|
64
|
+
const listed = await fileBackend.list();
|
|
65
|
+
fileSecrets = new Map(Object.entries(listed));
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error(JSON.stringify({ event: 'FILE_SECRET_BACKEND_ERROR', message: String(error) }));
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
const detectEnvSource = (key) => {
|
|
72
|
+
const value = process.env[key];
|
|
73
|
+
if (!value?.trim()) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return bootEnvKeys.has(key) ? 'env' : 'dotenv';
|
|
77
|
+
};
|
|
78
|
+
const resolveSecret = async (key, required = false) => {
|
|
79
|
+
ensureDotenvLoaded();
|
|
80
|
+
await ensureFileSecretsLoaded();
|
|
81
|
+
const checkedSources = ['env', 'dotenv', 'file'];
|
|
82
|
+
const envSource = detectEnvSource(key);
|
|
83
|
+
if (envSource) {
|
|
84
|
+
return { value: process.env[key].trim(), source: envSource, checkedSources };
|
|
85
|
+
}
|
|
86
|
+
const fileValue = fileSecrets.get(key)?.trim();
|
|
87
|
+
if (fileValue) {
|
|
88
|
+
return { value: fileValue, source: 'file', checkedSources };
|
|
89
|
+
}
|
|
90
|
+
if (GUI_KEYRING_ALLOWED) {
|
|
91
|
+
checkedSources.push('keyring');
|
|
92
|
+
try {
|
|
93
|
+
const keyringValue = await keyringAccessor_1.default.get(key);
|
|
94
|
+
if (keyringValue?.trim()) {
|
|
95
|
+
return { value: keyringValue.trim(), source: 'keyring', checkedSources };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
console.warn(`Unable to resolve ${key} from keyring`, error);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const missing = { event: 'MISSING_SECRET', key, checkedSources };
|
|
103
|
+
console.error(JSON.stringify(missing));
|
|
104
|
+
if (required) {
|
|
105
|
+
throw new Error(`${key} is required for this run mode.`);
|
|
106
|
+
}
|
|
107
|
+
return { value: undefined, source: 'missing', checkedSources };
|
|
108
|
+
};
|
|
109
|
+
exports.resolveSecret = resolveSecret;
|
|
110
|
+
const auditSecretsAtBoot = async (keys) => {
|
|
111
|
+
ensureDotenvLoaded();
|
|
112
|
+
await ensureFileSecretsLoaded();
|
|
113
|
+
const records = [];
|
|
114
|
+
for (const { key, required } of keys) {
|
|
115
|
+
const resolved = await (0, exports.resolveSecret)(key, false);
|
|
116
|
+
records.push({
|
|
117
|
+
key,
|
|
118
|
+
required,
|
|
119
|
+
present: Boolean(resolved.value),
|
|
120
|
+
source: resolved.source,
|
|
121
|
+
redacted: redact(resolved.value),
|
|
122
|
+
checkedSources: resolved.checkedSources
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
runtimeObservability_1.runtimeObservability.setSecretAudit(records);
|
|
126
|
+
console.info(JSON.stringify({
|
|
127
|
+
event: 'SECRETS_AUDIT',
|
|
128
|
+
secrets: records.map((r) => ({
|
|
129
|
+
key: r.key,
|
|
130
|
+
required: r.required,
|
|
131
|
+
present: r.present,
|
|
132
|
+
source: r.source,
|
|
133
|
+
value: r.redacted
|
|
134
|
+
}))
|
|
135
|
+
}));
|
|
136
|
+
};
|
|
137
|
+
exports.auditSecretsAtBoot = auditSecretsAtBoot;
|
|
138
|
+
//# sourceMappingURL=secretsResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretsResolver.js","sourceRoot":"","sources":["../../../../src/utils/secretsResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# GNOMAN 2.0 Development Guide
|
|
2
|
+
|
|
3
|
+
This guide documents the authoritative workflow for standing up a GNOMAN 2.0
|
|
4
|
+
workstation, exercising the offline licensing stack, and producing builds that
|
|
5
|
+
match what ships to customers. Every path is written relative to the repository
|
|
6
|
+
root (the directory that contains `package.json`).
|
|
7
|
+
|
|
8
|
+
> ℹ️ A byte-for-byte copy of this guide lives at
|
|
9
|
+
> `docs/wiki/development-guide.md` for the in-app wiki. Whenever you update this
|
|
10
|
+
> file, mirror the edits in the wiki directory so desktop users and GitHub
|
|
11
|
+
> readers see the same information.
|
|
12
|
+
|
|
13
|
+
## 1. Tooling prerequisites
|
|
14
|
+
|
|
15
|
+
| Tool | Required version | Notes |
|
|
16
|
+
| ---- | ---------------- | ----- |
|
|
17
|
+
| Node.js | 18 LTS | Bundles npm 9, which is required by the build scripts. |
|
|
18
|
+
| npm | 9.x | Installed with Node.js. |
|
|
19
|
+
| Python | 3.10 or newer | Powers the Ed25519 licensing utilities. |
|
|
20
|
+
| pip package | `cryptography` | Install with `pip install cryptography`. |
|
|
21
|
+
| Native build chain | OS specific | Xcode Command Line Tools on macOS, `build-essential` on Linux, or Windows Build Tools to compile `better-sqlite3`. The AES keyring runs entirely in user space (no native bindings). |
|
|
22
|
+
|
|
23
|
+
Clone the repository and install dependencies:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install
|
|
27
|
+
(cd renderer && npm install)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The root install triggers the renderer install via the `postinstall` hook, but
|
|
31
|
+
running both commands explicitly surfaces dependency errors sooner.
|
|
32
|
+
|
|
33
|
+
## 2. Environment configuration
|
|
34
|
+
|
|
35
|
+
1. Copy the template to create a working `.env`:
|
|
36
|
+
```bash
|
|
37
|
+
cp .env.example .env
|
|
38
|
+
```
|
|
39
|
+
2. Adjust variables as needed:
|
|
40
|
+
- `PORT` controls the Express API port (defaults to `4399`).
|
|
41
|
+
- `VITE_DEV_SERVER_URL` points the Electron shell at the renderer dev server
|
|
42
|
+
during development.
|
|
43
|
+
- `LICENSE_PRIVATE_KEY` points to the Ed25519 signing key used by
|
|
44
|
+
`backend/licenses/gen_license.py`. The default
|
|
45
|
+
`backend/licenses/license_private.pem` is resolved relative to the
|
|
46
|
+
repository root. Keep the actual private key outside of source control.
|
|
47
|
+
|
|
48
|
+
### 2.1 AES keyring management
|
|
49
|
+
|
|
50
|
+
The backend, main process, and renderer now rely on a unified keyring manager
|
|
51
|
+
that can hot-swap between the system keychain, an AES-GCM encrypted file store,
|
|
52
|
+
or an in-memory fallback. Use the REST endpoints to administer secrets without
|
|
53
|
+
restarting the app:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# List masked secrets for the active backend
|
|
57
|
+
curl http://127.0.0.1:${PORT:-4399}/api/keyring | jq
|
|
58
|
+
|
|
59
|
+
# Store a secret
|
|
60
|
+
curl -X POST http://127.0.0.1:${PORT:-4399}/api/keyring/RPC_URL \
|
|
61
|
+
-H 'Content-Type: application/json' \
|
|
62
|
+
-d '{"value":"https://sepolia.infura.io/v3/..."}'
|
|
63
|
+
|
|
64
|
+
# Reveal a secret (returns the decrypted payload)
|
|
65
|
+
curl http://127.0.0.1:${PORT:-4399}/api/keyring/RPC_URL | jq
|
|
66
|
+
|
|
67
|
+
# Remove a secret
|
|
68
|
+
curl -X DELETE http://127.0.0.1:${PORT:-4399}/api/keyring/RPC_URL
|
|
69
|
+
|
|
70
|
+
# Inspect the active backend and available backends
|
|
71
|
+
curl http://127.0.0.1:${PORT:-4399}/api/keyring/backend | jq
|
|
72
|
+
|
|
73
|
+
# Switch to another backend and reload configuration in place
|
|
74
|
+
curl -X POST http://127.0.0.1:${PORT:-4399}/api/keyring/backend/file
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
When the system keychain is unavailable (for example, inside a sandboxed CI
|
|
78
|
+
runner), the manager automatically falls back to the encrypted file store and,
|
|
79
|
+
if needed, to the in-memory backend while logging warnings so you know secrets
|
|
80
|
+
may not persist between restarts.
|
|
81
|
+
|
|
82
|
+
## 3. Running the stack locally
|
|
83
|
+
|
|
84
|
+
Use separate terminals so logs stay readable.
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
npm run dev:backend # Express API at http://localhost:4399
|
|
88
|
+
npm run dev:renderer # Vite dev server at http://localhost:5173
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
If you prefer to start both web stacks together, run `npm run dev`, which wraps
|
|
92
|
+
the two commands above with `concurrently`.
|
|
93
|
+
|
|
94
|
+
Launch the Electron shell after the TypeScript projects finish compiling:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npm run dev:electron # Builds backend/main/renderer and opens the desktop window
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The Electron shell loads the renderer URL in development and the packaged
|
|
101
|
+
`dist/renderer/index.html` file after a production build.
|
|
102
|
+
|
|
103
|
+
## 4. Offline licensing workflows
|
|
104
|
+
|
|
105
|
+
GNOMAN 2.0 keeps the private key offline and validates tokens locally. The
|
|
106
|
+
preload bridge (`main/preload/licenseBridge.ts`) invokes the existing Python
|
|
107
|
+
verifier and persists successful validations under `.safevault/license.env`.
|
|
108
|
+
|
|
109
|
+
### 4.1 Generate an Ed25519 keypair (one-time)
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
python backend/licenses/make_keys.py
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
The command writes two files:
|
|
116
|
+
|
|
117
|
+
- `backend/licenses/license_private.pem` – keep this file offline and untracked.
|
|
118
|
+
- `backend/licenses/license_public.pem` – commit this file; it ships with the
|
|
119
|
+
application and is used by the verifier.
|
|
120
|
+
|
|
121
|
+
### 4.2 Issue a license token
|
|
122
|
+
|
|
123
|
+
Run the issuer from the repository root so relative paths resolve correctly:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
python backend/licenses/gen_license.py \
|
|
127
|
+
--priv backend/licenses/license_private.pem \
|
|
128
|
+
--id workstation-001 \
|
|
129
|
+
--product GNOMAN \
|
|
130
|
+
--version 2.0.0 \
|
|
131
|
+
--days 365
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
The script prints two representations:
|
|
135
|
+
|
|
136
|
+
- **RAW TOKEN** – base64url payload and signature separated by a dot.
|
|
137
|
+
- **HUMAN-FRIENDLY** – dashed Base32 string that is easier to transcribe.
|
|
138
|
+
|
|
139
|
+
Either format can be supplied to the desktop client. Store the value somewhere
|
|
140
|
+
secure so you do not need to reissue it later.
|
|
141
|
+
|
|
142
|
+
### 4.3 Validate a token without the UI
|
|
143
|
+
|
|
144
|
+
Use the Python helper to verify a token directly from the command line. The
|
|
145
|
+
verifier returns `True` for a valid token and `False` otherwise.
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
python -c "import sys; from backend.licenses.verify_license import verify_token; print(verify_token(sys.argv[1], sys.argv[2], 'GNOMAN', '2.0.0'))" backend/licenses/license_public.pem <token>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Replace `<token>` with either the raw token or a Base32 string that decodes to
|
|
152
|
+
one. The helper resolves relative paths with respect to the repository root, so
|
|
153
|
+
invoking it from other directories works as long as you supply the correct
|
|
154
|
+
inputs.
|
|
155
|
+
|
|
156
|
+
### 4.4 Desktop activation flow
|
|
157
|
+
|
|
158
|
+
1. Launch the Electron shell (`npm run dev:electron`) and navigate to the
|
|
159
|
+
license screen if it does not appear automatically.
|
|
160
|
+
2. Enter either token representation. The preload bridge runs
|
|
161
|
+
`verify_license.py` with the checked-in public key.
|
|
162
|
+
3. When verification succeeds, the preload writes `.safevault/license.env` with:
|
|
163
|
+
```
|
|
164
|
+
LICENSE_KEY=<raw token>
|
|
165
|
+
VALIDATED_AT=<unix timestamp>
|
|
166
|
+
```
|
|
167
|
+
4. On subsequent launches the preload re-verifies the stored token. If it has
|
|
168
|
+
expired or the verification fails, the renderer prompts for a new license.
|
|
169
|
+
|
|
170
|
+
For headless automation or regression tests, the REST endpoint
|
|
171
|
+
`POST /api/license` remains available. It performs the same Ed25519 checks using
|
|
172
|
+
Node.js and persists JSON metadata under `.gnoman/license.json` for backwards
|
|
173
|
+
compatibility.
|
|
174
|
+
|
|
175
|
+
## 5. Build, lint, and packaging commands
|
|
176
|
+
|
|
177
|
+
| Command | Description |
|
|
178
|
+
| ------- | ----------- |
|
|
179
|
+
| `npm run lint` | Run ESLint across the backend, main process, renderer, and shared modules. |
|
|
180
|
+
| `npm run build:backend` | Compile the Express API to `dist/backend`. |
|
|
181
|
+
| `npm run build:main` | Compile the Electron main process to `dist/main`. |
|
|
182
|
+
| `npm run build:renderer` | Build the renderer UI into `renderer/dist`. |
|
|
183
|
+
| `npm run build` | Clean and produce all distributable artifacts (backend, main, renderer). |
|
|
184
|
+
| `npm start` | Rebuild and launch the packaged Electron shell. |
|
|
185
|
+
| `npm run start:backend` | Run the compiled backend directly from `dist/backend/index.js`. |
|
|
186
|
+
|
|
187
|
+
Distribution builds live under the `dist/` directory. The `scripts/copyRenderer.js`
|
|
188
|
+
helper copies the renderer bundle into `dist/main/` so the packaged Electron app
|
|
189
|
+
can load it from disk.
|
|
190
|
+
|
|
191
|
+
## 6. Troubleshooting checklist
|
|
192
|
+
|
|
193
|
+
| Symptom | Suggested fix |
|
|
194
|
+
| ------- | -------------- |
|
|
195
|
+
| `ModuleNotFoundError: No module named 'cryptography'` | Install the Python dependency with `pip install cryptography`. |
|
|
196
|
+
| `python3` not found when validating a license | Ensure Python 3.10+ is installed and available on your `PATH`. Update the preload bridge to point at the correct executable if you use pyenv. |
|
|
197
|
+
| `better-sqlite3` fails to compile | Install the platform build tools (Xcode CLI tools, `build-essential`, or Windows Build Tools) before running `npm install` again. |
|
|
198
|
+
| Renderer cannot reach the backend | Confirm `npm run dev:backend` is running and the port matches `renderer/src/config/api.ts`. |
|
|
199
|
+
| License verification unexpectedly fails | Delete `.safevault/license.env` and re-run activation to ensure the stored token has not been corrupted. |
|
|
200
|
+
| Electron window opens without UI in production mode | Run `npm run build:renderer` before launching `npm start` so the packaged assets exist. |
|
|
201
|
+
|
|
202
|
+
Following these conventions keeps every workstation aligned with the offline
|
|
203
|
+
licensing flow and build system that GNOMAN 2.0 expects in production.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Etherscan + Chainlink Integration
|
|
2
|
+
|
|
3
|
+
## Environment Variables
|
|
4
|
+
|
|
5
|
+
Required for Etherscan features:
|
|
6
|
+
|
|
7
|
+
- `ETHERSCAN_API_KEY`
|
|
8
|
+
|
|
9
|
+
Optional Etherscan overrides:
|
|
10
|
+
|
|
11
|
+
- `ETHERSCAN_CHAIN_ID` (default `1`)
|
|
12
|
+
- `ETHERSCAN_BASE_URL` (default `https://api.etherscan.io/api`)
|
|
13
|
+
|
|
14
|
+
Required for Chainlink runtime configuration:
|
|
15
|
+
|
|
16
|
+
- `CHAINLINK_NODE_URL`
|
|
17
|
+
- `CHAINLINK_JOB_ID`
|
|
18
|
+
- `CHAINLINK_OPERATOR_ADDRESS`
|
|
19
|
+
- `CHAINLINK_LINK_TOKEN`
|
|
20
|
+
- `RPC_URL` (or `GNOMAN_RPC_URL` / `SAFE_RPC_URL`)
|
|
21
|
+
|
|
22
|
+
## Service Modules
|
|
23
|
+
|
|
24
|
+
- `backend/services/etherscanService.ts`
|
|
25
|
+
- ABI auto-resolve by address
|
|
26
|
+
- proxy-aware implementation ABI resolution (`getsourcecode` then `getabi`)
|
|
27
|
+
- address-tethered cache + metadata sidecar
|
|
28
|
+
- in-process cache and per-process fetch-once semantics
|
|
29
|
+
- 3 req/sec limiter for free-tier compatibility
|
|
30
|
+
- tx history and gas oracle helpers
|
|
31
|
+
- `backend/services/chainlinkService.ts`
|
|
32
|
+
- price feed helper for `latestRoundData`
|
|
33
|
+
- runtime env validation helper for node/job/operator/link settings
|
|
34
|
+
- `backend/utils/http.ts`
|
|
35
|
+
- reusable axios HTTP client for Etherscan
|
|
36
|
+
- `backend/utils/signer.ts`
|
|
37
|
+
- backend signer helper for server-side execution
|
|
38
|
+
|
|
39
|
+
## Solidity Examples
|
|
40
|
+
|
|
41
|
+
- `contracts/PriceFeedConsumer.sol`
|
|
42
|
+
- `contracts/OracleConsumer.sol`
|
|
43
|
+
|
|
44
|
+
These examples are minimal references for using Chainlink feed reads and oracle request/fulfillment flow scaffolding.
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# GNOMAN 2.0 License Development Guide
|
|
2
|
+
|
|
3
|
+
This reference walks through generating, issuing, and validating offline license
|
|
4
|
+
tokens for GNOMAN 2.0. All examples assume you run commands from the repository
|
|
5
|
+
root (the directory containing `package.json`).
|
|
6
|
+
|
|
7
|
+
> ℹ️ A mirrored copy of this document lives at
|
|
8
|
+
> `docs/wiki/license-dev-guide.md` so the in-app wiki surfaces the same
|
|
9
|
+
> instructions. Update both files whenever you make changes.
|
|
10
|
+
|
|
11
|
+
## 1. Prerequisites
|
|
12
|
+
|
|
13
|
+
- Python 3.10 or newer
|
|
14
|
+
- `pip install cryptography`
|
|
15
|
+
- Access to the environment-specific Ed25519 private key (keep it offline)
|
|
16
|
+
|
|
17
|
+
## 2. Generate a keypair
|
|
18
|
+
|
|
19
|
+
Run the helper once per environment to mint a fresh Ed25519 keypair:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
python backend/licenses/make_keys.py
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Outputs:
|
|
26
|
+
|
|
27
|
+
- `backend/licenses/license_private.pem` – keep offline, never commit.
|
|
28
|
+
- `backend/licenses/license_public.pem` – check into source control and ship
|
|
29
|
+
with the application.
|
|
30
|
+
|
|
31
|
+
## 3. Configure the CLI environment
|
|
32
|
+
|
|
33
|
+
Copy `.env.example` to `.env` and set `LICENSE_PRIVATE_KEY` to the path of the
|
|
34
|
+
private key relative to the repository root. The default value
|
|
35
|
+
`backend/licenses/license_private.pem` is resolved automatically.
|
|
36
|
+
|
|
37
|
+
## 4. Issue a license token
|
|
38
|
+
|
|
39
|
+
Run the issuer with explicit arguments so the command is copy/paste friendly:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
python backend/licenses/gen_license.py \
|
|
43
|
+
--priv backend/licenses/license_private.pem \
|
|
44
|
+
--id customer-or-workstation \
|
|
45
|
+
--product GNOMAN \
|
|
46
|
+
--version 2.0.0 \
|
|
47
|
+
--days 365
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- `--priv` overrides the default private key path.
|
|
51
|
+
- `--id` can be any identifier useful for auditing (customer, workstation, etc.).
|
|
52
|
+
- `--product` and `--version` must match what the application expects.
|
|
53
|
+
- `--days` controls the validity window.
|
|
54
|
+
|
|
55
|
+
The script prints:
|
|
56
|
+
|
|
57
|
+
- **RAW TOKEN** – base64url payload + signature separated by a dot.
|
|
58
|
+
- **HUMAN-FRIENDLY** – Base32 groups separated by dashes for manual entry.
|
|
59
|
+
|
|
60
|
+
Store the raw token securely. If you need the Base32 form later, you can derive
|
|
61
|
+
it by running the same command again or by base32-encoding the raw value with a
|
|
62
|
+
short Python snippet.
|
|
63
|
+
|
|
64
|
+
## 5. Validate a token locally
|
|
65
|
+
|
|
66
|
+
Confirm a token is still valid before distributing it:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
python -c "import sys; from backend.licenses.verify_license import verify_token; print(verify_token(sys.argv[1], sys.argv[2], 'GNOMAN', '2.0.0'))" backend/licenses/license_public.pem <token>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Substitute `<token>` with either representation. A valid token prints `True`;
|
|
73
|
+
any failure (bad signature, wrong product/version, expired timestamp) prints
|
|
74
|
+
`False`.
|
|
75
|
+
|
|
76
|
+
## 6. Desktop activation flow
|
|
77
|
+
|
|
78
|
+
1. Launch the Electron app (`npm run dev:electron`).
|
|
79
|
+
2. Enter the raw or Base32 token on the activation screen.
|
|
80
|
+
3. The preload bridge executes `verify_license.py` with the checked-in public
|
|
81
|
+
key. Successful validation creates `.safevault/license.env` containing:
|
|
82
|
+
```
|
|
83
|
+
LICENSE_KEY=<raw token>
|
|
84
|
+
VALIDATED_AT=<unix timestamp>
|
|
85
|
+
```
|
|
86
|
+
4. On subsequent launches the preload re-verifies the stored token. Expired or
|
|
87
|
+
tampered tokens force the user back to the activation screen.
|
|
88
|
+
|
|
89
|
+
## 7. Backend compatibility endpoint
|
|
90
|
+
|
|
91
|
+
Automation can continue to call the REST endpoint `POST /api/license`. It
|
|
92
|
+
performs the same Ed25519 verification in Node.js and persists metadata to
|
|
93
|
+
`.gnoman/license.json`. The renderer no longer depends on this file, but legacy
|
|
94
|
+
integrations may still read it.
|
|
95
|
+
|
|
96
|
+
## 8. Troubleshooting
|
|
97
|
+
|
|
98
|
+
| Symptom | Resolution |
|
|
99
|
+
| --- | --- |
|
|
100
|
+
| `FileNotFoundError` for the private key | Confirm `LICENSE_PRIVATE_KEY` points at the correct path and that the key lives outside version control. |
|
|
101
|
+
| `ModuleNotFoundError: No module named 'cryptography'` | Install the dependency with `pip install cryptography`. |
|
|
102
|
+
| Token prints `False` unexpectedly | Decode the payload with `python -c "import base64,sys; payload=sys.argv[1].split('.')[0]; pad='='*((4-len(payload)%4)%4); print(base64.urlsafe_b64decode(payload+pad).decode())" <token>` to confirm the product, version, and expiry are correct. |
|
|
103
|
+
| Desktop app refuses a known-good token | Delete `.safevault/license.env` and re-run activation to ensure the cached token has not been modified. |
|
|
104
|
+
|
|
105
|
+
Following this checklist ensures every issued license aligns with the offline
|
|
106
|
+
verification logic that ships with GNOMAN 2.0.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Robinhood integration templates for Gnoman
|
|
2
|
+
|
|
3
|
+
Robinhood currently publishes official developer APIs for **crypto trading**, while stock/ETF execution relies on undocumented endpoints used by first-party applications.
|
|
4
|
+
|
|
5
|
+
## Supported path: Robinhood Crypto API
|
|
6
|
+
|
|
7
|
+
The backend includes template helpers under `backend/services/robinhood`:
|
|
8
|
+
|
|
9
|
+
- `auth.ts` – ECDSA request-signing helper (`signRobinhoodRequest`).
|
|
10
|
+
- `client.ts` – `RobinhoodCryptoClient` with:
|
|
11
|
+
- `getAccountBalance()`
|
|
12
|
+
- `placeOrder(symbol, amountCash)`
|
|
13
|
+
- `getOrderStatus(orderID)`
|
|
14
|
+
- built-in HTTP 429 retry handling
|
|
15
|
+
- `purchaseCryptoWithCash(...)` convenience helper for Gnoman purchase flows.
|
|
16
|
+
|
|
17
|
+
### Environment variables
|
|
18
|
+
|
|
19
|
+
- `ROBINHOOD_API_KEY` – API key from Robinhood portal.
|
|
20
|
+
- `ROBINHOOD_PRIVATE_KEY` – PEM private key used to sign requests.
|
|
21
|
+
|
|
22
|
+
## Unsupported path: Robinhood equity endpoints (use at your own risk)
|
|
23
|
+
|
|
24
|
+
`unofficialClient.ts` is intentionally guarded behind:
|
|
25
|
+
|
|
26
|
+
- `GNOMAN_ENABLE_UNOFFICIAL_ROBINHOOD=true`
|
|
27
|
+
|
|
28
|
+
If the feature flag is not set, calls throw immediately.
|
|
29
|
+
|
|
30
|
+
> ⚠️ Undocumented endpoints can change without notice and may violate platform terms. Use only for local experiments.
|