@xylabs/aries 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +693 -0
- package/dist/actions/audit/auditPaths.mjs +22 -0
- package/dist/actions/audit/auditPaths.mjs.map +1 -0
- package/dist/actions/audit/index.mjs +739 -0
- package/dist/actions/audit/index.mjs.map +1 -0
- package/dist/actions/audit/installPlugin.mjs +298 -0
- package/dist/actions/audit/installPlugin.mjs.map +1 -0
- package/dist/actions/audit/listSessions.mjs +93 -0
- package/dist/actions/audit/listSessions.mjs.map +1 -0
- package/dist/actions/audit/openAuditDir.mjs +44 -0
- package/dist/actions/audit/openAuditDir.mjs.map +1 -0
- package/dist/actions/audit/searchAudit.mjs +77 -0
- package/dist/actions/audit/searchAudit.mjs.map +1 -0
- package/dist/actions/audit/showAiMeta.mjs +105 -0
- package/dist/actions/audit/showAiMeta.mjs.map +1 -0
- package/dist/actions/audit/showSession.mjs +105 -0
- package/dist/actions/audit/showSession.mjs.map +1 -0
- package/dist/actions/audit/statusAudit.mjs +98 -0
- package/dist/actions/audit/statusAudit.mjs.map +1 -0
- package/dist/actions/clamp/clampAudit.mjs +53 -0
- package/dist/actions/clamp/clampAudit.mjs.map +1 -0
- package/dist/actions/clamp/index.mjs +2258 -0
- package/dist/actions/clamp/index.mjs.map +1 -0
- package/dist/actions/clamp/ipcServer.mjs +55 -0
- package/dist/actions/clamp/ipcServer.mjs.map +1 -0
- package/dist/actions/clamp/policyManagement.mjs +144 -0
- package/dist/actions/clamp/policyManagement.mjs.map +1 -0
- package/dist/actions/clamp/promptUser.mjs +91 -0
- package/dist/actions/clamp/promptUser.mjs.map +1 -0
- package/dist/actions/clamp/runClamped.mjs +2107 -0
- package/dist/actions/clamp/runClamped.mjs.map +1 -0
- package/dist/actions/clamp/sandboxExec.mjs +1612 -0
- package/dist/actions/clamp/sandboxExec.mjs.map +1 -0
- package/dist/actions/clamp/shellEnvSetup.mjs +59 -0
- package/dist/actions/clamp/shellEnvSetup.mjs.map +1 -0
- package/dist/actions/clamp/shimGenerator.mjs +68 -0
- package/dist/actions/clamp/shimGenerator.mjs.map +1 -0
- package/dist/actions/clamp/terminalRenderer.mjs +145 -0
- package/dist/actions/clamp/terminalRenderer.mjs.map +1 -0
- package/dist/actions/datalake/audit/auditLog.mjs +191 -0
- package/dist/actions/datalake/audit/auditLog.mjs.map +1 -0
- package/dist/actions/datalake/createDatalake.mjs +127 -0
- package/dist/actions/datalake/createDatalake.mjs.map +1 -0
- package/dist/actions/datalake/describeDatalake.mjs +159 -0
- package/dist/actions/datalake/describeDatalake.mjs.map +1 -0
- package/dist/actions/datalake/destroyDatalake.mjs +34 -0
- package/dist/actions/datalake/destroyDatalake.mjs.map +1 -0
- package/dist/actions/datalake/dev/downDevServer.mjs +102 -0
- package/dist/actions/datalake/dev/downDevServer.mjs.map +1 -0
- package/dist/actions/datalake/dev/index.mjs +369 -0
- package/dist/actions/datalake/dev/index.mjs.map +1 -0
- package/dist/actions/datalake/dev/logsDevServer.mjs +44 -0
- package/dist/actions/datalake/dev/logsDevServer.mjs.map +1 -0
- package/dist/actions/datalake/dev/paths.mjs +25 -0
- package/dist/actions/datalake/dev/paths.mjs.map +1 -0
- package/dist/actions/datalake/dev/resetDevServer.mjs +118 -0
- package/dist/actions/datalake/dev/resetDevServer.mjs.map +1 -0
- package/dist/actions/datalake/dev/resolveServerBin.mjs +26 -0
- package/dist/actions/datalake/dev/resolveServerBin.mjs.map +1 -0
- package/dist/actions/datalake/dev/state.mjs +62 -0
- package/dist/actions/datalake/dev/state.mjs.map +1 -0
- package/dist/actions/datalake/dev/statusDevServer.mjs +101 -0
- package/dist/actions/datalake/dev/statusDevServer.mjs.map +1 -0
- package/dist/actions/datalake/dev/upDevServer.mjs +221 -0
- package/dist/actions/datalake/dev/upDevServer.mjs.map +1 -0
- package/dist/actions/datalake/dev/waitForHealth.mjs +22 -0
- package/dist/actions/datalake/dev/waitForHealth.mjs.map +1 -0
- package/dist/actions/datalake/formatters.mjs +90 -0
- package/dist/actions/datalake/formatters.mjs.map +1 -0
- package/dist/actions/datalake/grantAccess.mjs +116 -0
- package/dist/actions/datalake/grantAccess.mjs.map +1 -0
- package/dist/actions/datalake/index.mjs +361 -0
- package/dist/actions/datalake/index.mjs.map +1 -0
- package/dist/actions/datalake/listDatalakes.mjs +54 -0
- package/dist/actions/datalake/listDatalakes.mjs.map +1 -0
- package/dist/actions/datalake/login.mjs +20 -0
- package/dist/actions/datalake/login.mjs.map +1 -0
- package/dist/actions/datalake/logout.mjs +11 -0
- package/dist/actions/datalake/logout.mjs.map +1 -0
- package/dist/actions/datalake/mintToken.mjs +37 -0
- package/dist/actions/datalake/mintToken.mjs.map +1 -0
- package/dist/actions/datalake/parseSize.mjs +21 -0
- package/dist/actions/datalake/parseSize.mjs.map +1 -0
- package/dist/actions/datalake/payloads/fetchPayload.mjs +76 -0
- package/dist/actions/datalake/payloads/fetchPayload.mjs.map +1 -0
- package/dist/actions/datalake/payloads/index.mjs +271 -0
- package/dist/actions/datalake/payloads/index.mjs.map +1 -0
- package/dist/actions/datalake/payloads/mintAndConnect.mjs +46 -0
- package/dist/actions/datalake/payloads/mintAndConnect.mjs.map +1 -0
- package/dist/actions/datalake/payloads/parsePayloadsFile.mjs +71 -0
- package/dist/actions/datalake/payloads/parsePayloadsFile.mjs.map +1 -0
- package/dist/actions/datalake/payloads/pushPayloads.mjs +181 -0
- package/dist/actions/datalake/payloads/pushPayloads.mjs.map +1 -0
- package/dist/actions/datalake/payloads/tailPayloads.mjs +106 -0
- package/dist/actions/datalake/payloads/tailPayloads.mjs.map +1 -0
- package/dist/actions/datalake/resolveTarget.mjs +15 -0
- package/dist/actions/datalake/resolveTarget.mjs.map +1 -0
- package/dist/actions/datalake/revokeAccess.mjs +108 -0
- package/dist/actions/datalake/revokeAccess.mjs.map +1 -0
- package/dist/actions/datalake/useDatalake.mjs +22 -0
- package/dist/actions/datalake/useDatalake.mjs.map +1 -0
- package/dist/actions/detect/detectAiClients.mjs +405 -0
- package/dist/actions/detect/detectAiClients.mjs.map +1 -0
- package/dist/actions/detect/index.mjs +405 -0
- package/dist/actions/detect/index.mjs.map +1 -0
- package/dist/actions/hash/algorithms/blockhash.mjs +61 -0
- package/dist/actions/hash/algorithms/blockhash.mjs.map +1 -0
- package/dist/actions/hash/algorithms/chromaprint.mjs +205 -0
- package/dist/actions/hash/algorithms/chromaprint.mjs.map +1 -0
- package/dist/actions/hash/algorithms/dhash.mjs +75 -0
- package/dist/actions/hash/algorithms/dhash.mjs.map +1 -0
- package/dist/actions/hash/algorithms/index.mjs +818 -0
- package/dist/actions/hash/algorithms/index.mjs.map +1 -0
- package/dist/actions/hash/algorithms/nilsimsa.mjs +27 -0
- package/dist/actions/hash/algorithms/nilsimsa.mjs.map +1 -0
- package/dist/actions/hash/algorithms/pdq.mjs +83 -0
- package/dist/actions/hash/algorithms/pdq.mjs.map +1 -0
- package/dist/actions/hash/algorithms/phash.mjs +71 -0
- package/dist/actions/hash/algorithms/phash.mjs.map +1 -0
- package/dist/actions/hash/algorithms/sha256.mjs +24 -0
- package/dist/actions/hash/algorithms/sha256.mjs.map +1 -0
- package/dist/actions/hash/algorithms/ssdeep.mjs +203 -0
- package/dist/actions/hash/algorithms/ssdeep.mjs.map +1 -0
- package/dist/actions/hash/algorithms/tlsh.mjs +66 -0
- package/dist/actions/hash/algorithms/tlsh.mjs.map +1 -0
- package/dist/actions/hash/algorithms/types.mjs +1 -0
- package/dist/actions/hash/algorithms/types.mjs.map +1 -0
- package/dist/actions/hash/algorithms/videoFrames.mjs +404 -0
- package/dist/actions/hash/algorithms/videoFrames.mjs.map +1 -0
- package/dist/actions/hash/algorithms/xyo.mjs +30 -0
- package/dist/actions/hash/algorithms/xyo.mjs.map +1 -0
- package/dist/actions/hash/compareHashes.mjs +823 -0
- package/dist/actions/hash/compareHashes.mjs.map +1 -0
- package/dist/actions/hash/hashInput.mjs +868 -0
- package/dist/actions/hash/hashInput.mjs.map +1 -0
- package/dist/actions/hash/index.mjs +881 -0
- package/dist/actions/hash/index.mjs.map +1 -0
- package/dist/actions/hash/lib/hamming.mjs +44 -0
- package/dist/actions/hash/lib/hamming.mjs.map +1 -0
- package/dist/actions/hash/lib/levenshtein.mjs +36 -0
- package/dist/actions/hash/lib/levenshtein.mjs.map +1 -0
- package/dist/actions/hash/lib/runBinary.mjs +54 -0
- package/dist/actions/hash/lib/runBinary.mjs.map +1 -0
- package/dist/actions/hash/lib/which.mjs +36 -0
- package/dist/actions/hash/lib/which.mjs.map +1 -0
- package/dist/actions/hash/lib/withTempfile.mjs +19 -0
- package/dist/actions/hash/lib/withTempfile.mjs.map +1 -0
- package/dist/actions/index.mjs +4615 -0
- package/dist/actions/index.mjs.map +1 -0
- package/dist/actions/printVersion.mjs +12 -0
- package/dist/actions/printVersion.mjs.map +1 -0
- package/dist/actions/sync/index.mjs +51 -0
- package/dist/actions/sync/index.mjs.map +1 -0
- package/dist/actions/sync/syncAiConfig.mjs +51 -0
- package/dist/actions/sync/syncAiConfig.mjs.map +1 -0
- package/dist/actions/wallet/account/deriveAndAdd.mjs +394 -0
- package/dist/actions/wallet/account/deriveAndAdd.mjs.map +1 -0
- package/dist/actions/wallet/account/getActiveWallet.mjs +338 -0
- package/dist/actions/wallet/account/getActiveWallet.mjs.map +1 -0
- package/dist/actions/wallet/account/labelAccount.mjs +389 -0
- package/dist/actions/wallet/account/labelAccount.mjs.map +1 -0
- package/dist/actions/wallet/account/listAccounts.mjs +374 -0
- package/dist/actions/wallet/account/listAccounts.mjs.map +1 -0
- package/dist/actions/wallet/account/removeAccount.mjs +384 -0
- package/dist/actions/wallet/account/removeAccount.mjs.map +1 -0
- package/dist/actions/wallet/account/showAccount.mjs +368 -0
- package/dist/actions/wallet/account/showAccount.mjs.map +1 -0
- package/dist/actions/wallet/addressBook/storage.mjs +110 -0
- package/dist/actions/wallet/addressBook/storage.mjs.map +1 -0
- package/dist/actions/wallet/backup/exportBackup.mjs +93 -0
- package/dist/actions/wallet/backup/exportBackup.mjs.map +1 -0
- package/dist/actions/wallet/backup/importBackup.mjs +142 -0
- package/dist/actions/wallet/backup/importBackup.mjs.map +1 -0
- package/dist/actions/wallet/balance/getBalance.mjs +434 -0
- package/dist/actions/wallet/balance/getBalance.mjs.map +1 -0
- package/dist/actions/wallet/client/walletClient.mjs +64 -0
- package/dist/actions/wallet/client/walletClient.mjs.map +1 -0
- package/dist/actions/wallet/contact/contactActions.mjs +120 -0
- package/dist/actions/wallet/contact/contactActions.mjs.map +1 -0
- package/dist/actions/wallet/contact/storage.mjs +69 -0
- package/dist/actions/wallet/contact/storage.mjs.map +1 -0
- package/dist/actions/wallet/index.mjs +1439 -0
- package/dist/actions/wallet/index.mjs.map +1 -0
- package/dist/actions/wallet/network/networkActions.mjs +137 -0
- package/dist/actions/wallet/network/networkActions.mjs.map +1 -0
- package/dist/actions/wallet/network/storage.mjs +93 -0
- package/dist/actions/wallet/network/storage.mjs.map +1 -0
- package/dist/actions/wallet/password/changePassword.mjs +282 -0
- package/dist/actions/wallet/password/changePassword.mjs.map +1 -0
- package/dist/actions/wallet/password/getActiveKey.mjs +297 -0
- package/dist/actions/wallet/password/getActiveKey.mjs.map +1 -0
- package/dist/actions/wallet/password/initOrUnlock.mjs +337 -0
- package/dist/actions/wallet/password/initOrUnlock.mjs.map +1 -0
- package/dist/actions/wallet/password/passwordStorage.mjs +69 -0
- package/dist/actions/wallet/password/passwordStorage.mjs.map +1 -0
- package/dist/actions/wallet/password/setPassword.mjs +138 -0
- package/dist/actions/wallet/password/setPassword.mjs.map +1 -0
- package/dist/actions/wallet/password/validatePassword.mjs +123 -0
- package/dist/actions/wallet/password/validatePassword.mjs.map +1 -0
- package/dist/actions/wallet/passwordKey.mjs +87 -0
- package/dist/actions/wallet/passwordKey.mjs.map +1 -0
- package/dist/actions/wallet/paths.mjs +26 -0
- package/dist/actions/wallet/paths.mjs.map +1 -0
- package/dist/actions/wallet/prompt.mjs +93 -0
- package/dist/actions/wallet/prompt.mjs.map +1 -0
- package/dist/actions/wallet/seedPhrase/createPhrase.mjs +392 -0
- package/dist/actions/wallet/seedPhrase/createPhrase.mjs.map +1 -0
- package/dist/actions/wallet/seedPhrase/exportPhrase.mjs +334 -0
- package/dist/actions/wallet/seedPhrase/exportPhrase.mjs.map +1 -0
- package/dist/actions/wallet/seedPhrase/idGen.mjs +11 -0
- package/dist/actions/wallet/seedPhrase/idGen.mjs.map +1 -0
- package/dist/actions/wallet/seedPhrase/importPhrase.mjs +393 -0
- package/dist/actions/wallet/seedPhrase/importPhrase.mjs.map +1 -0
- package/dist/actions/wallet/seedPhrase/listPhrases.mjs +62 -0
- package/dist/actions/wallet/seedPhrase/listPhrases.mjs.map +1 -0
- package/dist/actions/wallet/seedPhrase/phraseStorage.mjs +89 -0
- package/dist/actions/wallet/seedPhrase/phraseStorage.mjs.map +1 -0
- package/dist/actions/wallet/seedPhrase/removePhrase.mjs +366 -0
- package/dist/actions/wallet/seedPhrase/removePhrase.mjs.map +1 -0
- package/dist/actions/wallet/seedPhrase/renamePhrase.mjs +78 -0
- package/dist/actions/wallet/seedPhrase/renamePhrase.mjs.map +1 -0
- package/dist/actions/wallet/seedPhrase/types.mjs +1 -0
- package/dist/actions/wallet/seedPhrase/types.mjs.map +1 -0
- package/dist/actions/wallet/seedPhrase/usePhrase.mjs +83 -0
- package/dist/actions/wallet/seedPhrase/usePhrase.mjs.map +1 -0
- package/dist/actions/wallet/session/machineId.mjs +145 -0
- package/dist/actions/wallet/session/machineId.mjs.map +1 -0
- package/dist/actions/wallet/session/sessionCache.mjs +221 -0
- package/dist/actions/wallet/session/sessionCache.mjs.map +1 -0
- package/dist/actions/wallet/session/unlock.mjs +307 -0
- package/dist/actions/wallet/session/unlock.mjs.map +1 -0
- package/dist/actions/wallet/sign/signPayload.mjs +637 -0
- package/dist/actions/wallet/sign/signPayload.mjs.map +1 -0
- package/dist/actions/wallet/storage.mjs +51 -0
- package/dist/actions/wallet/storage.mjs.map +1 -0
- package/dist/actions/wallet/transaction/broadcastTransaction.mjs +453 -0
- package/dist/actions/wallet/transaction/broadcastTransaction.mjs.map +1 -0
- package/dist/actions/wallet/transaction/sendTransaction.mjs +457 -0
- package/dist/actions/wallet/transaction/sendTransaction.mjs.map +1 -0
- package/dist/actions/wallet/transaction/signTransactionFile.mjs +378 -0
- package/dist/actions/wallet/transaction/signTransactionFile.mjs.map +1 -0
- package/dist/actions/xyo/index.mjs +138 -0
- package/dist/actions/xyo/index.mjs.map +1 -0
- package/dist/actions/xyo/transaction/index.mjs +138 -0
- package/dist/actions/xyo/transaction/index.mjs.map +1 -0
- package/dist/actions/xyo/transaction/validateTransactions.mjs +138 -0
- package/dist/actions/xyo/transaction/validateTransactions.mjs.map +1 -0
- package/dist/aries.mjs +8466 -0
- package/dist/aries.mjs.map +1 -0
- package/dist/bin/aries.mjs +8472 -0
- package/dist/bin/aries.mjs.map +1 -0
- package/dist/commands/aiCommand.mjs +492 -0
- package/dist/commands/aiCommand.mjs.map +1 -0
- package/dist/commands/auditAiCommand.mjs +119 -0
- package/dist/commands/auditAiCommand.mjs.map +1 -0
- package/dist/commands/auditCommand.mjs +857 -0
- package/dist/commands/auditCommand.mjs.map +1 -0
- package/dist/commands/auditInstallCommand.mjs +324 -0
- package/dist/commands/auditInstallCommand.mjs.map +1 -0
- package/dist/commands/auditListCommand.mjs +107 -0
- package/dist/commands/auditListCommand.mjs.map +1 -0
- package/dist/commands/auditOpenCommand.mjs +51 -0
- package/dist/commands/auditOpenCommand.mjs.map +1 -0
- package/dist/commands/auditSearchCommand.mjs +98 -0
- package/dist/commands/auditSearchCommand.mjs.map +1 -0
- package/dist/commands/auditShowCommand.mjs +123 -0
- package/dist/commands/auditShowCommand.mjs.map +1 -0
- package/dist/commands/auditStatusCommand.mjs +105 -0
- package/dist/commands/auditStatusCommand.mjs.map +1 -0
- package/dist/commands/clampCommand.mjs +2328 -0
- package/dist/commands/clampCommand.mjs.map +1 -0
- package/dist/commands/clampPolicyCommand.mjs +184 -0
- package/dist/commands/clampPolicyCommand.mjs.map +1 -0
- package/dist/commands/clampPolicyInitCommand.mjs +63 -0
- package/dist/commands/clampPolicyInitCommand.mjs.map +1 -0
- package/dist/commands/clampPolicyListCommand.mjs +56 -0
- package/dist/commands/clampPolicyListCommand.mjs.map +1 -0
- package/dist/commands/clampPolicyShowCommand.mjs +83 -0
- package/dist/commands/clampPolicyShowCommand.mjs.map +1 -0
- package/dist/commands/clampRunCommand.mjs +2137 -0
- package/dist/commands/clampRunCommand.mjs.map +1 -0
- package/dist/commands/datalakeAuditCommand.mjs +273 -0
- package/dist/commands/datalakeAuditCommand.mjs.map +1 -0
- package/dist/commands/datalakeCommand.mjs +1637 -0
- package/dist/commands/datalakeCommand.mjs.map +1 -0
- package/dist/commands/datalakeCreateCommand.mjs +189 -0
- package/dist/commands/datalakeCreateCommand.mjs.map +1 -0
- package/dist/commands/datalakeDescribeCommand.mjs +172 -0
- package/dist/commands/datalakeDescribeCommand.mjs.map +1 -0
- package/dist/commands/datalakeDestroyCommand.mjs +53 -0
- package/dist/commands/datalakeDestroyCommand.mjs.map +1 -0
- package/dist/commands/datalakeDevCommand.mjs +470 -0
- package/dist/commands/datalakeDevCommand.mjs.map +1 -0
- package/dist/commands/datalakeDevDownCommand.mjs +111 -0
- package/dist/commands/datalakeDevDownCommand.mjs.map +1 -0
- package/dist/commands/datalakeDevLogsCommand.mjs +65 -0
- package/dist/commands/datalakeDevLogsCommand.mjs.map +1 -0
- package/dist/commands/datalakeDevResetCommand.mjs +125 -0
- package/dist/commands/datalakeDevResetCommand.mjs.map +1 -0
- package/dist/commands/datalakeDevStatusCommand.mjs +110 -0
- package/dist/commands/datalakeDevStatusCommand.mjs.map +1 -0
- package/dist/commands/datalakeDevUpCommand.mjs +268 -0
- package/dist/commands/datalakeDevUpCommand.mjs.map +1 -0
- package/dist/commands/datalakeFetchCommand.mjs +106 -0
- package/dist/commands/datalakeFetchCommand.mjs.map +1 -0
- package/dist/commands/datalakeGrantCommand.mjs +147 -0
- package/dist/commands/datalakeGrantCommand.mjs.map +1 -0
- package/dist/commands/datalakeListCommand.mjs +61 -0
- package/dist/commands/datalakeListCommand.mjs.map +1 -0
- package/dist/commands/datalakeLoginCommand.mjs +39 -0
- package/dist/commands/datalakeLoginCommand.mjs.map +1 -0
- package/dist/commands/datalakeLogoutCommand.mjs +20 -0
- package/dist/commands/datalakeLogoutCommand.mjs.map +1 -0
- package/dist/commands/datalakePushCommand.mjs +214 -0
- package/dist/commands/datalakePushCommand.mjs.map +1 -0
- package/dist/commands/datalakeRevokeCommand.mjs +127 -0
- package/dist/commands/datalakeRevokeCommand.mjs.map +1 -0
- package/dist/commands/datalakeTailCommand.mjs +144 -0
- package/dist/commands/datalakeTailCommand.mjs.map +1 -0
- package/dist/commands/datalakeTokenCommand.mjs +61 -0
- package/dist/commands/datalakeTokenCommand.mjs.map +1 -0
- package/dist/commands/datalakeUseCommand.mjs +35 -0
- package/dist/commands/datalakeUseCommand.mjs.map +1 -0
- package/dist/commands/detectCommand.mjs +419 -0
- package/dist/commands/detectCommand.mjs.map +1 -0
- package/dist/commands/hashCommand.mjs +976 -0
- package/dist/commands/hashCommand.mjs.map +1 -0
- package/dist/commands/hashCompareCommand.mjs +865 -0
- package/dist/commands/hashCompareCommand.mjs.map +1 -0
- package/dist/commands/index.mjs +8461 -0
- package/dist/commands/index.mjs.map +1 -0
- package/dist/commands/syncCommand.mjs +66 -0
- package/dist/commands/syncCommand.mjs.map +1 -0
- package/dist/commands/versionCommand.mjs +24 -0
- package/dist/commands/versionCommand.mjs.map +1 -0
- package/dist/commands/walletAccountCommand.mjs +536 -0
- package/dist/commands/walletAccountCommand.mjs.map +1 -0
- package/dist/commands/walletAccountDeriveCommand.mjs +415 -0
- package/dist/commands/walletAccountDeriveCommand.mjs.map +1 -0
- package/dist/commands/walletAccountLabelCommand.mjs +405 -0
- package/dist/commands/walletAccountLabelCommand.mjs.map +1 -0
- package/dist/commands/walletAccountListCommand.mjs +381 -0
- package/dist/commands/walletAccountListCommand.mjs.map +1 -0
- package/dist/commands/walletAccountRemoveCommand.mjs +396 -0
- package/dist/commands/walletAccountRemoveCommand.mjs.map +1 -0
- package/dist/commands/walletAccountShowCommand.mjs +380 -0
- package/dist/commands/walletAccountShowCommand.mjs.map +1 -0
- package/dist/commands/walletBackupCommand.mjs +222 -0
- package/dist/commands/walletBackupCommand.mjs.map +1 -0
- package/dist/commands/walletBackupExportCommand.mjs +107 -0
- package/dist/commands/walletBackupExportCommand.mjs.map +1 -0
- package/dist/commands/walletBackupImportCommand.mjs +154 -0
- package/dist/commands/walletBackupImportCommand.mjs.map +1 -0
- package/dist/commands/walletBalanceCommand.mjs +448 -0
- package/dist/commands/walletBalanceCommand.mjs.map +1 -0
- package/dist/commands/walletCommand.mjs +1968 -0
- package/dist/commands/walletCommand.mjs.map +1 -0
- package/dist/commands/walletContactAddCommand.mjs +111 -0
- package/dist/commands/walletContactAddCommand.mjs.map +1 -0
- package/dist/commands/walletContactCommand.mjs +184 -0
- package/dist/commands/walletContactCommand.mjs.map +1 -0
- package/dist/commands/walletContactListCommand.mjs +66 -0
- package/dist/commands/walletContactListCommand.mjs.map +1 -0
- package/dist/commands/walletContactRemoveCommand.mjs +97 -0
- package/dist/commands/walletContactRemoveCommand.mjs.map +1 -0
- package/dist/commands/walletContactRenameCommand.mjs +114 -0
- package/dist/commands/walletContactRenameCommand.mjs.map +1 -0
- package/dist/commands/walletCreateCommand.mjs +407 -0
- package/dist/commands/walletCreateCommand.mjs.map +1 -0
- package/dist/commands/walletExportCommand.mjs +345 -0
- package/dist/commands/walletExportCommand.mjs.map +1 -0
- package/dist/commands/walletImportCommand.mjs +413 -0
- package/dist/commands/walletImportCommand.mjs.map +1 -0
- package/dist/commands/walletListCommand.mjs +69 -0
- package/dist/commands/walletListCommand.mjs.map +1 -0
- package/dist/commands/walletLockCommand.mjs +56 -0
- package/dist/commands/walletLockCommand.mjs.map +1 -0
- package/dist/commands/walletNetworkAddCommand.mjs +131 -0
- package/dist/commands/walletNetworkAddCommand.mjs.map +1 -0
- package/dist/commands/walletNetworkCommand.mjs +206 -0
- package/dist/commands/walletNetworkCommand.mjs.map +1 -0
- package/dist/commands/walletNetworkListCommand.mjs +104 -0
- package/dist/commands/walletNetworkListCommand.mjs.map +1 -0
- package/dist/commands/walletNetworkRemoveCommand.mjs +112 -0
- package/dist/commands/walletNetworkRemoveCommand.mjs.map +1 -0
- package/dist/commands/walletNetworkUseCommand.mjs +110 -0
- package/dist/commands/walletNetworkUseCommand.mjs.map +1 -0
- package/dist/commands/walletPasswordChangeCommand.mjs +291 -0
- package/dist/commands/walletPasswordChangeCommand.mjs.map +1 -0
- package/dist/commands/walletPasswordCommand.mjs +301 -0
- package/dist/commands/walletPasswordCommand.mjs.map +1 -0
- package/dist/commands/walletRemoveCommand.mjs +378 -0
- package/dist/commands/walletRemoveCommand.mjs.map +1 -0
- package/dist/commands/walletRenameCommand.mjs +94 -0
- package/dist/commands/walletRenameCommand.mjs.map +1 -0
- package/dist/commands/walletSignCommand.mjs +662 -0
- package/dist/commands/walletSignCommand.mjs.map +1 -0
- package/dist/commands/walletTxBroadcastCommand.mjs +473 -0
- package/dist/commands/walletTxBroadcastCommand.mjs.map +1 -0
- package/dist/commands/walletTxCommand.mjs +612 -0
- package/dist/commands/walletTxCommand.mjs.map +1 -0
- package/dist/commands/walletTxSendCommand.mjs +492 -0
- package/dist/commands/walletTxSendCommand.mjs.map +1 -0
- package/dist/commands/walletTxSignCommand.mjs +403 -0
- package/dist/commands/walletTxSignCommand.mjs.map +1 -0
- package/dist/commands/walletUnlockCommand.mjs +308 -0
- package/dist/commands/walletUnlockCommand.mjs.map +1 -0
- package/dist/commands/walletUseCommand.mjs +95 -0
- package/dist/commands/walletUseCommand.mjs.map +1 -0
- package/dist/commands/xyoCommand.mjs +188 -0
- package/dist/commands/xyoCommand.mjs.map +1 -0
- package/dist/commands/xyoTxCommand.mjs +178 -0
- package/dist/commands/xyoTxCommand.mjs.map +1 -0
- package/dist/commands/xyoTxValidateCommand.mjs +168 -0
- package/dist/commands/xyoTxValidateCommand.mjs.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.mjs +8466 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types/modules.d.mjs +1 -0
- package/dist/types/modules.d.mjs.map +1 -0
- package/package.json +197 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/wallet/account/deriveAndAdd.ts","../../../src/actions/wallet/paths.ts","../../../src/actions/wallet/storage.ts","../../../src/actions/wallet/addressBook/storage.ts","../../../src/actions/wallet/account/getActiveWallet.ts","../../../src/actions/wallet/prompt.ts","../../../src/actions/wallet/session/sessionCache.ts","../../../src/actions/wallet/passwordKey.ts","../../../src/actions/wallet/session/machineId.ts","../../../src/actions/wallet/password/passwordStorage.ts","../../../src/actions/wallet/password/validatePassword.ts","../../../src/actions/wallet/password/getActiveKey.ts","../../../src/actions/wallet/seedPhrase/phraseStorage.ts","../../../src/actions/wallet/account/labelAccount.ts","../../../src/actions/wallet/account/listAccounts.ts","../../../src/actions/wallet/account/removeAccount.ts","../../../src/actions/wallet/account/showAccount.ts","../../../src/actions/wallet/backup/exportBackup.ts","../../../src/actions/wallet/contact/storage.ts","../../../src/actions/wallet/backup/importBackup.ts","../../../src/actions/wallet/balance/getBalance.ts","../../../src/actions/wallet/client/walletClient.ts","../../../src/actions/wallet/network/storage.ts","../../../src/actions/wallet/contact/contactActions.ts","../../../src/actions/wallet/network/networkActions.ts","../../../src/actions/wallet/password/changePassword.ts","../../../src/actions/wallet/seedPhrase/createPhrase.ts","../../../src/actions/wallet/password/setPassword.ts","../../../src/actions/wallet/password/initOrUnlock.ts","../../../src/actions/wallet/seedPhrase/idGen.ts","../../../src/actions/wallet/seedPhrase/exportPhrase.ts","../../../src/actions/wallet/seedPhrase/importPhrase.ts","../../../src/actions/wallet/seedPhrase/listPhrases.ts","../../../src/actions/wallet/seedPhrase/removePhrase.ts","../../../src/actions/wallet/seedPhrase/renamePhrase.ts","../../../src/actions/wallet/seedPhrase/usePhrase.ts","../../../src/actions/wallet/session/unlock.ts","../../../src/actions/wallet/sign/signPayload.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-builder@5.5.2_@bitauth+libauth@3.0.0_@scure+base@2.2.0_@xylab_4c4b2704d625c906bfa16bd14f65b27b/node_modules/@xyo-network/boundwitness-builder/src/BoundWitnessBuilder.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-builder@5.5.2_@bitauth+libauth@3.0.0_@scure+base@2.2.0_@xylab_4c4b2704d625c906bfa16bd14f65b27b/node_modules/@xyo-network/boundwitness-builder/src/GeneratedBoundWitnessFields.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-builder@5.5.2_@bitauth+libauth@3.0.0_@scure+base@2.2.0_@xylab_4c4b2704d625c906bfa16bd14f65b27b/node_modules/@xyo-network/boundwitness-builder/src/uniqueAddresses.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-builder@5.5.2_@bitauth+libauth@3.0.0_@scure+base@2.2.0_@xylab_4c4b2704d625c906bfa16bd14f65b27b/node_modules/@xyo-network/boundwitness-builder/src/uniqueAccounts.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-builder@5.5.2_@bitauth+libauth@3.0.0_@scure+base@2.2.0_@xylab_4c4b2704d625c906bfa16bd14f65b27b/node_modules/@xyo-network/boundwitness-builder/src/combinationsByBoundwitness.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-builder@5.5.2_@bitauth+libauth@3.0.0_@scure+base@2.2.0_@xylab_4c4b2704d625c906bfa16bd14f65b27b/node_modules/@xyo-network/boundwitness-builder/src/intraBoundwitnessSchemaCombinations.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-builder@5.5.2_@bitauth+libauth@3.0.0_@scure+base@2.2.0_@xylab_4c4b2704d625c906bfa16bd14f65b27b/node_modules/@xyo-network/boundwitness-builder/src/Query/QueryBoundWitnessBuilder.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-model@5.5.2_@xylabs+sdk-js@5.0.101_@opentelemetry+api@1.9.1_@_815cc9f8526e164e787cddfcee3cd298/node_modules/@xyo-network/boundwitness-model/src/BoundWitness/BoundWitness.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-model@5.5.2_@xylabs+sdk-js@5.0.101_@opentelemetry+api@1.9.1_@_815cc9f8526e164e787cddfcee3cd298/node_modules/@xyo-network/boundwitness-model/src/BoundWitness/BoundWitnessSchema.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-model@5.5.2_@xylabs+sdk-js@5.0.101_@opentelemetry+api@1.9.1_@_815cc9f8526e164e787cddfcee3cd298/node_modules/@xyo-network/boundwitness-model/src/BoundWitness/Signatures.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-model@5.5.2_@xylabs+sdk-js@5.0.101_@opentelemetry+api@1.9.1_@_815cc9f8526e164e787cddfcee3cd298/node_modules/@xyo-network/boundwitness-model/src/BoundWitness/BoundWitnessJsonSchema.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-model@5.5.2_@xylabs+sdk-js@5.0.101_@opentelemetry+api@1.9.1_@_815cc9f8526e164e787cddfcee3cd298/node_modules/@xyo-network/boundwitness-model/src/BoundWitness/HydratedBoundWitness.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-model@5.5.2_@xylabs+sdk-js@5.0.101_@opentelemetry+api@1.9.1_@_815cc9f8526e164e787cddfcee3cd298/node_modules/@xyo-network/boundwitness-model/src/BoundWitness/SignedBoundWitness.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-model@5.5.2_@xylabs+sdk-js@5.0.101_@opentelemetry+api@1.9.1_@_815cc9f8526e164e787cddfcee3cd298/node_modules/@xyo-network/boundwitness-model/src/BoundWitness/UnsignedBoundWitness.ts","../../../../../node_modules/.pnpm/@xyo-network+boundwitness-model@5.5.2_@xylabs+sdk-js@5.0.101_@opentelemetry+api@1.9.1_@_815cc9f8526e164e787cddfcee3cd298/node_modules/@xyo-network/boundwitness-model/src/QueryBoundWitness.ts","../../../src/actions/wallet/transaction/broadcastTransaction.ts","../../../src/actions/wallet/transaction/sendTransaction.ts","../../../src/actions/wallet/transaction/signTransactionFile.ts"],"sourcesContent":["import chalk from 'chalk'\n\nimport { upsertAddressBookEntry } from '../addressBook/storage.ts'\nimport { deriveAccount, getActiveWallet } from './getActiveWallet.ts'\n\nexport interface DeriveAndAddOptions {\n offset: string\n label?: string\n}\n\nexport async function deriveAndAdd(options: DeriveAndAddOptions): Promise<void> {\n const { rootWallet } = await getActiveWallet()\n const account = await deriveAccount(rootWallet, options.offset)\n upsertAddressBookEntry(rootWallet.address, { offset: options.offset, label: options.label })\n console.log(chalk.green(`Derived account at offset ${chalk.cyan(options.offset)}: 0x${account.address}`))\n if (options.label) console.log(chalk.gray(` label: ${options.label}`))\n}\n","import OS from 'node:os'\nimport PATH from 'node:path'\n\nexport interface WalletPaths {\n root: string\n password: string\n phrases: string\n active: string\n addressBooks: string\n contacts: string\n networks: string\n session: string\n machineId: string\n}\n\nexport function walletRoot(): string {\n const override = process.env.ARIES_WALLET_HOME\n if (override) return override\n return PATH.join(OS.homedir(), '.aries', 'wallet')\n}\n\nexport function walletPaths(root: string = walletRoot()): WalletPaths {\n return {\n root,\n password: PATH.join(root, 'password.json'),\n phrases: PATH.join(root, 'phrases.json'),\n active: PATH.join(root, 'active.json'),\n addressBooks: PATH.join(root, 'address-books.json'),\n contacts: PATH.join(root, 'contacts.json'),\n networks: PATH.join(root, 'networks.json'),\n session: PATH.join(root, 'session.json'),\n machineId: PATH.join(root, '.machine-id'),\n }\n}\n","import FS from 'node:fs'\nimport PATH from 'node:path'\n\nimport { walletRoot } from './paths.ts'\n\nexport function ensureWalletDir(root: string = walletRoot()): void {\n if (!FS.existsSync(root)) {\n FS.mkdirSync(root, { recursive: true, mode: 0o700 })\n return\n }\n try {\n FS.chmodSync(root, 0o700)\n } catch {\n // best-effort on platforms without chmod\n }\n}\n\nexport function readJsonFile<T>(file: string): T | undefined {\n if (!FS.existsSync(file)) return undefined\n const raw = FS.readFileSync(file, 'utf8')\n if (raw.trim().length === 0) return undefined\n return JSON.parse(raw) as T\n}\n\nexport function writeJsonFile(file: string, value: unknown): void {\n ensureWalletDir(PATH.dirname(file))\n const tmp = `${file}.tmp`\n FS.writeFileSync(tmp, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 })\n FS.renameSync(tmp, file)\n try {\n FS.chmodSync(file, 0o600)\n } catch {\n // best-effort\n }\n}\n\nexport function deleteFile(file: string): void {\n if (FS.existsSync(file)) FS.unlinkSync(file)\n}\n","import { walletPaths } from '../paths.ts'\nimport { readJsonFile, writeJsonFile } from '../storage.ts'\n\nexport interface AddressBookEntry {\n offset: string\n label?: string\n}\n\nexport interface AddressBook {\n entries: AddressBookEntry[]\n rootAddress: string\n version: number\n}\n\nexport type AddressBooksFile = Record<string, AddressBook>\n\nconst ADDRESS_BOOK_VERSION = 1\n\nexport function readAllAddressBooks(): AddressBooksFile {\n return readJsonFile<AddressBooksFile>(walletPaths().addressBooks) ?? {}\n}\n\nexport function writeAllAddressBooks(data: AddressBooksFile): void {\n writeJsonFile(walletPaths().addressBooks, data)\n}\n\nexport function readAddressBook(rootAddress: string): AddressBook {\n const all = readAllAddressBooks()\n const key = rootAddress.toLowerCase()\n return all[key] ?? {\n rootAddress: key,\n entries: [{ offset: '0' }, { offset: '1' }, { offset: '2' }],\n version: ADDRESS_BOOK_VERSION,\n }\n}\n\nexport function writeAddressBook(book: AddressBook): void {\n const all = readAllAddressBooks()\n all[book.rootAddress.toLowerCase()] = book\n writeAllAddressBooks(all)\n}\n\nexport function removeAddressBook(rootAddress: string): void {\n const all = readAllAddressBooks()\n const key = rootAddress.toLowerCase()\n if (key in all) {\n delete all[key]\n writeAllAddressBooks(all)\n }\n}\n\nexport function upsertAddressBookEntry(rootAddress: string, entry: AddressBookEntry): AddressBook {\n const book = readAddressBook(rootAddress)\n const existing = book.entries.find(e => e.offset === entry.offset)\n if (existing) {\n if (entry.label !== undefined) existing.label = entry.label\n } else {\n book.entries.push(entry)\n }\n writeAddressBook(book)\n return book\n}\n\nexport function removeAddressBookEntry(rootAddress: string, offset: string): AddressBook {\n const book = readAddressBook(rootAddress)\n book.entries = book.entries.filter(e => e.offset !== offset)\n writeAddressBook(book)\n return book\n}\n","import { HDWallet } from '@xyo-network/sdk-js'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport { DEFAULT_WALLET_PATH } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getActiveKey } from '../password/getActiveKey.ts'\nimport { decryptWithKey } from '../passwordKey.ts'\nimport { getActivePhrase } from '../seedPhrase/phraseStorage.ts'\nimport type { SeedPhraseRecord } from '../seedPhrase/types.ts'\n\nexport interface ActiveWallet {\n record: SeedPhraseRecord\n mnemonic: string\n rootWallet: WalletInstance\n}\n\nexport async function getActiveWallet(): Promise<ActiveWallet> {\n const record = getActivePhrase()\n if (!record) throw new Error('No active wallet. Run `aries wallet create` or `aries wallet import` first.')\n const key = await getActiveKey()\n const mnemonic = await decryptWithKey(key, record.encryptedPhrase)\n const rootWallet = await HDWallet.fromPhrase(mnemonic, DEFAULT_WALLET_PATH)\n return {\n record, mnemonic, rootWallet,\n }\n}\n\nexport async function deriveAccount(rootWallet: WalletInstance, offset: string): Promise<WalletInstance> {\n return await rootWallet.derivePath(offset)\n}\n","import { execFileSync } from 'node:child_process'\nimport {\n closeSync, openSync, readSync, writeSync,\n} from 'node:fs'\n\nconst CTRL_C = 0x03\nconst ENTER = 0x0d\nconst NEWLINE = 0x0a\nconst BACKSPACE_DELETE = 0x7f\nconst BACKSPACE = 0x08\n\nexport interface PromptOptions {\n prompt: string\n mask?: boolean\n}\n\nfunction readChars(readFd: number, writeFd: number, mask: boolean): string {\n const chars: number[] = []\n const buf = Buffer.alloc(1)\n for (;;) {\n const bytes = readSync(readFd, buf, 0, 1, null)\n if (bytes === 0) break\n const ch = buf[0]\n if (ch === ENTER || ch === NEWLINE) break\n if (ch === CTRL_C) {\n writeSync(writeFd, '\\n')\n throw new Error('Aborted')\n }\n if (ch === BACKSPACE_DELETE || ch === BACKSPACE) {\n if (chars.length > 0) {\n chars.pop()\n writeSync(writeFd, '\\b \\b')\n }\n continue\n }\n chars.push(ch)\n writeSync(writeFd, mask ? '*' : String.fromCodePoint(ch))\n }\n writeSync(writeFd, '\\n')\n return Buffer.from(chars).toString('utf8')\n}\n\nfunction saveStty(readFd: number): string | undefined {\n try {\n return execFileSync('stty', ['-g'], {\n stdio: [readFd, 'pipe', 'ignore'],\n encoding: 'utf8',\n }).trim()\n } catch {\n return undefined\n }\n}\n\nfunction applyStty(readFd: number, args: string[]): void {\n try {\n execFileSync('stty', args, { stdio: [readFd, 'ignore', 'ignore'] })\n } catch { /* ignore */ }\n}\n\nexport function promptTty(options: PromptOptions): string {\n const readFd = openSync('/dev/tty', 'r')\n const writeFd = openSync('/dev/tty', 'w')\n const saved = saveStty(readFd)\n try {\n if (saved) applyStty(readFd, ['-echo', '-icanon', 'min', '1', 'time', '0'])\n writeSync(writeFd, options.prompt)\n return readChars(readFd, writeFd, options.mask === true)\n } finally {\n if (saved) applyStty(readFd, [saved])\n try {\n closeSync(readFd)\n } catch { /* ignore */ }\n try {\n closeSync(writeFd)\n } catch { /* ignore */ }\n }\n}\n\nexport function promptPassword(prompt = 'Password: '): string {\n const env = process.env.ARIES_WALLET_PASSWORD\n if (env !== undefined && env.length > 0) return env\n return promptTty({ prompt, mask: true })\n}\n\nexport function promptText(prompt: string): string {\n return promptTty({ prompt, mask: false })\n}\n\nexport function confirm(prompt: string): boolean {\n const answer = promptTty({ prompt: `${prompt} [y/N] `, mask: false }).trim().toLowerCase()\n return answer === 'y' || answer === 'yes'\n}\n","import { webcrypto } from 'node:crypto'\n\nimport {\n decryptWithKey, encryptWithKey, PasswordKey,\n} from '../passwordKey.ts'\nimport { walletPaths } from '../paths.ts'\nimport {\n deleteFile, readJsonFile, writeJsonFile,\n} from '../storage.ts'\nimport { deriveMachineKey } from './machineId.ts'\n\ninterface SessionData {\n encryptedKey: string\n expiresAt: number\n}\n\nconst subtle = webcrypto.subtle\n\nexport const DEFAULT_SESSION_TTL_SECONDS = 15 * 60\n\nexport async function unlockSession(passwordKey: webcrypto.CryptoKey, ttlSeconds: number = DEFAULT_SESSION_TTL_SECONDS): Promise<number> {\n const machineKey = await deriveMachineKey()\n const exported = await subtle.exportKey('raw', passwordKey)\n const exportedBase64 = Buffer.from(new Uint8Array(exported)).toString('base64')\n const encryptedKey = await encryptWithKey(machineKey, exportedBase64)\n const expiresAt = Date.now() + ttlSeconds * 1000\n const data: SessionData = { encryptedKey, expiresAt }\n writeJsonFile(walletPaths().session, data)\n return expiresAt\n}\n\nexport function lockSession(): void {\n deleteFile(walletPaths().session)\n}\n\nexport async function readSession(): Promise<webcrypto.CryptoKey | undefined> {\n const data = readJsonFile<SessionData>(walletPaths().session)\n if (!data) return undefined\n if (data.expiresAt <= Date.now()) {\n lockSession()\n return undefined\n }\n try {\n const machineKey = await deriveMachineKey()\n const exportedBase64 = await decryptWithKey(machineKey, data.encryptedKey)\n const raw = Buffer.from(exportedBase64, 'base64')\n return await PasswordKey.importExtractableKey(\n raw.buffer.slice(raw.byteOffset, raw.byteOffset + raw.byteLength),\n )\n } catch {\n lockSession()\n return undefined\n }\n}\n\nexport function readSessionExpiry(): number | undefined {\n const data = readJsonFile<SessionData>(walletPaths().session)\n if (!data) return undefined\n if (data.expiresAt <= Date.now()) return undefined\n return data.expiresAt\n}\n","import { webcrypto } from 'node:crypto'\n\nconst subtle = webcrypto.subtle\n\nconst INITIALIZATION_VECTOR_LENGTH = 12\nconst PBKDF2_ITERATIONS = 100_000\nconst SALT_BYTES = 16\n\nexport interface PasswordValues {\n hash: string\n salt: string\n}\n\nexport class PasswordKey {\n readonly password: string\n readonly salt: string\n\n constructor(password: string, salt: string = PasswordKey.generateSalt()) {\n this.password = password\n this.salt = salt\n }\n\n static async decryptString(key: webcrypto.CryptoKey, data: string): Promise<string> {\n const encryptedData = new Uint8Array(Buffer.from(data, 'base64'))\n const iv = encryptedData.slice(0, INITIALIZATION_VECTOR_LENGTH)\n const ciphertext = encryptedData.slice(INITIALIZATION_VECTOR_LENGTH)\n const decrypted = await subtle.decrypt({ name: 'AES-GCM', iv }, key, ciphertext)\n return new TextDecoder('utf-8').decode(decrypted)\n }\n\n static async encryptString(key: webcrypto.CryptoKey, data: string): Promise<string> {\n const iv = webcrypto.getRandomValues(new Uint8Array(INITIALIZATION_VECTOR_LENGTH))\n const ciphertext = await subtle.encrypt({ name: 'AES-GCM', iv }, key, new TextEncoder().encode(data))\n const combined = new Uint8Array(iv.length + ciphertext.byteLength)\n combined.set(iv, 0)\n combined.set(new Uint8Array(ciphertext), iv.length)\n return Buffer.from(combined).toString('base64')\n }\n\n static generateSalt(): string {\n const array = new Uint8Array(SALT_BYTES)\n webcrypto.getRandomValues(array)\n return [...array].map(byte => byte.toString(16).padStart(2, '0')).join('')\n }\n\n static async getHashFromKey(key: webcrypto.CryptoKey): Promise<string> {\n const exported = await subtle.exportKey('raw', key)\n const digest = await subtle.digest('SHA-256', exported)\n return [...new Uint8Array(digest)].map(byte => byte.toString(16).padStart(2, '0')).join('')\n }\n\n static async importEncryptionKey(rawKey: ArrayBuffer): Promise<webcrypto.CryptoKey> {\n return await subtle.importKey('raw', rawKey, { name: 'AES-GCM' }, false, ['encrypt', 'decrypt'])\n }\n\n static async importExtractableKey(rawKey: ArrayBuffer): Promise<webcrypto.CryptoKey> {\n return await subtle.importKey('raw', rawKey, { name: 'AES-GCM' }, true, ['encrypt', 'decrypt'])\n }\n\n static async serializeKey(key: webcrypto.CryptoKey, salt: string = PasswordKey.generateSalt()): Promise<PasswordValues> {\n const hash = await PasswordKey.getHashFromKey(key)\n return { hash, salt }\n }\n\n async deriveKey(): Promise<webcrypto.CryptoKey> {\n const encoder = new TextEncoder()\n const passphraseKey = await subtle.importKey(\n 'raw',\n encoder.encode(this.password),\n { name: 'PBKDF2' },\n false,\n ['deriveKey'],\n )\n return await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt: encoder.encode(this.salt),\n iterations: PBKDF2_ITERATIONS,\n hash: 'SHA-256',\n },\n passphraseKey,\n { name: 'AES-GCM', length: 256 },\n true,\n ['encrypt', 'decrypt'],\n )\n }\n}\n\nexport async function encryptWithKey(key: webcrypto.CryptoKey, data: string): Promise<string> {\n const exported = await subtle.exportKey('raw', key)\n const encKey = await PasswordKey.importEncryptionKey(exported)\n return await PasswordKey.encryptString(encKey, data)\n}\n\nexport async function decryptWithKey(key: webcrypto.CryptoKey, data: string): Promise<string> {\n const exported = await subtle.exportKey('raw', key)\n const encKey = await PasswordKey.importEncryptionKey(exported)\n return await PasswordKey.decryptString(encKey, data)\n}\n","import { webcrypto } from 'node:crypto'\nimport FS from 'node:fs'\nimport OS from 'node:os'\n\nimport { PasswordKey } from '../passwordKey.ts'\nimport { walletPaths } from '../paths.ts'\nimport { ensureWalletDir } from '../storage.ts'\n\nfunction generateMachineSecret(): string {\n const bytes = new Uint8Array(32)\n webcrypto.getRandomValues(bytes)\n return [...bytes].map(b => b.toString(16).padStart(2, '0')).join('')\n}\n\nexport function loadMachineSecret(): string {\n ensureWalletDir()\n const path = walletPaths().machineId\n if (FS.existsSync(path)) {\n return FS.readFileSync(path, 'utf8').trim()\n }\n const secret = generateMachineSecret()\n FS.writeFileSync(path, `${secret}\\n`, { mode: 0o600 })\n try {\n FS.chmodSync(path, 0o600)\n } catch { /* best-effort */ }\n return secret\n}\n\nexport async function deriveMachineKey(): Promise<webcrypto.CryptoKey> {\n const secret = loadMachineSecret()\n const stable = `${OS.hostname()}:${OS.userInfo().username}:${secret}`\n const passwordKey = new PasswordKey(stable, 'aries-wallet-machine-kek-v1')\n return await passwordKey.deriveKey()\n}\n","import type { PasswordValues } from '../passwordKey.ts'\nimport { walletPaths } from '../paths.ts'\nimport { readJsonFile, writeJsonFile } from '../storage.ts'\n\nexport function readPassword(): PasswordValues | undefined {\n return readJsonFile<PasswordValues>(walletPaths().password)\n}\n\nexport function writePassword(values: PasswordValues): void {\n writeJsonFile(walletPaths().password, values)\n}\n\nexport function hasPassword(): boolean {\n return readPassword() !== undefined\n}\n","import type { webcrypto } from 'node:crypto'\n\nimport { PasswordKey } from '../passwordKey.ts'\nimport { readPassword } from './passwordStorage.ts'\n\nexport async function validatePassword(password: string): Promise<webcrypto.CryptoKey | undefined> {\n const stored = readPassword()\n if (!stored) return undefined\n const passwordKey = new PasswordKey(password, stored.salt)\n const key = await passwordKey.deriveKey()\n const hash = await PasswordKey.getHashFromKey(key)\n if (hash !== stored.hash) return undefined\n return key\n}\n","import type { webcrypto } from 'node:crypto'\n\nimport { promptPassword } from '../prompt.ts'\nimport { readSession } from '../session/sessionCache.ts'\nimport { hasPassword } from './passwordStorage.ts'\nimport { validatePassword } from './validatePassword.ts'\n\nexport async function getActiveKey(): Promise<webcrypto.CryptoKey> {\n if (!hasPassword()) {\n throw new Error('Wallet not initialized. Run `aries wallet create` or `aries wallet import` first.')\n }\n const cached = await readSession()\n if (cached) return cached\n const password = promptPassword('Wallet password: ')\n const key = await validatePassword(password)\n if (!key) throw new Error('Incorrect password.')\n return key\n}\n","import { walletPaths } from '../paths.ts'\nimport { readJsonFile, writeJsonFile } from '../storage.ts'\nimport type {\n ActiveFile, PhrasesFile, SeedPhraseRecord,\n} from './types.ts'\n\nexport function readPhrases(): SeedPhraseRecord[] {\n const data = readJsonFile<PhrasesFile>(walletPaths().phrases)\n return data?.phrases ?? []\n}\n\nexport function writePhrases(phrases: SeedPhraseRecord[]): void {\n writeJsonFile(walletPaths().phrases, { phrases })\n}\n\nexport function readActive(): ActiveFile {\n return readJsonFile<ActiveFile>(walletPaths().active) ?? {}\n}\n\nexport function writeActive(active: ActiveFile): void {\n writeJsonFile(walletPaths().active, active)\n}\n\nexport function findPhrase(id: string): SeedPhraseRecord | undefined {\n return readPhrases().find(p => p.id === id || p.label === id)\n}\n\nexport function getActivePhrase(): SeedPhraseRecord | undefined {\n const phrases = readPhrases()\n if (phrases.length === 0) return undefined\n const active = readActive()\n if (active.phraseId) {\n const found = phrases.find(p => p.id === active.phraseId)\n if (found) return found\n }\n return phrases[0]\n}\n","import chalk from 'chalk'\n\nimport { upsertAddressBookEntry } from '../addressBook/storage.ts'\nimport { getActiveWallet } from './getActiveWallet.ts'\n\nexport async function labelAccount(offset: string, label: string): Promise<void> {\n const { rootWallet } = await getActiveWallet()\n upsertAddressBookEntry(rootWallet.address, { offset, label })\n console.log(chalk.green(`Labeled account ${chalk.cyan(offset)} as ${chalk.white(label)}`))\n}\n","import chalk from 'chalk'\n\nimport { readAddressBook } from '../addressBook/storage.ts'\nimport { deriveAccount, getActiveWallet } from './getActiveWallet.ts'\n\nexport async function listAccounts(): Promise<void> {\n const { record, rootWallet } = await getActiveWallet()\n const book = readAddressBook(rootWallet.address)\n console.log(chalk.cyan(`Wallet ${record.label} (${record.id})`))\n console.log(chalk.gray(` root: ${rootWallet.address}`))\n console.log()\n if (book.entries.length === 0) {\n console.log(chalk.gray(' No derived accounts. Run `aries wallet account derive <offset>`.'))\n return\n }\n for (const entry of book.entries) {\n const account = await deriveAccount(rootWallet, entry.offset)\n const offset = chalk.cyan(entry.offset.padEnd(6))\n const label = chalk.white((entry.label ?? '').padEnd(20))\n console.log(` ${offset} ${label} 0x${account.address}`)\n }\n}\n","import chalk from 'chalk'\n\nimport { removeAddressBookEntry } from '../addressBook/storage.ts'\nimport { getActiveWallet } from './getActiveWallet.ts'\n\nexport async function removeAccount(offset: string): Promise<void> {\n const { rootWallet } = await getActiveWallet()\n removeAddressBookEntry(rootWallet.address, offset)\n console.log(chalk.green(`Removed account at offset ${chalk.cyan(offset)} from address book`))\n}\n","import chalk from 'chalk'\n\nimport { readAddressBook } from '../addressBook/storage.ts'\nimport { deriveAccount, getActiveWallet } from './getActiveWallet.ts'\n\nexport async function showAccount(offset: string): Promise<void> {\n const { rootWallet } = await getActiveWallet()\n const book = readAddressBook(rootWallet.address)\n const entry = book.entries.find(e => e.offset === offset)\n const account = await deriveAccount(rootWallet, offset)\n console.log(chalk.cyan(`Account ${offset}`))\n console.log(` ${chalk.gray('label:')} ${entry?.label ?? '—'}`)\n console.log(` ${chalk.gray('address:')} 0x${account.address}`)\n if (account.public) console.log(` ${chalk.gray('public:')} ${account.public.hex}`)\n console.log(` ${chalk.gray('path:')} ${offset}`)\n}\n","import FS from 'node:fs'\n\nimport chalk from 'chalk'\n\nimport { readAllAddressBooks } from '../addressBook/storage.ts'\nimport { readContacts } from '../contact/storage.ts'\n\nconst SCHEMA = 'network.xyo.wallet.backup'\nconst VERSION = 1\nconst ADDRESS_BOOK_SCHEMA = 'network.xyo.wallet.addressBook'\nconst CONTACTS_SCHEMA = 'network.xyo.wallet.contacts'\n\nexport interface ExportBackupOptions {\n file: string\n}\n\nexport function exportBackup(options: ExportBackupOptions): void {\n const exportedAt = new Date().toISOString()\n const entries: unknown[] = []\n const sources: string[] = []\n\n const addressBooks = readAllAddressBooks()\n for (const book of Object.values(addressBooks)) {\n entries.push({\n ...book,\n schema: ADDRESS_BOOK_SCHEMA,\n exportedAt,\n })\n if (!sources.includes(ADDRESS_BOOK_SCHEMA)) sources.push(ADDRESS_BOOK_SCHEMA)\n }\n\n const contacts = readContacts()\n if (contacts.entries.length > 0) {\n entries.push({\n ...contacts,\n schema: CONTACTS_SCHEMA,\n exportedAt,\n })\n sources.push(CONTACTS_SCHEMA)\n }\n\n const backup = {\n schema: SCHEMA,\n version: VERSION,\n entries,\n exportedAt,\n sources,\n }\n FS.writeFileSync(options.file, `${JSON.stringify(backup, null, 2)}\\n`, { mode: 0o600 })\n console.log(chalk.green(`Backup written to ${options.file}`))\n console.log(chalk.gray(` ${entries.length} entries, sources: ${sources.join(', ')}`))\n}\n","import { walletPaths } from '../paths.ts'\nimport { readJsonFile, writeJsonFile } from '../storage.ts'\n\nexport interface ContactEntry {\n address: string\n label: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface ContactsFile {\n entries: ContactEntry[]\n version: number\n}\n\nconst CONTACTS_VERSION = 1\n\nexport function readContacts(): ContactsFile {\n return readJsonFile<ContactsFile>(walletPaths().contacts) ?? {\n entries: [],\n version: CONTACTS_VERSION,\n }\n}\n\nexport function writeContacts(file: ContactsFile): void {\n writeJsonFile(walletPaths().contacts, file)\n}\n","import FS from 'node:fs'\n\nimport chalk from 'chalk'\n\nimport type { AddressBook } from '../addressBook/storage.ts'\nimport { readAllAddressBooks, writeAllAddressBooks } from '../addressBook/storage.ts'\nimport type { ContactEntry, ContactsFile } from '../contact/storage.ts'\nimport { readContacts, writeContacts } from '../contact/storage.ts'\n\ninterface BackupEntry {\n schema: string\n exportedAt?: string\n}\n\ninterface AddressBookEntryFile extends BackupEntry, AddressBook {\n schema: 'network.xyo.wallet.addressBook'\n}\n\ninterface ContactsEntryFile extends BackupEntry, ContactsFile {\n schema: 'network.xyo.wallet.contacts'\n}\n\ninterface BackupFile {\n schema: string\n version: number\n entries: BackupEntry[]\n exportedAt: string\n sources?: string[]\n}\n\nexport interface ImportBackupOptions {\n file: string\n}\n\nexport function importBackup(options: ImportBackupOptions): void {\n const raw = FS.readFileSync(options.file, 'utf8')\n const parsed = JSON.parse(raw) as BackupFile\n if (parsed.schema !== 'network.xyo.wallet.backup') {\n throw new Error(`Not a wallet backup (schema=${parsed.schema}).`)\n }\n\n const allBooks = readAllAddressBooks()\n let booksImported = 0\n let contactsImported = 0\n const existingContacts = readContacts()\n\n for (const entry of parsed.entries) {\n if (entry.schema === 'network.xyo.wallet.addressBook') {\n const book = entry as AddressBookEntryFile\n const key = book.rootAddress.toLowerCase()\n const merged: AddressBook = allBooks[key]\n ? mergeAddressBooks(allBooks[key], book)\n : {\n rootAddress: key, entries: book.entries, version: book.version,\n }\n allBooks[key] = merged\n booksImported++\n } else if (entry.schema === 'network.xyo.wallet.contacts') {\n const contacts = entry as ContactsEntryFile\n for (const contact of contacts.entries) {\n upsertContact(existingContacts, contact)\n contactsImported++\n }\n }\n }\n\n if (booksImported > 0) writeAllAddressBooks(allBooks)\n if (contactsImported > 0) writeContacts(existingContacts)\n\n console.log(chalk.green(`Imported backup from ${options.file}`))\n console.log(chalk.gray(` address books: ${booksImported}, contacts: ${contactsImported}`))\n}\n\nfunction mergeAddressBooks(existing: AddressBook, incoming: AddressBook): AddressBook {\n const merged: AddressBook = {\n rootAddress: existing.rootAddress,\n version: Math.max(existing.version, incoming.version),\n entries: [...existing.entries],\n }\n for (const entry of incoming.entries) {\n const found = merged.entries.find(e => e.offset === entry.offset)\n if (found) {\n if (entry.label !== undefined) found.label = entry.label\n } else {\n merged.entries.push(entry)\n }\n }\n return merged\n}\n\nfunction upsertContact(file: ContactsFile, contact: ContactEntry): void {\n const normalized = contact.address.toLowerCase()\n const found = file.entries.find(e => e.address.toLowerCase() === normalized)\n if (found) {\n found.label = contact.label\n found.updatedAt = contact.updatedAt\n } else {\n file.entries.push({ ...contact, address: normalized })\n }\n}\n","import { XL1Amount } from '@xyo-network/xl1-protocol-sdk'\nimport chalk from 'chalk'\n\nimport { deriveAccount, getActiveWallet } from '../account/getActiveWallet.ts'\nimport { createReadOnlyClient } from '../client/walletClient.ts'\nimport { getActiveNetwork } from '../network/storage.ts'\n\nexport interface GetBalanceOptions {\n offset?: string\n}\n\nexport async function getBalance(options: GetBalanceOptions = {}): Promise<void> {\n const offset = options.offset ?? '0'\n const { rootWallet } = await getActiveWallet()\n const account = await deriveAccount(rootWallet, offset)\n const network = getActiveNetwork()\n const { viewer } = await createReadOnlyClient(network.rpcUrl)\n const atto = await viewer.account.balance.accountBalance(account.address)\n const display = new XL1Amount(atto).toString()\n console.log(`${chalk.cyan('balance:')} ${display} XL1`)\n console.log(`${chalk.gray('atto:')} ${atto}`)\n console.log(`${chalk.gray('address:')} 0x${account.address}`)\n console.log(`${chalk.gray('network:')} ${network.id} (${network.rpcUrl})`)\n}\n","import type { AccountInstance } from '@xyo-network/sdk-js'\nimport type {\n XyoConnection, XyoGatewayRunner, XyoRunner, XyoViewer,\n} from '@xyo-network/xl1-sdk'\nimport {\n basicRemoteViewerLocator,\n ProviderFactoryLocator,\n SimpleXyoConnectionRunner,\n SimpleXyoGatewayRunner,\n SimpleXyoRunner,\n SimpleXyoSigner,\n XyoGatewayRunnerMoniker,\n XyoRunnerMoniker,\n XyoViewerMoniker,\n} from '@xyo-network/xl1-sdk'\n\ninterface BlockValidatorsRef {\n validateHydratedBlock?: unknown\n validateHydratedBlockState?: unknown\n}\n\nasync function loadValidators(): Promise<BlockValidatorsRef | undefined> {\n try {\n const mod = await import('@xyo-network/chain-validation') as BlockValidatorsRef\n return {\n validateHydratedBlock: mod.validateHydratedBlock,\n validateHydratedBlockState: mod.validateHydratedBlockState,\n }\n } catch {\n return undefined\n }\n}\n\nexport interface WalletClient {\n gateway: XyoGatewayRunner\n runner: XyoRunner\n viewer: XyoViewer\n connection: XyoConnection\n locator: unknown\n}\n\nexport interface ReadOnlyWalletClient {\n viewer: XyoViewer\n locator: unknown\n}\n\nexport async function createReadOnlyClient(rpcUrl: string): Promise<ReadOnlyWalletClient> {\n const validators = await loadValidators()\n const viewerLocator = await basicRemoteViewerLocator(\n 'aries-wallet-readonly',\n { rpc: { protocol: 'http', url: rpcUrl } },\n undefined,\n validators ? { validators: validators as never } : undefined,\n )\n const viewer = await viewerLocator.getInstance<XyoViewer>(XyoViewerMoniker)\n return { viewer, locator: viewerLocator }\n}\n\nexport async function createWalletClient(rpcUrl: string, account: AccountInstance): Promise<WalletClient> {\n const validators = await loadValidators()\n const viewerLocator = await basicRemoteViewerLocator(\n 'aries-wallet',\n { rpc: { protocol: 'http', url: rpcUrl } },\n undefined,\n validators ? { validators: validators as never } : undefined,\n )\n const locator = new ProviderFactoryLocator(viewerLocator.context, {})\n locator.register(SimpleXyoSigner.factory<SimpleXyoSigner>(SimpleXyoSigner.dependencies, { account }))\n locator.register(SimpleXyoGatewayRunner.factory<SimpleXyoGatewayRunner>(SimpleXyoGatewayRunner.dependencies, {}))\n locator.register(SimpleXyoRunner.factory<SimpleXyoRunner>(SimpleXyoRunner.dependencies, {}))\n locator.register(SimpleXyoConnectionRunner.factory<SimpleXyoConnectionRunner>(SimpleXyoConnectionRunner.dependencies, {}))\n locator.validateDependencies()\n const gateway = await locator.getInstance<XyoGatewayRunner>(XyoGatewayRunnerMoniker)\n const runner = await locator.getInstance<XyoRunner>(XyoRunnerMoniker)\n const viewer = await locator.getInstance<XyoViewer>(XyoViewerMoniker)\n return {\n gateway,\n runner,\n viewer,\n connection: gateway.connection,\n locator,\n }\n}\n","import { walletPaths } from '../paths.ts'\nimport { readJsonFile, writeJsonFile } from '../storage.ts'\n\nexport interface NetworkRecord {\n id: string\n label: string\n rpcUrl: string\n chainId?: string\n isCustom: boolean\n}\n\nexport interface NetworksFile {\n networks: NetworkRecord[]\n activeId: string\n}\n\nconst DEFAULT_NETWORKS: NetworkRecord[] = [\n {\n id: 'xl1-mainnet',\n label: 'XL1 Mainnet',\n rpcUrl: 'https://node.xyo.network',\n isCustom: false,\n },\n {\n id: 'xl1-testnet',\n label: 'XL1 Testnet',\n rpcUrl: 'https://testnet.node.xyo.network',\n isCustom: false,\n },\n]\n\nexport function readNetworks(): NetworksFile {\n const data = readJsonFile<NetworksFile>(walletPaths().networks)\n if (data) return data\n const seeded: NetworksFile = {\n networks: DEFAULT_NETWORKS,\n activeId: DEFAULT_NETWORKS[0].id,\n }\n writeJsonFile(walletPaths().networks, seeded)\n return seeded\n}\n\nexport function writeNetworks(file: NetworksFile): void {\n writeJsonFile(walletPaths().networks, file)\n}\n\nexport function getActiveNetwork(): NetworkRecord {\n const file = readNetworks()\n const found = file.networks.find(n => n.id === file.activeId)\n if (!found) throw new Error(`Active network ${file.activeId} not found.`)\n return found\n}\n","import chalk from 'chalk'\n\nimport { readContacts, writeContacts } from './storage.ts'\n\nfunction normalize(address: string): string {\n return address.toLowerCase()\n}\n\nexport function listContacts(): void {\n const file = readContacts()\n if (file.entries.length === 0) {\n console.log(chalk.gray('No contacts. Run `aries wallet contact add <address> <label>` to add one.'))\n return\n }\n for (const entry of file.entries) {\n console.log(` ${chalk.white(entry.label.padEnd(20))} ${entry.address}`)\n }\n}\n\nexport function addContact(address: string, label: string): void {\n const file = readContacts()\n const now = new Date().toISOString()\n const normalized = normalize(address)\n const existing = file.entries.find(e => normalize(e.address) === normalized)\n if (existing) {\n existing.label = label\n existing.updatedAt = now\n } else {\n file.entries.push({\n address: normalized, label, createdAt: now, updatedAt: now,\n })\n }\n writeContacts(file)\n console.log(chalk.green(`Saved contact ${chalk.cyan(label)} (${normalized})`))\n}\n\nexport function renameContact(address: string, label: string): void {\n addContact(address, label)\n}\n\nexport function removeContact(address: string): void {\n const file = readContacts()\n const normalized = normalize(address)\n const before = file.entries.length\n file.entries = file.entries.filter(e => normalize(e.address) !== normalized)\n if (file.entries.length === before) throw new Error(`Contact not found: ${address}`)\n writeContacts(file)\n console.log(chalk.green(`Removed contact ${normalized}`))\n}\n","import chalk from 'chalk'\n\nimport type { NetworkRecord } from './storage.ts'\nimport { readNetworks, writeNetworks } from './storage.ts'\n\nexport function listNetworks(): void {\n const file = readNetworks()\n for (const network of file.networks) {\n const marker = network.id === file.activeId ? chalk.green('* ') : ' '\n const id = chalk.cyan(network.id.padEnd(20))\n const label = chalk.white(network.label.padEnd(20))\n const custom = network.isCustom ? chalk.gray('(custom)') : ''\n console.log(`${marker}${id} ${label} ${network.rpcUrl} ${custom}`)\n }\n}\n\nexport function useNetwork(id: string): void {\n const file = readNetworks()\n const found = file.networks.find(n => n.id === id)\n if (!found) throw new Error(`Network not found: ${id}`)\n file.activeId = id\n writeNetworks(file)\n console.log(chalk.green(`Active network set to ${chalk.cyan(id)}`))\n}\n\nexport interface AddNetworkOptions {\n id: string\n rpcUrl: string\n label?: string\n chainId?: string\n}\n\nexport function addNetwork(options: AddNetworkOptions): void {\n const file = readNetworks()\n if (file.networks.some(n => n.id === options.id)) {\n throw new Error(`Network already exists: ${options.id}`)\n }\n const record: NetworkRecord = {\n id: options.id,\n label: options.label ?? options.id,\n rpcUrl: options.rpcUrl,\n chainId: options.chainId,\n isCustom: true,\n }\n file.networks.push(record)\n writeNetworks(file)\n console.log(chalk.green(`Added network ${chalk.cyan(options.id)} (${options.rpcUrl})`))\n}\n\nexport function removeNetwork(id: string): void {\n const file = readNetworks()\n const target = file.networks.find(n => n.id === id)\n if (!target) throw new Error(`Network not found: ${id}`)\n if (!target.isCustom) throw new Error(`Cannot remove built-in network: ${id}`)\n file.networks = file.networks.filter(n => n.id !== id)\n if (file.activeId === id) file.activeId = file.networks[0]?.id ?? ''\n writeNetworks(file)\n console.log(chalk.green(`Removed network ${chalk.cyan(id)}`))\n}\n","import chalk from 'chalk'\n\nimport {\n decryptWithKey, encryptWithKey, PasswordKey,\n} from '../passwordKey.ts'\nimport { promptPassword } from '../prompt.ts'\nimport { readPhrases, writePhrases } from '../seedPhrase/phraseStorage.ts'\nimport { lockSession } from '../session/sessionCache.ts'\nimport { writePassword } from './passwordStorage.ts'\nimport { validatePassword } from './validatePassword.ts'\n\nexport async function changePassword(): Promise<void> {\n const current = promptPassword('Current password: ')\n const oldKey = await validatePassword(current)\n if (!oldKey) throw new Error('Incorrect password.')\n\n const next = promptPassword('New password: ')\n const confirmed = promptPassword('Confirm new password: ')\n if (next !== confirmed) throw new Error('Passwords do not match.')\n if (next.length === 0) throw new Error('Password cannot be empty.')\n\n const salt = PasswordKey.generateSalt()\n const newKey = await new PasswordKey(next, salt).deriveKey()\n\n const phrases = readPhrases()\n for (const phrase of phrases) {\n const mnemonic = await decryptWithKey(oldKey, phrase.encryptedPhrase)\n phrase.encryptedPhrase = await encryptWithKey(newKey, mnemonic)\n }\n writePhrases(phrases)\n writePassword(await PasswordKey.serializeKey(newKey, salt))\n lockSession()\n console.log(chalk.green('Password changed. Re-unlock to start a new session.'))\n}\n","import { HDWallet } from '@xyo-network/sdk-js'\nimport chalk from 'chalk'\n\nimport { initOrUnlock } from '../password/initOrUnlock.ts'\nimport { encryptWithKey } from '../passwordKey.ts'\nimport { generatePhraseId } from './idGen.ts'\nimport {\n readPhrases, writeActive, writePhrases,\n} from './phraseStorage.ts'\nimport type { SeedPhraseRecord } from './types.ts'\n\nexport interface CreatePhraseOptions {\n label: string\n}\n\nexport async function createPhrase(options: CreatePhraseOptions): Promise<SeedPhraseRecord> {\n const key = await initOrUnlock()\n const mnemonic = HDWallet.generateMnemonic()\n const encryptedPhrase = await encryptWithKey(key, mnemonic)\n const record: SeedPhraseRecord = {\n id: generatePhraseId(),\n label: options.label,\n walletKind: 'user',\n encryptedPhrase,\n createdAt: Date.now(),\n }\n const phrases = readPhrases()\n phrases.push(record)\n writePhrases(phrases)\n if (phrases.length === 1) writeActive({ phraseId: record.id })\n console.log(chalk.green(`Created wallet ${chalk.cyan(record.label)} (id ${record.id})`))\n console.log()\n console.log(chalk.yellow('Recovery phrase — write this down and store it safely:'))\n console.log()\n console.log(` ${chalk.white(mnemonic)}`)\n console.log()\n console.log(chalk.gray('You will not be shown this phrase again unless you run `aries wallet export`.'))\n return record\n}\n","import type { webcrypto } from 'node:crypto'\n\nimport { PasswordKey } from '../passwordKey.ts'\nimport { writePassword } from './passwordStorage.ts'\n\nexport interface SetPasswordResult {\n key: webcrypto.CryptoKey\n salt: string\n}\n\nexport async function setPassword(password: string): Promise<SetPasswordResult> {\n if (password.length === 0) throw new Error('Password cannot be empty')\n const salt = PasswordKey.generateSalt()\n const passwordKey = new PasswordKey(password, salt)\n const key = await passwordKey.deriveKey()\n const values = await PasswordKey.serializeKey(key, salt)\n writePassword(values)\n return { key, salt }\n}\n","import type { webcrypto } from 'node:crypto'\n\nimport { promptPassword } from '../prompt.ts'\nimport { getActiveKey } from './getActiveKey.ts'\nimport { hasPassword } from './passwordStorage.ts'\nimport { setPassword } from './setPassword.ts'\n\nexport async function initOrUnlock(): Promise<webcrypto.CryptoKey> {\n if (hasPassword()) return await getActiveKey()\n const fromEnv = process.env.ARIES_WALLET_PASSWORD\n if (fromEnv !== undefined && fromEnv.length > 0) {\n const { key } = await setPassword(fromEnv)\n return key\n }\n const password = promptPassword('Set wallet password: ')\n const confirmed = promptPassword('Confirm password: ')\n if (password !== confirmed) throw new Error('Passwords do not match.')\n const { key } = await setPassword(password)\n return key\n}\n","import { webcrypto } from 'node:crypto'\n\nexport function generatePhraseId(): string {\n const bytes = new Uint8Array(8)\n webcrypto.getRandomValues(bytes)\n return [...bytes].map(b => b.toString(16).padStart(2, '0')).join('')\n}\n","import chalk from 'chalk'\n\nimport { getActiveKey } from '../password/getActiveKey.ts'\nimport { decryptWithKey } from '../passwordKey.ts'\nimport { findPhrase, getActivePhrase } from './phraseStorage.ts'\n\nexport interface ExportPhraseOptions {\n id?: string\n}\n\nexport async function exportPhrase(options: ExportPhraseOptions = {}): Promise<string> {\n const record = options.id ? findPhrase(options.id) : getActivePhrase()\n if (!record) throw new Error('Wallet not found.')\n const key = await getActiveKey()\n const mnemonic = await decryptWithKey(key, record.encryptedPhrase)\n console.log(chalk.yellow(`Recovery phrase for ${chalk.cyan(record.label)} (id ${record.id}):`))\n console.log()\n console.log(` ${chalk.white(mnemonic)}`)\n return mnemonic\n}\n","import { HDWallet } from '@xyo-network/sdk-js'\nimport chalk from 'chalk'\n\nimport { initOrUnlock } from '../password/initOrUnlock.ts'\nimport { encryptWithKey } from '../passwordKey.ts'\nimport { promptText } from '../prompt.ts'\nimport { generatePhraseId } from './idGen.ts'\nimport {\n readPhrases, writeActive, writePhrases,\n} from './phraseStorage.ts'\nimport type { SeedPhraseRecord } from './types.ts'\n\nexport interface ImportPhraseOptions {\n label: string\n phrase?: string\n}\n\nexport async function importPhrase(options: ImportPhraseOptions): Promise<SeedPhraseRecord> {\n const key = await initOrUnlock()\n const mnemonic = (options.phrase ?? promptText('Recovery phrase: ')).trim()\n if (mnemonic.split(/\\s+/).length < 12) {\n throw new Error('Recovery phrase must be at least 12 words.')\n }\n await HDWallet.fromPhrase(mnemonic)\n const encryptedPhrase = await encryptWithKey(key, mnemonic)\n const record: SeedPhraseRecord = {\n id: generatePhraseId(),\n label: options.label,\n walletKind: 'user',\n encryptedPhrase,\n createdAt: Date.now(),\n }\n const phrases = readPhrases()\n phrases.push(record)\n writePhrases(phrases)\n if (phrases.length === 1) writeActive({ phraseId: record.id })\n console.log(chalk.green(`Imported wallet ${chalk.cyan(record.label)} (id ${record.id})`))\n return record\n}\n","import chalk from 'chalk'\n\nimport { readActive, readPhrases } from './phraseStorage.ts'\n\nexport function listPhrases(): void {\n const phrases = readPhrases()\n if (phrases.length === 0) {\n console.log(chalk.gray('No wallets. Run `aries wallet create` or `aries wallet import` to add one.'))\n return\n }\n const active = readActive()\n for (const phrase of phrases) {\n const marker = phrase.id === active.phraseId ? chalk.green('* ') : ' '\n const created = new Date(phrase.createdAt).toISOString()\n console.log(`${marker}${chalk.cyan(phrase.label.padEnd(20))} ${chalk.gray(phrase.id)} ${chalk.gray(created)}`)\n }\n}\n","import { HDWallet } from '@xyo-network/sdk-js'\nimport { DEFAULT_WALLET_PATH } from '@xyo-network/xl1-protocol-sdk'\nimport chalk from 'chalk'\n\nimport { removeAddressBook } from '../addressBook/storage.ts'\nimport { getActiveKey } from '../password/getActiveKey.ts'\nimport { decryptWithKey } from '../passwordKey.ts'\nimport {\n readActive, readPhrases, writeActive, writePhrases,\n} from './phraseStorage.ts'\n\nexport interface RemovePhraseOptions {\n id: string\n}\n\nexport async function removePhrase(options: RemovePhraseOptions): Promise<void> {\n const phrases = readPhrases()\n const target = phrases.find(p => p.id === options.id || p.label === options.id)\n if (!target) throw new Error(`Wallet not found: ${options.id}`)\n try {\n const key = await getActiveKey()\n const mnemonic = await decryptWithKey(key, target.encryptedPhrase)\n const root = await HDWallet.fromPhrase(mnemonic, DEFAULT_WALLET_PATH)\n removeAddressBook(root.address)\n } catch (e) {\n console.warn(chalk.yellow(`Warning: failed to clean up address book: ${(e as Error).message}`))\n }\n const remaining = phrases.filter(p => p.id !== target.id)\n writePhrases(remaining)\n const active = readActive()\n if (active.phraseId === target.id) {\n writeActive({ ...active, phraseId: remaining[0]?.id })\n }\n console.log(chalk.green(`Removed wallet ${chalk.cyan(target.label)} (id ${target.id})`))\n}\n","import chalk from 'chalk'\n\nimport { readPhrases, writePhrases } from './phraseStorage.ts'\n\nexport function renamePhrase(id: string, label: string): void {\n const phrases = readPhrases()\n const target = phrases.find(p => p.id === id || p.label === id)\n if (!target) throw new Error(`Wallet not found: ${id}`)\n target.label = label\n writePhrases(phrases)\n console.log(chalk.green(`Renamed wallet ${target.id} to ${chalk.cyan(label)}`))\n}\n","import chalk from 'chalk'\n\nimport {\n findPhrase, readActive, writeActive,\n} from './phraseStorage.ts'\n\nexport function usePhrase(id: string): void {\n const record = findPhrase(id)\n if (!record) throw new Error(`Wallet not found: ${id}`)\n const active = readActive()\n writeActive({ ...active, phraseId: record.id })\n console.log(chalk.green(`Active wallet set to ${chalk.cyan(record.label)} (id ${record.id})`))\n}\n","import chalk from 'chalk'\n\nimport { hasPassword } from '../password/passwordStorage.ts'\nimport { validatePassword } from '../password/validatePassword.ts'\nimport { promptPassword } from '../prompt.ts'\nimport {\n DEFAULT_SESSION_TTL_SECONDS, lockSession, unlockSession,\n} from './sessionCache.ts'\n\nexport interface UnlockOptions {\n ttl?: number\n}\n\nexport async function unlock(options: UnlockOptions = {}): Promise<void> {\n if (!hasPassword()) {\n throw new Error('Wallet not initialized. Run `aries wallet create` or `aries wallet import` first.')\n }\n const password = promptPassword('Wallet password: ')\n const key = await validatePassword(password)\n if (!key) throw new Error('Incorrect password.')\n const ttl = options.ttl ?? DEFAULT_SESSION_TTL_SECONDS\n const expiresAt = await unlockSession(key, ttl)\n console.log(chalk.green(`Wallet unlocked. Session expires ${new Date(expiresAt).toISOString()}.`))\n}\n\nexport function lock(): void {\n lockSession()\n console.log(chalk.green('Wallet locked.'))\n}\n","import FS from 'node:fs'\n\nimport { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'\nimport type { Payload } from '@xyo-network/payload-model'\nimport chalk from 'chalk'\n\nimport { deriveAccount, getActiveWallet } from '../account/getActiveWallet.ts'\n\nexport interface SignPayloadOptions {\n file: string\n offset?: string\n output?: string\n}\n\nexport async function signPayload(options: SignPayloadOptions): Promise<void> {\n const offset = options.offset ?? '0'\n const raw = FS.readFileSync(options.file, 'utf8')\n const payload = JSON.parse(raw) as Payload\n if (typeof payload.schema !== 'string' || payload.schema.length === 0) {\n throw new Error('Payload must have a non-empty `schema` string field.')\n }\n const { rootWallet } = await getActiveWallet()\n const account = await deriveAccount(rootWallet, offset)\n const [boundwitness, payloads] = await new BoundWitnessBuilder().payload(payload).signer(account).build()\n const result = { boundwitness, payloads }\n const json = JSON.stringify(result, null, 2)\n if (options.output) {\n FS.writeFileSync(options.output, `${json}\\n`)\n console.log(chalk.green(`Signed payload written to ${options.output}`))\n } else {\n console.log(json)\n }\n}\n","import type {\n Address, Hash, Hex,\n} from '@xylabs/sdk-js'\nimport {\n asAddress, asHash, assertEx,\n hexFromArrayBuffer, toArrayBuffer,\n} from '@xylabs/sdk-js'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport type {\n BoundWitness,\n PossiblySigned,\n Signed,\n Unsigned,\n} from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport {\n ObjectHasher, removeEmptyFields, sortFields,\n} from '@xyo-network/hash'\nimport type { PayloadBuilderOptions } from '@xyo-network/payload-builder'\nimport { omitSchema, PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n ModuleError, Payload, Schema,\n WithoutClientMeta,\n WithoutMeta,\n WithoutSchema,\n WithoutStorageMeta,\n} from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nimport { GeneratedBoundWitnessFields } from './GeneratedBoundWitnessFields.ts'\nimport { uniqueAccounts } from './uniqueAccounts.ts'\n\nexport class BoundWitnessBuilder<\n TBoundWitness extends BoundWitness = BoundWitness,\n TPayload extends Payload = Payload>\n extends PayloadBuilder<\n TBoundWitness,\n Promise<[PossiblySigned<TBoundWitness>, TPayload[], ModuleError[]]>\n > {\n private static readonly _buildMutex = new Mutex()\n\n private _accounts: AccountInstance[] = []\n private _errorHashes?: Hash[]\n private _errors: ModuleError[] = []\n private _payloadHashes?: Hash[]\n private _payloadSchemas?: Schema[]\n private _payloads: TPayload[] = []\n\n constructor(options?: Omit<PayloadBuilderOptions, 'schema'>) {\n super({ ...options, schema: BoundWitnessSchema })\n }\n\n protected get addresses(): Address[] {\n uniqueAccounts(this._accounts, true)\n return this._accounts.map(account => account.address.toLowerCase()) as Address[]\n }\n\n protected get payloadSchemas(): string[] {\n return (\n this._payloadSchemas\n ?? this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n protected get previousHashBytes(): (ArrayBufferLike | null)[] {\n return this._accounts.map(account => account.previousHashBytes ?? null)\n }\n\n protected get previousHashes(): (Hash | null)[] {\n return this._accounts.map(account => account.previousHash ?? null)\n }\n\n static addressIndex<T extends BoundWitness>(payload: T, address: Address) {\n const index = payload.addresses.indexOf(address)\n if (index === -1) {\n throw new Error('Invalid address')\n }\n return index\n }\n\n static previousHash<T extends BoundWitness>(boundWitness: T, address: Address) {\n return asHash(boundWitness.previous_hashes[this.addressIndex(boundWitness, address)])?.toLowerCase()\n }\n\n protected static async linkingFields<T extends BoundWitness>(\n accounts: AccountInstance[],\n payloads?: Payload[],\n ): Promise<Pick<T, GeneratedBoundWitnessFields>> {\n const addresses = accounts.map(account => asAddress(hexFromArrayBuffer(account.addressBytes, { prefix: false }), true))\n const previous_hashes = accounts.map(account => account.previousHash ?? null)\n const payload_hashes = payloads ? await BoundWitnessBuilder.hashes(payloads) : []\n const payload_schemas = payloads?.map(({ schema }) => schema) ?? []\n return {\n addresses, payload_hashes, payload_schemas, previous_hashes,\n }\n }\n\n protected static signature<T extends BoundWitness>(payload: T, address: Address) {\n return payload.$signatures[this.addressIndex(payload, address)]\n }\n\n protected static async signatures(accounts: AccountInstance[], dataHash: Hash): Promise<string[]> {\n const hashBytes = toArrayBuffer(dataHash)\n const previousHashesBytes = accounts?.map(account => account.previousHashBytes)\n return await Promise.all(accounts.map(async (account, index) => hexFromArrayBuffer((await account.sign(hashBytes, previousHashesBytes[index]))[0])))\n }\n\n private static validateGeneratedFields(fields: Pick<BoundWitness, GeneratedBoundWitnessFields>) {\n assertEx(fields.payload_hashes?.length === fields.payload_schemas?.length, () => 'Payload hash/schema mismatch')\n assertEx(!(fields.payload_hashes as (Hash | null)[]).includes(null), () => 'nulls found in hashes')\n assertEx(!(fields.payload_schemas as (Schema | null)[]).includes(null), () => 'nulls found in schemas')\n }\n\n override async build(): Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]>\n override async build(sign: false): Promise<[Unsigned<TBoundWitness>, TPayload[], ModuleError[]]>\n override async build(sign: true): Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]>\n override async build(sign = true): Promise<[PossiblySigned<TBoundWitness>, TPayload[], ModuleError[]]> {\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const dataHashableFields = await this.dataHashableFields()\n const $signatures = sign ? await this.sign() : this.addresses.map(() => null)\n\n const ret = {\n ...this._meta, ...dataHashableFields, ...this._fields, $signatures,\n } as Signed<TBoundWitness>\n return [\n ret,\n this._payloads,\n this._errors,\n ]\n })\n }\n\n async dataHash() {\n const dataHashableFields = await this.dataHashableFields()\n const hash = await ObjectHasher.hash(dataHashableFields)\n return hash\n }\n\n override async dataHashableFields(): Promise<WithoutMeta<TBoundWitness>> {\n const generatedFields: Pick<TBoundWitness, GeneratedBoundWitnessFields> = await this.generatedFields()\n BoundWitnessBuilder.validateGeneratedFields(generatedFields)\n const fields: WithoutSchema<TBoundWitness> = {\n ...PayloadBuilder.omitMeta(this._fields ?? {}),\n ...generatedFields,\n } as WithoutSchema<TBoundWitness>\n return await BoundWitnessBuilder.dataHashableFields<TBoundWitness>(this._schema, fields)\n }\n\n error(payload?: ModuleError) {\n assertEx(this._errorHashes === undefined, () => 'Can not set errors when hashes already set')\n if (payload) {\n this._errors.push(assertEx(sortFields(payload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n if (errors) {\n for (const error of errors) {\n if (error !== null) {\n this.error(error)\n }\n }\n }\n return this\n }\n\n override fields(fields: WithoutSchema<Omit<WithoutStorageMeta<WithoutClientMeta<TBoundWitness>>,\n 'addresses' | 'payload_hashes' | 'payload_schemas' | 'previous_hashes'>>): this {\n // clean it up just incase\n const clone = structuredClone(fields) as unknown as Partial<TBoundWitness>\n for (const field of GeneratedBoundWitnessFields) {\n delete clone[field]\n }\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields\n = BoundWitnessBuilder.omitStorageMeta(\n BoundWitnessBuilder.omitClientMeta(\n omitSchema(removeEmptyFields(clone)),\n ),\n ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<TBoundWitness>>>\n return this\n }\n\n hashes(hashes: Hash[], schema: Schema[]) {\n assertEx(this.payloads.length === 0, () => 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n assertEx(this._payloadHashes === undefined, () => 'Can not set payloads when hashes already set')\n if (payload) {\n this._payloads.push(assertEx(sortFields<TPayload>(payload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n if (payloads)\n for (const payload of payloads) {\n if (payload !== null) {\n this.payload(payload)\n }\n }\n return this\n }\n\n signer(account: AccountInstance) {\n uniqueAccounts([...this._accounts, account], true)\n this._accounts?.push(account)\n return this\n }\n\n signers(accounts: AccountInstance[]) {\n uniqueAccounts([...this._accounts, ...accounts], true)\n this._accounts?.push(...accounts)\n return this\n }\n\n sourceQuery(sourceQuery: Hash) {\n this._meta = {\n ...this._meta,\n $sourceQuery: sourceQuery,\n } as typeof this._meta\n return this\n }\n\n /** @deprecated use signer instead */\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n /** @deprecated use signers instead */\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async sign(): Promise<Hex[]> {\n uniqueAccounts(this._accounts, true)\n const hashBytes = toArrayBuffer(await this.dataHash())\n return await Promise.all(this._accounts.map(async account => hexFromArrayBuffer((await account.sign(hashBytes))[0])))\n }\n\n private async generatedFields(): Promise<Pick<TBoundWitness, GeneratedBoundWitnessFields>> {\n return await BoundWitnessBuilder.linkingFields(this._accounts, this._payloads)\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","export const GeneratedBoundWitnessFields = ['addresses', 'payload_hashes', 'payload_schemas', 'previous_hashes'] as const\nexport type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number]\n","import type { Address } from '@xylabs/sdk-js'\n\nexport const uniqueAddresses = (addresses: Address[], throwOnFalse = false) => {\n const addressesSet = new Set<Address>()\n for (const address of addresses) {\n if (addressesSet.has(address)) {\n if (throwOnFalse) {\n throw new Error('Duplicate address')\n }\n return false\n }\n addressesSet.add(address)\n }\n return true\n}\n","import type { AccountInstance } from '@xyo-network/account-model'\n\nimport { uniqueAddresses } from './uniqueAddresses.ts'\n\nexport const uniqueAccounts = (accounts: AccountInstance[], throwOnFalse = false) => {\n return uniqueAddresses(accounts.map(account => account.address), throwOnFalse)\n}\n","import {\n asHash, difference, exists,\n} from '@xylabs/sdk-js'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload } from '@xyo-network/payload-model'\n\n/**\n * Returns tuples of bound witnesses and their payloads from the supplied payloads. Omits\n * bound witnesses where the payloads were not included in the supplied payloads.\n * @param payloads An array of bound witnesses and payloads\n * @returns An array of tuples of bound witnesses and their payloads\n */\nexport const combinationsByBoundwitness = async (payloads: Payload[]): Promise<[BoundWitness, ...Payload[]][]> => {\n const bws = new Set<BoundWitness>(payloads.filter(x => isBoundWitness(x)))\n const remaining = difference(new Set(payloads), bws)\n const payloadDictionary = await PayloadBuilder.toHashMap([...remaining])\n const results = [] as [BoundWitness, ...Payload[]][]\n for (const bw of bws) {\n const { payload_hashes } = bw\n const p = payload_hashes.map(h => payloadDictionary[asHash(h, true)]).filter(exists)\n if (p.length === payload_hashes.length) {\n const complete = [bw, ...p] as [BoundWitness, ...Payload[]]\n results.push(complete)\n }\n }\n return results\n}\n","import { asHash, type Hash } from '@xylabs/sdk-js'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport type { Schema } from '@xyo-network/payload-model'\n\n/**\n * Returns all the possible combinations of payloads for the supplied schemas within the bound witness\n * @param boundwitness The bound witness to search\n * @param schemas The schemas to search for unique combinations of\n * @returns The payload hashes corresponding to the unique combinations of the supplied schemas\n */\nexport const intraBoundwitnessSchemaCombinations = (boundwitness: BoundWitness, schemas: Schema[]): Hash[][] => {\n // Map to store the indices of each element in the source array\n const indexMap: Record<string, number[]> = {}\n\n // Populate the index map with positions of each element\n for (const [index, element] of boundwitness.payload_schemas.entries()) {\n if (!indexMap[element]) {\n indexMap[element] = []\n }\n indexMap[element].push(index)\n }\n\n // Initialize an array to store unique combinations\n let uniqueCombinations = [[]] as number[][]\n\n // Iterate over each element in the target array\n for (const element of schemas) {\n const newCombinations: number[][] = []\n // Get the array of indices for the current element\n const indices = indexMap[element] || []\n\n // Iterate over existing combinations\n for (const combination of uniqueCombinations) {\n // Iterate over each index in the indices array\n for (const index of indices) {\n // Check if the index is already in the combination\n if (!combination.includes(index)) {\n const newCombination = [...combination, index]\n // Only add the new combination if its length matches the current target index\n if (newCombination.length === schemas.indexOf(element) + 1) {\n newCombinations.push(newCombination)\n }\n }\n }\n }\n\n // Update the unique combinations for the next iteration\n uniqueCombinations = newCombinations\n }\n\n return uniqueCombinations.map((indexes) => {\n return indexes.map((index) => {\n return asHash(boundwitness.payload_hashes[index], true)\n })\n })\n}\n","import { assertEx } from '@xylabs/sdk-js'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport type { Query, WithoutMeta } from '@xyo-network/payload-model'\n\nimport { BoundWitnessBuilder } from '../BoundWitnessBuilder.ts'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: TQuery | undefined\n\n override async dataHashableFields(): Promise<WithoutMeta<TBoundWitness>> {\n const fields = {\n ...(await super.dataHashableFields()),\n query: await PayloadBuilder.dataHash(assertEx(this._query, () => 'No Query Specified')),\n } as TBoundWitness\n return { ...fields } as WithoutMeta<TBoundWitness>\n }\n\n query<T extends TQuery>(query: T) {\n this.payload(query)\n this._query = query\n return this\n }\n}\n","import {\n AddressZod, HashZod,\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@xylabs/sdk-js'\nimport { PayloadZod, SchemaZod } from '@xyo-network/payload-model'\nimport z from 'zod'\n\nimport { BoundWitnessSchema } from './BoundWitnessSchema.ts'\nimport type { SignedSignaturesMeta, UnsignedSignaturesMeta } from './Signatures.ts'\nimport { SignaturesMetaZod } from './Signatures.ts'\n\nexport const BoundWitnessRequiredFieldsZod = z.object({\n addresses: z.array(AddressZod),\n payload_hashes: z.array(HashZod),\n payload_schemas: z.array(SchemaZod),\n previous_hashes: z.array(HashZod.nullable()),\n})\n\nexport type BoundWitnessRequiredFields = z.infer<typeof BoundWitnessRequiredFieldsZod>\n\nexport const BoundWitnessMetaZod = z.object({\n $destination: AddressZod.optional(),\n $sourceQuery: HashZod.optional(),\n}).extend(SignaturesMetaZod.shape)\n\nexport type BoundWitnessMeta = z.infer<typeof BoundWitnessMetaZod>\n\nexport const BoundWitnessZod = PayloadZod\n .safeExtend({ schema: z.literal(BoundWitnessSchema) })\n .safeExtend(BoundWitnessRequiredFieldsZod.shape)\n .safeExtend(BoundWitnessMetaZod.shape)\n // .refine(data => data.$signatures.length === data.addresses.length, { message: '$signatures length must equal addresses length' })\n\nexport type BoundWitness = z.infer<typeof BoundWitnessZod>\n\nexport const isBoundWitness = zodIsFactory(BoundWitnessZod)\nexport const asBoundWitness = zodAsFactory(BoundWitnessZod, 'asBoundWitness')\nexport const toBoundWitness = zodToFactory(BoundWitnessZod, 'toBoundWitness')\n\nexport const AnyBoundWitnessZod = BoundWitnessZod.loose()\nexport type AnyBoundWitness = z.infer<typeof AnyBoundWitnessZod>\n\nexport type Unsigned<T extends BoundWitness> = Omit<T, '$signatures'> & UnsignedSignaturesMeta\n\nexport type Signed<T extends BoundWitness> = Omit<T, '$signatures'> & SignedSignaturesMeta\n\nexport type PossiblySigned<T extends BoundWitness> = Unsigned<T> | Signed<T>\n","import { asSchema } from '@xyo-network/payload-model'\n\nexport const BoundWitnessSchema = asSchema('network.xyo.boundwitness', true)\nexport type BoundWitnessSchema = typeof BoundWitnessSchema\n","import { HexZod } from '@xylabs/sdk-js'\nimport z from 'zod'\n\nexport const SignaturesMetaZod = z.object({ $signatures: z.array(z.union([HexZod, z.null()])) })\nexport const UnsignedSignaturesMetaZod = z.object({ $signatures: z.array(z.null()) })\nexport const SignedSignaturesMetaZod = z.object({ $signatures: z.array(HexZod).min(1) })\n\nexport type SignaturesMeta = z.infer<typeof SignaturesMetaZod>\nexport type UnsignedSignaturesMeta = z.infer<typeof UnsignedSignaturesMetaZod>\nexport type SignedSignaturesMeta = z.infer<typeof SignedSignaturesMetaZod>\n","// Should type as JSONSchemaType<BoundWitness> once ajv/eslint issue is fixed\n// https://github.com/microsoft/TypeScript/issues/44851\n\nexport const BoundWitnessJsonSchema = () => {\n return {\n $id: 'https://schemas.xyo.network/2.0/boundwitness',\n additionalProperties: false,\n properties: {\n addresses: { items: { type: 'string' }, type: 'array' },\n payload_hashes: { items: { type: 'string' }, type: 'array' },\n payload_schemas: { items: { type: 'string' }, type: 'array' },\n previous_hashes: { items: { nullable: true, type: 'string' }, type: 'array' },\n schema: { type: 'string' },\n },\n required: ['addresses', 'payload_hashes', 'payload_schemas', 'previous_hashes', 'schema'],\n type: 'object',\n }\n}\n","import { PayloadZod } from '@xyo-network/payload-model'\nimport z from 'zod'\n\nimport { type BoundWitness, BoundWitnessZod } from './BoundWitness.ts'\nimport { SignedBoundWitnessZod } from './SignedBoundWitness.ts'\nimport { UnsignedBoundWitnessZod } from './UnsignedBoundWitness.ts'\n\nexport function HydratedBoundWitnessZodBuilder<T extends z.ZodType<BoundWitness>>(bwZod: T) {\n return z.tuple([bwZod, z.array(PayloadZod.loose())])\n}\n\nexport const HydratedBoundWitnessZod = HydratedBoundWitnessZodBuilder(BoundWitnessZod)\n// export type HydratedBoundWitness = z.infer<typeof HydratedBoundWitnessZod>\n\nexport const SignedHydratedBoundWitnessZod = HydratedBoundWitnessZodBuilder(SignedBoundWitnessZod)\n// export type SignedHydratedBoundWitness = z.infer<typeof SignedHydratedBoundWitnessZod>\n\nexport const UnsignedHydratedBoundWitnessZod = HydratedBoundWitnessZodBuilder(UnsignedBoundWitnessZod)\n// export type UnsignedHydratedBoundWitness = z.infer<typeof UnsignedHydratedBoundWitnessZod>\n","import type z from 'zod'\n\nimport { BoundWitnessZod } from './BoundWitness.ts'\nimport { SignedSignaturesMetaZod } from './Signatures.ts'\n\nexport const SignedBoundWitnessZod = BoundWitnessZod.extend(SignedSignaturesMetaZod.shape)\nexport type SignedBoundWitness = z.infer<typeof SignedBoundWitnessZod>\n\nexport const AnySignedBoundWitnessZod = SignedBoundWitnessZod.loose()\nexport type AnySignedBoundWitness = z.infer<typeof AnySignedBoundWitnessZod>\n","import type z from 'zod'\n\nimport { BoundWitnessZod } from './BoundWitness.ts'\nimport { UnsignedSignaturesMetaZod } from './Signatures.ts'\n\nexport const UnsignedBoundWitnessZod = BoundWitnessZod.extend(UnsignedSignaturesMetaZod.shape)\nexport type UnsignedBoundWitness = z.infer<typeof UnsignedBoundWitnessZod>\n\nexport const AnyUnsignedBoundWitnessZod = UnsignedBoundWitnessZod.loose()\nexport type AnyUnsignedBoundWitness = z.infer<typeof AnyUnsignedBoundWitnessZod>\n","import type { Hash } from '@xylabs/sdk-js'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport { isStorageMeta } from '@xyo-network/payload-model'\n\nimport { type BoundWitness, isBoundWitness } from './BoundWitness/index.ts'\n\nexport interface QueryBoundWitnessFields {\n error_hashes?: Hash[]\n query: Hash\n}\n\nexport type UnsignedQueryBoundWitness = BoundWitness & QueryBoundWitnessFields\n\nexport type QueryBoundWitness = UnsignedQueryBoundWitness\n\nexport const isQueryBoundWitness = (x?: unknown): x is QueryBoundWitness => isBoundWitness(x) && (x as QueryBoundWitness)?.query !== undefined\nexport const isQueryBoundWitnessWithStorageMeta = (x?: unknown): x is WithStorageMeta<QueryBoundWitness> => isQueryBoundWitness(x) && isStorageMeta(x)\n","import FS from 'node:fs'\n\nimport chalk from 'chalk'\n\nimport { deriveAccount, getActiveWallet } from '../account/getActiveWallet.ts'\nimport { createWalletClient } from '../client/walletClient.ts'\nimport { getActiveNetwork } from '../network/storage.ts'\n\nexport interface BroadcastTransactionOptions {\n file: string\n offset?: string\n}\n\nfunction reviveBigints(_key: string, value: unknown): unknown {\n if (typeof value === 'string' && /^-?\\d+n$/.test(value)) {\n return BigInt(value.slice(0, -1))\n }\n return value\n}\n\nexport async function broadcastTransaction(options: BroadcastTransactionOptions): Promise<void> {\n const offset = options.offset ?? '0'\n const raw = FS.readFileSync(options.file, 'utf8')\n const signedTx = JSON.parse(raw, reviveBigints) as never\n const network = getActiveNetwork()\n const { rootWallet } = await getActiveWallet()\n const account = await deriveAccount(rootWallet, offset)\n console.log(chalk.gray(`Connecting to ${network.rpcUrl}...`))\n const { runner } = await createWalletClient(network.rpcUrl, account)\n const hash = await runner.broadcastTransaction(signedTx)\n console.log(chalk.green(`Broadcast accepted: ${hash}`))\n}\n","import { asAddress, assertEx } from '@xylabs/sdk-js'\nimport { XL1Amount } from '@xyo-network/xl1-protocol-sdk'\nimport chalk from 'chalk'\n\nimport { deriveAccount, getActiveWallet } from '../account/getActiveWallet.ts'\nimport { createWalletClient } from '../client/walletClient.ts'\nimport { getActiveNetwork } from '../network/storage.ts'\n\nexport interface SendTransactionOptions {\n recipient: string\n amount: string\n offset?: string\n attempts?: number\n delay?: number\n}\n\nexport async function sendTransaction(options: SendTransactionOptions): Promise<void> {\n const offset = options.offset ?? '0'\n const { rootWallet } = await getActiveWallet()\n const account = await deriveAccount(rootWallet, offset)\n const network = getActiveNetwork()\n\n const recipient = assertEx(asAddress(options.recipient.toLowerCase().replace(/^0x/, '')), () => `Invalid recipient address: ${options.recipient}`)\n const amountXL1 = XL1Amount.fromXL1(BigInt(options.amount) as never)\n\n console.log(chalk.gray(`Connecting to ${network.rpcUrl}...`))\n const { gateway } = await createWalletClient(network.rpcUrl, account)\n\n console.log(chalk.gray(`Submitting transfer of ${options.amount} XL1 to 0x${recipient}...`))\n const hash = await gateway.send(recipient, amountXL1.atto)\n console.log(chalk.gray(`Tx submitted: ${hash}`))\n\n const attempts = options.attempts ?? 30\n const delay = options.delay ?? 2000\n console.log(chalk.gray(`Confirming (up to ${attempts} attempts, ${delay}ms apart)...`))\n await gateway.confirmSubmittedTransaction(hash, { attempts, delay })\n\n console.log(chalk.green(`Sent ${options.amount} XL1 → 0x${recipient}`))\n console.log(`${chalk.gray('hash:')} ${hash}`)\n console.log(`${chalk.gray('from:')} 0x${account.address}`)\n console.log(`${chalk.gray('network:')} ${network.id}`)\n}\n","import FS from 'node:fs'\n\nimport type { Payload } from '@xyo-network/payload-model'\nimport { buildTransaction } from '@xyo-network/xl1-protocol-sdk'\nimport chalk from 'chalk'\n\nimport { deriveAccount, getActiveWallet } from '../account/getActiveWallet.ts'\n\ninterface UnsignedTransactionFile {\n chain: string\n onChainPayloads?: Payload[]\n offChainPayloads?: Payload[]\n nbf: number | string\n exp: number | string\n fees?: {\n base: string | number | bigint\n gasLimit: string | number | bigint\n gasPrice: string | number | bigint\n priority: string | number | bigint\n }\n}\n\nfunction asBigint(value: string | number | bigint): bigint {\n return typeof value === 'bigint' ? value : BigInt(value)\n}\n\nexport interface SignTransactionOptions {\n file: string\n offset?: string\n output?: string\n}\n\nexport async function signTransactionFile(options: SignTransactionOptions): Promise<void> {\n const offset = options.offset ?? '0'\n const raw = FS.readFileSync(options.file, 'utf8')\n const tx = JSON.parse(raw) as UnsignedTransactionFile\n const { rootWallet } = await getActiveWallet()\n const account = await deriveAccount(rootWallet, offset)\n const fees = tx.fees\n ? {\n base: asBigint(tx.fees.base),\n gasLimit: asBigint(tx.fees.gasLimit),\n gasPrice: asBigint(tx.fees.gasPrice),\n priority: asBigint(tx.fees.priority),\n }\n : undefined\n // Cast to runtime-required branded types; the SDK validates them internally.\n const signed = await buildTransaction(\n tx.chain as never,\n (tx.onChainPayloads ?? []) as never,\n tx.offChainPayloads ?? [],\n account,\n asBigint(tx.nbf) as never,\n asBigint(tx.exp) as never,\n undefined,\n fees,\n )\n const serialized = JSON.stringify(signed, (_key, value: unknown) => (typeof value === 'bigint' ? value.toString() : value), 2)\n if (options.output) {\n FS.writeFileSync(options.output, `${serialized}\\n`)\n console.log(chalk.green(`Signed transaction written to ${options.output}`))\n } else {\n console.log(serialized)\n }\n}\n"],"mappings":"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","names":["PATH","PATH","webcrypto","webcrypto","FS","OS","webcrypto","FS","OS","subtle","webcrypto","chalk","chalk","chalk","chalk","chalk","chalk","chalk","chalk","FS","chalk","FS","chalk","FS","chalk","FS","chalk","chalk","chalk","chalk","chalk","chalk","chalk","chalk","chalk","HDWallet","chalk","key","webcrypto","HDWallet","chalk","chalk","chalk","HDWallet","chalk","HDWallet","chalk","chalk","chalk","HDWallet","DEFAULT_WALLET_PATH","chalk","HDWallet","DEFAULT_WALLET_PATH","chalk","chalk","chalk","chalk","chalk","chalk","chalk","FS","z","PayloadZod","z","PayloadZod","asHash","PayloadBuilder","asHash","assertEx","chalk","FS","chalk","FS","chalk","FS","chalk","asAddress","assertEx","XL1Amount","chalk","assertEx","asAddress","XL1Amount","chalk","FS","chalk","FS","chalk"]}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// src/actions/wallet/network/networkActions.ts
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
|
|
4
|
+
// src/actions/wallet/paths.ts
|
|
5
|
+
import OS from "os";
|
|
6
|
+
import PATH from "path";
|
|
7
|
+
function walletRoot() {
|
|
8
|
+
const override = process.env.ARIES_WALLET_HOME;
|
|
9
|
+
if (override) return override;
|
|
10
|
+
return PATH.join(OS.homedir(), ".aries", "wallet");
|
|
11
|
+
}
|
|
12
|
+
function walletPaths(root = walletRoot()) {
|
|
13
|
+
return {
|
|
14
|
+
root,
|
|
15
|
+
password: PATH.join(root, "password.json"),
|
|
16
|
+
phrases: PATH.join(root, "phrases.json"),
|
|
17
|
+
active: PATH.join(root, "active.json"),
|
|
18
|
+
addressBooks: PATH.join(root, "address-books.json"),
|
|
19
|
+
contacts: PATH.join(root, "contacts.json"),
|
|
20
|
+
networks: PATH.join(root, "networks.json"),
|
|
21
|
+
session: PATH.join(root, "session.json"),
|
|
22
|
+
machineId: PATH.join(root, ".machine-id")
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// src/actions/wallet/storage.ts
|
|
27
|
+
import FS from "fs";
|
|
28
|
+
import PATH2 from "path";
|
|
29
|
+
function ensureWalletDir(root = walletRoot()) {
|
|
30
|
+
if (!FS.existsSync(root)) {
|
|
31
|
+
FS.mkdirSync(root, { recursive: true, mode: 448 });
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
FS.chmodSync(root, 448);
|
|
36
|
+
} catch {
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function readJsonFile(file) {
|
|
40
|
+
if (!FS.existsSync(file)) return void 0;
|
|
41
|
+
const raw = FS.readFileSync(file, "utf8");
|
|
42
|
+
if (raw.trim().length === 0) return void 0;
|
|
43
|
+
return JSON.parse(raw);
|
|
44
|
+
}
|
|
45
|
+
function writeJsonFile(file, value) {
|
|
46
|
+
ensureWalletDir(PATH2.dirname(file));
|
|
47
|
+
const tmp = `${file}.tmp`;
|
|
48
|
+
FS.writeFileSync(tmp, `${JSON.stringify(value, null, 2)}
|
|
49
|
+
`, { mode: 384 });
|
|
50
|
+
FS.renameSync(tmp, file);
|
|
51
|
+
try {
|
|
52
|
+
FS.chmodSync(file, 384);
|
|
53
|
+
} catch {
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// src/actions/wallet/network/storage.ts
|
|
58
|
+
var DEFAULT_NETWORKS = [
|
|
59
|
+
{
|
|
60
|
+
id: "xl1-mainnet",
|
|
61
|
+
label: "XL1 Mainnet",
|
|
62
|
+
rpcUrl: "https://node.xyo.network",
|
|
63
|
+
isCustom: false
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: "xl1-testnet",
|
|
67
|
+
label: "XL1 Testnet",
|
|
68
|
+
rpcUrl: "https://testnet.node.xyo.network",
|
|
69
|
+
isCustom: false
|
|
70
|
+
}
|
|
71
|
+
];
|
|
72
|
+
function readNetworks() {
|
|
73
|
+
const data = readJsonFile(walletPaths().networks);
|
|
74
|
+
if (data) return data;
|
|
75
|
+
const seeded = {
|
|
76
|
+
networks: DEFAULT_NETWORKS,
|
|
77
|
+
activeId: DEFAULT_NETWORKS[0].id
|
|
78
|
+
};
|
|
79
|
+
writeJsonFile(walletPaths().networks, seeded);
|
|
80
|
+
return seeded;
|
|
81
|
+
}
|
|
82
|
+
function writeNetworks(file) {
|
|
83
|
+
writeJsonFile(walletPaths().networks, file);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// src/actions/wallet/network/networkActions.ts
|
|
87
|
+
function listNetworks() {
|
|
88
|
+
const file = readNetworks();
|
|
89
|
+
for (const network of file.networks) {
|
|
90
|
+
const marker = network.id === file.activeId ? chalk.green("* ") : " ";
|
|
91
|
+
const id = chalk.cyan(network.id.padEnd(20));
|
|
92
|
+
const label = chalk.white(network.label.padEnd(20));
|
|
93
|
+
const custom = network.isCustom ? chalk.gray("(custom)") : "";
|
|
94
|
+
console.log(`${marker}${id} ${label} ${network.rpcUrl} ${custom}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function useNetwork(id) {
|
|
98
|
+
const file = readNetworks();
|
|
99
|
+
const found = file.networks.find((n) => n.id === id);
|
|
100
|
+
if (!found) throw new Error(`Network not found: ${id}`);
|
|
101
|
+
file.activeId = id;
|
|
102
|
+
writeNetworks(file);
|
|
103
|
+
console.log(chalk.green(`Active network set to ${chalk.cyan(id)}`));
|
|
104
|
+
}
|
|
105
|
+
function addNetwork(options) {
|
|
106
|
+
const file = readNetworks();
|
|
107
|
+
if (file.networks.some((n) => n.id === options.id)) {
|
|
108
|
+
throw new Error(`Network already exists: ${options.id}`);
|
|
109
|
+
}
|
|
110
|
+
const record = {
|
|
111
|
+
id: options.id,
|
|
112
|
+
label: options.label ?? options.id,
|
|
113
|
+
rpcUrl: options.rpcUrl,
|
|
114
|
+
chainId: options.chainId,
|
|
115
|
+
isCustom: true
|
|
116
|
+
};
|
|
117
|
+
file.networks.push(record);
|
|
118
|
+
writeNetworks(file);
|
|
119
|
+
console.log(chalk.green(`Added network ${chalk.cyan(options.id)} (${options.rpcUrl})`));
|
|
120
|
+
}
|
|
121
|
+
function removeNetwork(id) {
|
|
122
|
+
const file = readNetworks();
|
|
123
|
+
const target = file.networks.find((n) => n.id === id);
|
|
124
|
+
if (!target) throw new Error(`Network not found: ${id}`);
|
|
125
|
+
if (!target.isCustom) throw new Error(`Cannot remove built-in network: ${id}`);
|
|
126
|
+
file.networks = file.networks.filter((n) => n.id !== id);
|
|
127
|
+
if (file.activeId === id) file.activeId = file.networks[0]?.id ?? "";
|
|
128
|
+
writeNetworks(file);
|
|
129
|
+
console.log(chalk.green(`Removed network ${chalk.cyan(id)}`));
|
|
130
|
+
}
|
|
131
|
+
export {
|
|
132
|
+
addNetwork,
|
|
133
|
+
listNetworks,
|
|
134
|
+
removeNetwork,
|
|
135
|
+
useNetwork
|
|
136
|
+
};
|
|
137
|
+
//# sourceMappingURL=networkActions.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/wallet/network/networkActions.ts","../../../../src/actions/wallet/paths.ts","../../../../src/actions/wallet/storage.ts","../../../../src/actions/wallet/network/storage.ts"],"sourcesContent":["import chalk from 'chalk'\n\nimport type { NetworkRecord } from './storage.ts'\nimport { readNetworks, writeNetworks } from './storage.ts'\n\nexport function listNetworks(): void {\n const file = readNetworks()\n for (const network of file.networks) {\n const marker = network.id === file.activeId ? chalk.green('* ') : ' '\n const id = chalk.cyan(network.id.padEnd(20))\n const label = chalk.white(network.label.padEnd(20))\n const custom = network.isCustom ? chalk.gray('(custom)') : ''\n console.log(`${marker}${id} ${label} ${network.rpcUrl} ${custom}`)\n }\n}\n\nexport function useNetwork(id: string): void {\n const file = readNetworks()\n const found = file.networks.find(n => n.id === id)\n if (!found) throw new Error(`Network not found: ${id}`)\n file.activeId = id\n writeNetworks(file)\n console.log(chalk.green(`Active network set to ${chalk.cyan(id)}`))\n}\n\nexport interface AddNetworkOptions {\n id: string\n rpcUrl: string\n label?: string\n chainId?: string\n}\n\nexport function addNetwork(options: AddNetworkOptions): void {\n const file = readNetworks()\n if (file.networks.some(n => n.id === options.id)) {\n throw new Error(`Network already exists: ${options.id}`)\n }\n const record: NetworkRecord = {\n id: options.id,\n label: options.label ?? options.id,\n rpcUrl: options.rpcUrl,\n chainId: options.chainId,\n isCustom: true,\n }\n file.networks.push(record)\n writeNetworks(file)\n console.log(chalk.green(`Added network ${chalk.cyan(options.id)} (${options.rpcUrl})`))\n}\n\nexport function removeNetwork(id: string): void {\n const file = readNetworks()\n const target = file.networks.find(n => n.id === id)\n if (!target) throw new Error(`Network not found: ${id}`)\n if (!target.isCustom) throw new Error(`Cannot remove built-in network: ${id}`)\n file.networks = file.networks.filter(n => n.id !== id)\n if (file.activeId === id) file.activeId = file.networks[0]?.id ?? ''\n writeNetworks(file)\n console.log(chalk.green(`Removed network ${chalk.cyan(id)}`))\n}\n","import OS from 'node:os'\nimport PATH from 'node:path'\n\nexport interface WalletPaths {\n root: string\n password: string\n phrases: string\n active: string\n addressBooks: string\n contacts: string\n networks: string\n session: string\n machineId: string\n}\n\nexport function walletRoot(): string {\n const override = process.env.ARIES_WALLET_HOME\n if (override) return override\n return PATH.join(OS.homedir(), '.aries', 'wallet')\n}\n\nexport function walletPaths(root: string = walletRoot()): WalletPaths {\n return {\n root,\n password: PATH.join(root, 'password.json'),\n phrases: PATH.join(root, 'phrases.json'),\n active: PATH.join(root, 'active.json'),\n addressBooks: PATH.join(root, 'address-books.json'),\n contacts: PATH.join(root, 'contacts.json'),\n networks: PATH.join(root, 'networks.json'),\n session: PATH.join(root, 'session.json'),\n machineId: PATH.join(root, '.machine-id'),\n }\n}\n","import FS from 'node:fs'\nimport PATH from 'node:path'\n\nimport { walletRoot } from './paths.ts'\n\nexport function ensureWalletDir(root: string = walletRoot()): void {\n if (!FS.existsSync(root)) {\n FS.mkdirSync(root, { recursive: true, mode: 0o700 })\n return\n }\n try {\n FS.chmodSync(root, 0o700)\n } catch {\n // best-effort on platforms without chmod\n }\n}\n\nexport function readJsonFile<T>(file: string): T | undefined {\n if (!FS.existsSync(file)) return undefined\n const raw = FS.readFileSync(file, 'utf8')\n if (raw.trim().length === 0) return undefined\n return JSON.parse(raw) as T\n}\n\nexport function writeJsonFile(file: string, value: unknown): void {\n ensureWalletDir(PATH.dirname(file))\n const tmp = `${file}.tmp`\n FS.writeFileSync(tmp, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 })\n FS.renameSync(tmp, file)\n try {\n FS.chmodSync(file, 0o600)\n } catch {\n // best-effort\n }\n}\n\nexport function deleteFile(file: string): void {\n if (FS.existsSync(file)) FS.unlinkSync(file)\n}\n","import { walletPaths } from '../paths.ts'\nimport { readJsonFile, writeJsonFile } from '../storage.ts'\n\nexport interface NetworkRecord {\n id: string\n label: string\n rpcUrl: string\n chainId?: string\n isCustom: boolean\n}\n\nexport interface NetworksFile {\n networks: NetworkRecord[]\n activeId: string\n}\n\nconst DEFAULT_NETWORKS: NetworkRecord[] = [\n {\n id: 'xl1-mainnet',\n label: 'XL1 Mainnet',\n rpcUrl: 'https://node.xyo.network',\n isCustom: false,\n },\n {\n id: 'xl1-testnet',\n label: 'XL1 Testnet',\n rpcUrl: 'https://testnet.node.xyo.network',\n isCustom: false,\n },\n]\n\nexport function readNetworks(): NetworksFile {\n const data = readJsonFile<NetworksFile>(walletPaths().networks)\n if (data) return data\n const seeded: NetworksFile = {\n networks: DEFAULT_NETWORKS,\n activeId: DEFAULT_NETWORKS[0].id,\n }\n writeJsonFile(walletPaths().networks, seeded)\n return seeded\n}\n\nexport function writeNetworks(file: NetworksFile): void {\n writeJsonFile(walletPaths().networks, file)\n}\n\nexport function getActiveNetwork(): NetworkRecord {\n const file = readNetworks()\n const found = file.networks.find(n => n.id === file.activeId)\n if (!found) throw new Error(`Active network ${file.activeId} not found.`)\n return found\n}\n"],"mappings":"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","names":["PATH","PATH"]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// src/actions/wallet/paths.ts
|
|
2
|
+
import OS from "os";
|
|
3
|
+
import PATH from "path";
|
|
4
|
+
function walletRoot() {
|
|
5
|
+
const override = process.env.ARIES_WALLET_HOME;
|
|
6
|
+
if (override) return override;
|
|
7
|
+
return PATH.join(OS.homedir(), ".aries", "wallet");
|
|
8
|
+
}
|
|
9
|
+
function walletPaths(root = walletRoot()) {
|
|
10
|
+
return {
|
|
11
|
+
root,
|
|
12
|
+
password: PATH.join(root, "password.json"),
|
|
13
|
+
phrases: PATH.join(root, "phrases.json"),
|
|
14
|
+
active: PATH.join(root, "active.json"),
|
|
15
|
+
addressBooks: PATH.join(root, "address-books.json"),
|
|
16
|
+
contacts: PATH.join(root, "contacts.json"),
|
|
17
|
+
networks: PATH.join(root, "networks.json"),
|
|
18
|
+
session: PATH.join(root, "session.json"),
|
|
19
|
+
machineId: PATH.join(root, ".machine-id")
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// src/actions/wallet/storage.ts
|
|
24
|
+
import FS from "fs";
|
|
25
|
+
import PATH2 from "path";
|
|
26
|
+
function ensureWalletDir(root = walletRoot()) {
|
|
27
|
+
if (!FS.existsSync(root)) {
|
|
28
|
+
FS.mkdirSync(root, { recursive: true, mode: 448 });
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
FS.chmodSync(root, 448);
|
|
33
|
+
} catch {
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function readJsonFile(file) {
|
|
37
|
+
if (!FS.existsSync(file)) return void 0;
|
|
38
|
+
const raw = FS.readFileSync(file, "utf8");
|
|
39
|
+
if (raw.trim().length === 0) return void 0;
|
|
40
|
+
return JSON.parse(raw);
|
|
41
|
+
}
|
|
42
|
+
function writeJsonFile(file, value) {
|
|
43
|
+
ensureWalletDir(PATH2.dirname(file));
|
|
44
|
+
const tmp = `${file}.tmp`;
|
|
45
|
+
FS.writeFileSync(tmp, `${JSON.stringify(value, null, 2)}
|
|
46
|
+
`, { mode: 384 });
|
|
47
|
+
FS.renameSync(tmp, file);
|
|
48
|
+
try {
|
|
49
|
+
FS.chmodSync(file, 384);
|
|
50
|
+
} catch {
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// src/actions/wallet/network/storage.ts
|
|
55
|
+
var DEFAULT_NETWORKS = [
|
|
56
|
+
{
|
|
57
|
+
id: "xl1-mainnet",
|
|
58
|
+
label: "XL1 Mainnet",
|
|
59
|
+
rpcUrl: "https://node.xyo.network",
|
|
60
|
+
isCustom: false
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "xl1-testnet",
|
|
64
|
+
label: "XL1 Testnet",
|
|
65
|
+
rpcUrl: "https://testnet.node.xyo.network",
|
|
66
|
+
isCustom: false
|
|
67
|
+
}
|
|
68
|
+
];
|
|
69
|
+
function readNetworks() {
|
|
70
|
+
const data = readJsonFile(walletPaths().networks);
|
|
71
|
+
if (data) return data;
|
|
72
|
+
const seeded = {
|
|
73
|
+
networks: DEFAULT_NETWORKS,
|
|
74
|
+
activeId: DEFAULT_NETWORKS[0].id
|
|
75
|
+
};
|
|
76
|
+
writeJsonFile(walletPaths().networks, seeded);
|
|
77
|
+
return seeded;
|
|
78
|
+
}
|
|
79
|
+
function writeNetworks(file) {
|
|
80
|
+
writeJsonFile(walletPaths().networks, file);
|
|
81
|
+
}
|
|
82
|
+
function getActiveNetwork() {
|
|
83
|
+
const file = readNetworks();
|
|
84
|
+
const found = file.networks.find((n) => n.id === file.activeId);
|
|
85
|
+
if (!found) throw new Error(`Active network ${file.activeId} not found.`);
|
|
86
|
+
return found;
|
|
87
|
+
}
|
|
88
|
+
export {
|
|
89
|
+
getActiveNetwork,
|
|
90
|
+
readNetworks,
|
|
91
|
+
writeNetworks
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=storage.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/wallet/paths.ts","../../../../src/actions/wallet/storage.ts","../../../../src/actions/wallet/network/storage.ts"],"sourcesContent":["import OS from 'node:os'\nimport PATH from 'node:path'\n\nexport interface WalletPaths {\n root: string\n password: string\n phrases: string\n active: string\n addressBooks: string\n contacts: string\n networks: string\n session: string\n machineId: string\n}\n\nexport function walletRoot(): string {\n const override = process.env.ARIES_WALLET_HOME\n if (override) return override\n return PATH.join(OS.homedir(), '.aries', 'wallet')\n}\n\nexport function walletPaths(root: string = walletRoot()): WalletPaths {\n return {\n root,\n password: PATH.join(root, 'password.json'),\n phrases: PATH.join(root, 'phrases.json'),\n active: PATH.join(root, 'active.json'),\n addressBooks: PATH.join(root, 'address-books.json'),\n contacts: PATH.join(root, 'contacts.json'),\n networks: PATH.join(root, 'networks.json'),\n session: PATH.join(root, 'session.json'),\n machineId: PATH.join(root, '.machine-id'),\n }\n}\n","import FS from 'node:fs'\nimport PATH from 'node:path'\n\nimport { walletRoot } from './paths.ts'\n\nexport function ensureWalletDir(root: string = walletRoot()): void {\n if (!FS.existsSync(root)) {\n FS.mkdirSync(root, { recursive: true, mode: 0o700 })\n return\n }\n try {\n FS.chmodSync(root, 0o700)\n } catch {\n // best-effort on platforms without chmod\n }\n}\n\nexport function readJsonFile<T>(file: string): T | undefined {\n if (!FS.existsSync(file)) return undefined\n const raw = FS.readFileSync(file, 'utf8')\n if (raw.trim().length === 0) return undefined\n return JSON.parse(raw) as T\n}\n\nexport function writeJsonFile(file: string, value: unknown): void {\n ensureWalletDir(PATH.dirname(file))\n const tmp = `${file}.tmp`\n FS.writeFileSync(tmp, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 })\n FS.renameSync(tmp, file)\n try {\n FS.chmodSync(file, 0o600)\n } catch {\n // best-effort\n }\n}\n\nexport function deleteFile(file: string): void {\n if (FS.existsSync(file)) FS.unlinkSync(file)\n}\n","import { walletPaths } from '../paths.ts'\nimport { readJsonFile, writeJsonFile } from '../storage.ts'\n\nexport interface NetworkRecord {\n id: string\n label: string\n rpcUrl: string\n chainId?: string\n isCustom: boolean\n}\n\nexport interface NetworksFile {\n networks: NetworkRecord[]\n activeId: string\n}\n\nconst DEFAULT_NETWORKS: NetworkRecord[] = [\n {\n id: 'xl1-mainnet',\n label: 'XL1 Mainnet',\n rpcUrl: 'https://node.xyo.network',\n isCustom: false,\n },\n {\n id: 'xl1-testnet',\n label: 'XL1 Testnet',\n rpcUrl: 'https://testnet.node.xyo.network',\n isCustom: false,\n },\n]\n\nexport function readNetworks(): NetworksFile {\n const data = readJsonFile<NetworksFile>(walletPaths().networks)\n if (data) return data\n const seeded: NetworksFile = {\n networks: DEFAULT_NETWORKS,\n activeId: DEFAULT_NETWORKS[0].id,\n }\n writeJsonFile(walletPaths().networks, seeded)\n return seeded\n}\n\nexport function writeNetworks(file: NetworksFile): void {\n writeJsonFile(walletPaths().networks, file)\n}\n\nexport function getActiveNetwork(): NetworkRecord {\n const file = readNetworks()\n const found = file.networks.find(n => n.id === file.activeId)\n if (!found) throw new Error(`Active network ${file.activeId} not found.`)\n return found\n}\n"],"mappings":";AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAcV,SAAS,aAAqB;AACnC,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,SAAU,QAAO;AACrB,SAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,UAAU,QAAQ;AACnD;AAEO,SAAS,YAAY,OAAe,WAAW,GAAgB;AACpE,SAAO;AAAA,IACL;AAAA,IACA,UAAU,KAAK,KAAK,MAAM,eAAe;AAAA,IACzC,SAAS,KAAK,KAAK,MAAM,cAAc;AAAA,IACvC,QAAQ,KAAK,KAAK,MAAM,aAAa;AAAA,IACrC,cAAc,KAAK,KAAK,MAAM,oBAAoB;AAAA,IAClD,UAAU,KAAK,KAAK,MAAM,eAAe;AAAA,IACzC,UAAU,KAAK,KAAK,MAAM,eAAe;AAAA,IACzC,SAAS,KAAK,KAAK,MAAM,cAAc;AAAA,IACvC,WAAW,KAAK,KAAK,MAAM,aAAa;AAAA,EAC1C;AACF;;;ACjCA,OAAO,QAAQ;AACf,OAAOA,WAAU;AAIV,SAAS,gBAAgB,OAAe,WAAW,GAAS;AACjE,MAAI,CAAC,GAAG,WAAW,IAAI,GAAG;AACxB,OAAG,UAAU,MAAM,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACnD;AAAA,EACF;AACA,MAAI;AACF,OAAG,UAAU,MAAM,GAAK;AAAA,EAC1B,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,aAAgB,MAA6B;AAC3D,MAAI,CAAC,GAAG,WAAW,IAAI,EAAG,QAAO;AACjC,QAAM,MAAM,GAAG,aAAa,MAAM,MAAM;AACxC,MAAI,IAAI,KAAK,EAAE,WAAW,EAAG,QAAO;AACpC,SAAO,KAAK,MAAM,GAAG;AACvB;AAEO,SAAS,cAAc,MAAc,OAAsB;AAChE,kBAAgBC,MAAK,QAAQ,IAAI,CAAC;AAClC,QAAM,MAAM,GAAG,IAAI;AACnB,KAAG,cAAc,KAAK,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,EAAE,MAAM,IAAM,CAAC;AAC5E,KAAG,WAAW,KAAK,IAAI;AACvB,MAAI;AACF,OAAG,UAAU,MAAM,GAAK;AAAA,EAC1B,QAAQ;AAAA,EAER;AACF;;;AClBA,IAAM,mBAAoC;AAAA,EACxC;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AACF;AAEO,SAAS,eAA6B;AAC3C,QAAM,OAAO,aAA2B,YAAY,EAAE,QAAQ;AAC9D,MAAI,KAAM,QAAO;AACjB,QAAM,SAAuB;AAAA,IAC3B,UAAU;AAAA,IACV,UAAU,iBAAiB,CAAC,EAAE;AAAA,EAChC;AACA,gBAAc,YAAY,EAAE,UAAU,MAAM;AAC5C,SAAO;AACT;AAEO,SAAS,cAAc,MAA0B;AACtD,gBAAc,YAAY,EAAE,UAAU,IAAI;AAC5C;AAEO,SAAS,mBAAkC;AAChD,QAAM,OAAO,aAAa;AAC1B,QAAM,QAAQ,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,KAAK,QAAQ;AAC5D,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,kBAAkB,KAAK,QAAQ,aAAa;AACxE,SAAO;AACT;","names":["PATH","PATH"]}
|