@namera-ai/cli 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/commands/index.mjs +21 -0
  2. package/dist/commands/index.mjs.map +1 -0
  3. package/dist/commands/keystore/create.mjs +74 -0
  4. package/dist/commands/keystore/create.mjs.map +1 -0
  5. package/dist/commands/keystore/decrypt.mjs +71 -0
  6. package/dist/commands/keystore/decrypt.mjs.map +1 -0
  7. package/dist/commands/keystore/import.mjs +84 -0
  8. package/dist/commands/keystore/import.mjs.map +1 -0
  9. package/dist/commands/keystore/index.mjs +28 -0
  10. package/dist/commands/keystore/index.mjs.map +1 -0
  11. package/dist/commands/keystore/info.mjs +62 -0
  12. package/dist/commands/keystore/info.mjs.map +1 -0
  13. package/dist/commands/keystore/list.mjs +46 -0
  14. package/dist/commands/keystore/list.mjs.map +1 -0
  15. package/dist/commands/keystore/remove.mjs +51 -0
  16. package/dist/commands/keystore/remove.mjs.map +1 -0
  17. package/dist/commands/mcp/index.mjs +13 -0
  18. package/dist/commands/mcp/index.mjs.map +1 -0
  19. package/dist/commands/mcp/start.mjs +82 -0
  20. package/dist/commands/mcp/start.mjs.map +1 -0
  21. package/dist/commands/schema/index.mjs +55 -0
  22. package/dist/commands/schema/index.mjs.map +1 -0
  23. package/dist/commands/session-key/create/index.mjs +87 -0
  24. package/dist/commands/session-key/create/index.mjs.map +1 -0
  25. package/dist/commands/session-key/create/prompts/base.mjs +52 -0
  26. package/dist/commands/session-key/create/prompts/base.mjs.map +1 -0
  27. package/dist/commands/session-key/create/prompts/call.mjs +85 -0
  28. package/dist/commands/session-key/create/prompts/call.mjs.map +1 -0
  29. package/dist/commands/session-key/create/prompts/common.mjs +27 -0
  30. package/dist/commands/session-key/create/prompts/common.mjs.map +1 -0
  31. package/dist/commands/session-key/create/prompts/gas.mjs +19 -0
  32. package/dist/commands/session-key/create/prompts/gas.mjs.map +1 -0
  33. package/dist/commands/session-key/create/prompts/index.mjs +44 -0
  34. package/dist/commands/session-key/create/prompts/index.mjs.map +1 -0
  35. package/dist/commands/session-key/create/prompts/rate-limit.mjs +40 -0
  36. package/dist/commands/session-key/create/prompts/rate-limit.mjs.map +1 -0
  37. package/dist/commands/session-key/create/prompts/signature-caller.mjs +26 -0
  38. package/dist/commands/session-key/create/prompts/signature-caller.mjs.map +1 -0
  39. package/dist/commands/session-key/create/prompts/timestamp.mjs +32 -0
  40. package/dist/commands/session-key/create/prompts/timestamp.mjs.map +1 -0
  41. package/dist/commands/session-key/index.mjs +26 -0
  42. package/dist/commands/session-key/index.mjs.map +1 -0
  43. package/dist/commands/session-key/info.mjs +64 -0
  44. package/dist/commands/session-key/info.mjs.map +1 -0
  45. package/dist/commands/session-key/list.mjs +54 -0
  46. package/dist/commands/session-key/list.mjs.map +1 -0
  47. package/dist/commands/session-key/remove.mjs +51 -0
  48. package/dist/commands/session-key/remove.mjs.map +1 -0
  49. package/dist/commands/session-key/status.mjs +64 -0
  50. package/dist/commands/session-key/status.mjs.map +1 -0
  51. package/dist/commands/smart-account/create.mjs +94 -0
  52. package/dist/commands/smart-account/create.mjs.map +1 -0
  53. package/dist/commands/smart-account/import.mjs +45 -0
  54. package/dist/commands/smart-account/import.mjs.map +1 -0
  55. package/dist/commands/smart-account/index.mjs +30 -0
  56. package/dist/commands/smart-account/index.mjs.map +1 -0
  57. package/dist/commands/smart-account/info.mjs +66 -0
  58. package/dist/commands/smart-account/info.mjs.map +1 -0
  59. package/dist/commands/smart-account/list.mjs +48 -0
  60. package/dist/commands/smart-account/list.mjs.map +1 -0
  61. package/dist/commands/smart-account/remove.mjs +54 -0
  62. package/dist/commands/smart-account/remove.mjs.map +1 -0
  63. package/dist/commands/smart-account/status.mjs +63 -0
  64. package/dist/commands/smart-account/status.mjs.map +1 -0
  65. package/dist/dto/index.mjs +6 -0
  66. package/dist/dto/keystore.mjs +44 -0
  67. package/dist/dto/keystore.mjs.map +1 -0
  68. package/dist/dto/mcp.mjs +13 -0
  69. package/dist/dto/mcp.mjs.map +1 -0
  70. package/dist/dto/session-key.mjs +54 -0
  71. package/dist/dto/session-key.mjs.map +1 -0
  72. package/dist/dto/smart-account.mjs +45 -0
  73. package/dist/dto/smart-account.mjs.map +1 -0
  74. package/dist/flags/global.mjs +29 -0
  75. package/dist/flags/global.mjs.map +1 -0
  76. package/dist/flags/shared.mjs +11 -0
  77. package/dist/flags/shared.mjs.map +1 -0
  78. package/dist/helpers/humanize.mjs +153 -0
  79. package/dist/helpers/humanize.mjs.map +1 -0
  80. package/dist/helpers/paths.mjs +31 -0
  81. package/dist/helpers/paths.mjs.map +1 -0
  82. package/dist/helpers/policy.mjs +89 -0
  83. package/dist/helpers/policy.mjs.map +1 -0
  84. package/dist/helpers/pretty.mjs +71 -0
  85. package/dist/helpers/pretty.mjs.map +1 -0
  86. package/dist/index.mjs +18 -3266
  87. package/dist/index.mjs.map +1 -1
  88. package/dist/layers/config.mjs +124 -0
  89. package/dist/layers/config.mjs.map +1 -0
  90. package/dist/layers/index.mjs +11 -0
  91. package/dist/layers/keystore.mjs +225 -0
  92. package/dist/layers/keystore.mjs.map +1 -0
  93. package/dist/layers/mcp-context.mjs +8 -0
  94. package/dist/layers/mcp-context.mjs.map +1 -0
  95. package/dist/layers/mcp.mjs +31 -0
  96. package/dist/layers/mcp.mjs.map +1 -0
  97. package/dist/layers/output.mjs +21 -0
  98. package/dist/layers/output.mjs.map +1 -0
  99. package/dist/layers/prompt.mjs +78 -0
  100. package/dist/layers/prompt.mjs.map +1 -0
  101. package/dist/layers/session-key.mjs +218 -0
  102. package/dist/layers/session-key.mjs.map +1 -0
  103. package/dist/layers/smart-account.mjs +172 -0
  104. package/dist/layers/smart-account.mjs.map +1 -0
  105. package/dist/layers/web3.mjs +83 -0
  106. package/dist/layers/web3.mjs.map +1 -0
  107. package/dist/mcp/helpers/common.mjs +9 -0
  108. package/dist/mcp/helpers/common.mjs.map +1 -0
  109. package/dist/mcp/helpers/index.mjs +4 -0
  110. package/dist/mcp/helpers/session-key.mjs +129 -0
  111. package/dist/mcp/helpers/session-key.mjs.map +1 -0
  112. package/dist/mcp/index.mjs +60 -0
  113. package/dist/mcp/index.mjs.map +1 -0
  114. package/dist/mcp/mcp.mjs +15 -0
  115. package/dist/mcp/mcp.mjs.map +1 -0
  116. package/dist/mcp/tools/account/address.mjs +20 -0
  117. package/dist/mcp/tools/account/address.mjs.map +1 -0
  118. package/dist/mcp/tools/account/get-balance.mjs +54 -0
  119. package/dist/mcp/tools/account/get-balance.mjs.map +1 -0
  120. package/dist/mcp/tools/account/index.mjs +15 -0
  121. package/dist/mcp/tools/account/index.mjs.map +1 -0
  122. package/dist/mcp/tools/read/index.mjs +11 -0
  123. package/dist/mcp/tools/read/index.mjs.map +1 -0
  124. package/dist/mcp/tools/read/read-contract.mjs +49 -0
  125. package/dist/mcp/tools/read/read-contract.mjs.map +1 -0
  126. package/dist/mcp/tools/transaction/execute-transaction.mjs +38 -0
  127. package/dist/mcp/tools/transaction/execute-transaction.mjs.map +1 -0
  128. package/dist/mcp/tools/transaction/index.mjs +15 -0
  129. package/dist/mcp/tools/transaction/index.mjs.map +1 -0
  130. package/dist/mcp/tools/transaction/native-transfer.mjs +59 -0
  131. package/dist/mcp/tools/transaction/native-transfer.mjs.map +1 -0
  132. package/dist/schema/chain.mjs +124 -0
  133. package/dist/schema/chain.mjs.map +1 -0
  134. package/dist/schema/common.mjs +29 -0
  135. package/dist/schema/common.mjs.map +1 -0
  136. package/dist/schema/index.mjs +5 -0
  137. package/dist/schema/policy.mjs +114 -0
  138. package/dist/schema/policy.mjs.map +1 -0
  139. package/dist/schema/tx.mjs +19 -0
  140. package/dist/schema/tx.mjs.map +1 -0
  141. package/dist/types/index.mjs +11 -0
  142. package/dist/types/index.mjs.map +1 -0
  143. package/package.json +11 -12
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ import { RemoveSmartAccountParams } from "../../dto/smart-account.mjs";
3
+ import "../../dto/index.mjs";
4
+ import { getGlobalFlags } from "../../flags/global.mjs";
5
+ import { SmartAccountManager } from "../../layers/smart-account.mjs";
6
+ import { OutputFormatter } from "../../layers/output.mjs";
7
+ import "../../layers/index.mjs";
8
+ import { Console, Effect, Schema } from "effect";
9
+ import { Command, Flag } from "effect/unstable/cli";
10
+ //#region src/commands/smart-account/remove.ts
11
+ const handler = (flagAlias) => Effect.gen(function* () {
12
+ const smartAccountManager = yield* SmartAccountManager;
13
+ const outputFormatter = yield* OutputFormatter;
14
+ const globalFlags = yield* getGlobalFlags();
15
+ let params;
16
+ if (globalFlags.params._tag === "Some") params = Schema.decodeUnknownSync(Schema.fromJsonString(RemoveSmartAccountParams))(globalFlags.params.value);
17
+ else {
18
+ let alias;
19
+ if (flagAlias._tag === "Some") alias = flagAlias.value;
20
+ else alias = (yield* smartAccountManager.selectSmartAccount({ message: "Select Smart Account:" })).alias;
21
+ params = { alias };
22
+ }
23
+ yield* smartAccountManager.removeSmartAccount(params);
24
+ const data = { success: true };
25
+ if (globalFlags.quiet) return;
26
+ const output = yield* outputFormatter.format(data, globalFlags.out);
27
+ yield* Console.log(output);
28
+ });
29
+ const alias = Flag.string("alias").pipe(Flag.withDescription("The alias of the smart account to remove"), Flag.withAlias("a"), Flag.optional);
30
+ /**
31
+ * Command that removes a locally stored smart account by alias.
32
+ */
33
+ const removeSmartAccountCommand = Command.make("remove", { alias }, ({ alias }) => handler(alias)).pipe(Command.withAlias("rm"), Command.withDescription("Remove a Smart Account"), Command.withExamples([
34
+ {
35
+ command: "namera smart-account remove",
36
+ description: "Remove a smart-account with alias prompt"
37
+ },
38
+ {
39
+ command: "namera smart-account remove --alias my-smart",
40
+ description: "Remove a smart account with alias 'my-smart'"
41
+ },
42
+ {
43
+ command: `namera smart-account remove --params '{"alias":"my-smart"}'`,
44
+ description: "Remove a smart account with json params"
45
+ },
46
+ {
47
+ command: "namera schema smart-account.remove",
48
+ description: "Get the schema for the remove smart account command"
49
+ }
50
+ ]));
51
+ //#endregion
52
+ export { removeSmartAccountCommand };
53
+
54
+ //# sourceMappingURL=remove.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.mjs","names":["SmartAccountManager.SmartAccountManager","OutputFormatter.OutputFormatter"],"sources":["../../../src/commands/smart-account/remove.ts"],"sourcesContent":["import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { RemoveSmartAccountParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { OutputFormatter, SmartAccountManager } from \"@/layers\";\n\nconst handler = (flagAlias: Option.Option<string>) =>\n Effect.gen(function* () {\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: RemoveSmartAccountParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(RemoveSmartAccountParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* smartAccountManager.selectSmartAccount({\n message: \"Select Smart Account:\",\n });\n alias = res.alias;\n }\n\n params = { alias };\n }\n\n yield* smartAccountManager.removeSmartAccount(params);\n\n const data = { success: true };\n\n if (globalFlags.quiet) return;\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the smart account to remove\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\n/**\n * Command that removes a locally stored smart account by alias.\n */\nexport const removeSmartAccountCommand = Command.make(\n \"remove\",\n { alias },\n ({ alias }) => handler(alias),\n).pipe(\n Command.withAlias(\"rm\"),\n Command.withDescription(\"Remove a Smart Account\"),\n Command.withExamples([\n {\n command: \"namera smart-account remove\",\n description: \"Remove a smart-account with alias prompt\",\n },\n {\n command: \"namera smart-account remove --alias my-smart\",\n description: \"Remove a smart account with alias 'my-smart'\",\n },\n {\n command: `namera smart-account remove --params '{\"alias\":\"my-smart\"}'`,\n description: \"Remove a smart account with json params\",\n },\n {\n command: \"namera schema smart-account.remove\",\n description: \"Get the schema for the remove smart account command\",\n },\n ]),\n);\n"],"mappings":";;;;;;;;;;AAOA,MAAM,WAAW,cACf,OAAO,IAAI,aAAa;CACtB,MAAM,sBAAsB,OAAOA;CACnC,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,yBAAyB,CAChD,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;AAEJ,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAKlB,UAAQ,OAHW,oBAAoB,mBAAmB,EACxD,SAAS,yBACV,CAAC,EACU;AAGd,WAAS,EAAE,OAAO;;AAGpB,QAAO,oBAAoB,mBAAmB,OAAO;CAErD,MAAM,OAAO,EAAE,SAAS,MAAM;AAE9B,KAAI,YAAY,MAAO;CACvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAM,QAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,2CAA2C,EAChE,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;;;;AAKD,MAAa,4BAA4B,QAAQ,KAC/C,UACA,EAAE,OAAO,GACR,EAAE,YAAY,QAAQ,MAAM,CAC9B,CAAC,KACA,QAAQ,UAAU,KAAK,EACvB,QAAQ,gBAAgB,yBAAyB,EACjD,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SAAS;EACT,aAAa;EACd;CACF,CAAC,CACH"}
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env node
2
+ import { GetSmartAccountStatusParams } from "../../dto/smart-account.mjs";
3
+ import "../../dto/index.mjs";
4
+ import { getGlobalFlags } from "../../flags/global.mjs";
5
+ import { Web3Service } from "../../layers/web3.mjs";
6
+ import { SmartAccountManager } from "../../layers/smart-account.mjs";
7
+ import { OutputFormatter } from "../../layers/output.mjs";
8
+ import "../../layers/index.mjs";
9
+ import { chainAndRpcUrl } from "../../flags/shared.mjs";
10
+ import { Console, Effect, Schema } from "effect";
11
+ import { Command, Flag } from "effect/unstable/cli";
12
+ //#region src/commands/smart-account/status.ts
13
+ const handler = (flagAlias, flagChain, flagRpcUrl) => Effect.gen(function* () {
14
+ const web3Service = yield* Web3Service;
15
+ const smartAccountManager = yield* SmartAccountManager;
16
+ const outputFormatter = yield* OutputFormatter;
17
+ const globalFlags = yield* getGlobalFlags();
18
+ let params;
19
+ if (globalFlags.params._tag === "Some") params = Schema.decodeUnknownSync(Schema.fromJsonString(GetSmartAccountStatusParams))(globalFlags.params.value);
20
+ else {
21
+ let alias;
22
+ let chain;
23
+ const rpcUrl = flagRpcUrl._tag === "Some" ? flagRpcUrl.value : void 0;
24
+ if (flagAlias._tag === "Some") alias = flagAlias.value;
25
+ else alias = (yield* smartAccountManager.selectSmartAccount({ message: "Select Smart Account:" })).alias;
26
+ if (flagChain._tag === "Some") chain = flagChain.value;
27
+ else chain = yield* web3Service.selectChain({ message: "Select Chain:" });
28
+ params = {
29
+ alias,
30
+ chain,
31
+ rpcUrl
32
+ };
33
+ }
34
+ const data = { deployed: yield* smartAccountManager.getSmartAccountStatus(params) };
35
+ if (globalFlags.quiet) return;
36
+ const output = yield* outputFormatter.format(data, globalFlags.out);
37
+ yield* Console.log(output);
38
+ });
39
+ const alias = Flag.string("alias").pipe(Flag.withDescription("The alias of the smart account"), Flag.withAlias("a"), Flag.optional);
40
+ /**
41
+ * Command that checks deployment status of a smart account on a chain.
42
+ */
43
+ const getSmartAccountStatus = Command.make("status", {
44
+ alias,
45
+ ...chainAndRpcUrl
46
+ }, ({ alias, chain, rpcUrl }) => handler(alias, chain, rpcUrl)).pipe(Command.withDescription("Get Smart Account Deployment Status for a given chain"), Command.withExamples([
47
+ {
48
+ command: "namera smart-account status -a my-smart --chain eth-mainnet",
49
+ description: "Get Smart Account Deployment Status for a given chain"
50
+ },
51
+ {
52
+ command: "namera smart-account status --alias my-smart --chain eth-mainnet --rpc-url https://rpc.ankr.com/eth",
53
+ description: "Get Smart Account Deployment Status for a given chain with custom RPC URL"
54
+ },
55
+ {
56
+ command: `namera smart-account status --params '{"alias":"my-smart","chain":"eth-mainnet"}'`,
57
+ description: "Get Smart Account Deployment Status for a given chain with json params"
58
+ }
59
+ ]));
60
+ //#endregion
61
+ export { getSmartAccountStatus };
62
+
63
+ //# sourceMappingURL=status.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.mjs","names":["Web3Service.Web3Service","SmartAccountManager.SmartAccountManager","OutputFormatter.OutputFormatter"],"sources":["../../../src/commands/smart-account/status.ts"],"sourcesContent":["import { Console, Effect, type Option, Schema } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\n\nimport { GetSmartAccountStatusParams } from \"@/dto\";\nimport { getGlobalFlags } from \"@/flags/global\";\nimport { chainAndRpcUrl } from \"@/flags/shared\";\nimport { OutputFormatter, SmartAccountManager, Web3Service } from \"@/layers\";\nimport type { SupportedChain } from \"@/schema/chain\";\n\nconst handler = (\n flagAlias: Option.Option<string>,\n flagChain: Option.Option<SupportedChain>,\n flagRpcUrl: Option.Option<string>,\n) =>\n Effect.gen(function* () {\n const web3Service = yield* Web3Service.Web3Service;\n const smartAccountManager = yield* SmartAccountManager.SmartAccountManager;\n const outputFormatter = yield* OutputFormatter.OutputFormatter;\n const globalFlags = yield* getGlobalFlags();\n\n let params: GetSmartAccountStatusParams;\n\n if (globalFlags.params._tag === \"Some\") {\n params = Schema.decodeUnknownSync(\n Schema.fromJsonString(GetSmartAccountStatusParams),\n )(globalFlags.params.value);\n } else {\n let alias: string;\n let chain: SupportedChain;\n const rpcUrl = flagRpcUrl._tag === \"Some\" ? flagRpcUrl.value : undefined;\n\n if (flagAlias._tag === \"Some\") {\n alias = flagAlias.value;\n } else {\n const res = yield* smartAccountManager.selectSmartAccount({\n message: \"Select Smart Account:\",\n });\n alias = res.alias;\n }\n\n if (flagChain._tag === \"Some\") {\n chain = flagChain.value;\n } else {\n chain = yield* web3Service.selectChain({\n message: \"Select Chain:\",\n });\n }\n\n params = { alias, chain, rpcUrl };\n }\n\n const deployed = yield* smartAccountManager.getSmartAccountStatus(params);\n\n const data = { deployed };\n\n if (globalFlags.quiet) return;\n\n const output = yield* outputFormatter.format(data, globalFlags.out);\n yield* Console.log(output);\n });\n\nconst alias = Flag.string(\"alias\").pipe(\n Flag.withDescription(\"The alias of the smart account\"),\n Flag.withAlias(\"a\"),\n Flag.optional,\n);\n\n/**\n * Command that checks deployment status of a smart account on a chain.\n */\nexport const getSmartAccountStatus = Command.make(\n \"status\",\n {\n alias,\n ...chainAndRpcUrl,\n },\n ({ alias, chain, rpcUrl }) => handler(alias, chain, rpcUrl),\n).pipe(\n Command.withDescription(\n \"Get Smart Account Deployment Status for a given chain\",\n ),\n Command.withExamples([\n {\n command: \"namera smart-account status -a my-smart --chain eth-mainnet\",\n description: \"Get Smart Account Deployment Status for a given chain\",\n },\n {\n command:\n \"namera smart-account status --alias my-smart --chain eth-mainnet --rpc-url https://rpc.ankr.com/eth\",\n description:\n \"Get Smart Account Deployment Status for a given chain with custom RPC URL\",\n },\n {\n command: `namera smart-account status --params '{\"alias\":\"my-smart\",\"chain\":\"eth-mainnet\"}'`,\n description:\n \"Get Smart Account Deployment Status for a given chain with json params\",\n },\n ]),\n);\n"],"mappings":";;;;;;;;;;;;AASA,MAAM,WACJ,WACA,WACA,eAEA,OAAO,IAAI,aAAa;CACtB,MAAM,cAAc,OAAOA;CAC3B,MAAM,sBAAsB,OAAOC;CACnC,MAAM,kBAAkB,OAAOC;CAC/B,MAAM,cAAc,OAAO,gBAAgB;CAE3C,IAAI;AAEJ,KAAI,YAAY,OAAO,SAAS,OAC9B,UAAS,OAAO,kBACd,OAAO,eAAe,4BAA4B,CACnD,CAAC,YAAY,OAAO,MAAM;MACtB;EACL,IAAI;EACJ,IAAI;EACJ,MAAM,SAAS,WAAW,SAAS,SAAS,WAAW,QAAQ;AAE/D,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAKlB,UAAQ,OAHW,oBAAoB,mBAAmB,EACxD,SAAS,yBACV,CAAC,EACU;AAGd,MAAI,UAAU,SAAS,OACrB,SAAQ,UAAU;MAElB,SAAQ,OAAO,YAAY,YAAY,EACrC,SAAS,iBACV,CAAC;AAGJ,WAAS;GAAE;GAAO;GAAO;GAAQ;;CAKnC,MAAM,OAAO,EAAE,iBAFS,oBAAoB,sBAAsB,OAAO,EAEhD;AAEzB,KAAI,YAAY,MAAO;CAEvB,MAAM,SAAS,OAAO,gBAAgB,OAAO,MAAM,YAAY,IAAI;AACnE,QAAO,QAAQ,IAAI,OAAO;EAC1B;AAEJ,MAAM,QAAQ,KAAK,OAAO,QAAQ,CAAC,KACjC,KAAK,gBAAgB,iCAAiC,EACtD,KAAK,UAAU,IAAI,EACnB,KAAK,SACN;;;;AAKD,MAAa,wBAAwB,QAAQ,KAC3C,UACA;CACE;CACA,GAAG;CACJ,GACA,EAAE,OAAO,OAAO,aAAa,QAAQ,OAAO,OAAO,OAAO,CAC5D,CAAC,KACA,QAAQ,gBACN,wDACD,EACD,QAAQ,aAAa;CACnB;EACE,SAAS;EACT,aAAa;EACd;CACD;EACE,SACE;EACF,aACE;EACH;CACD;EACE,SAAS;EACT,aACE;EACH;CACF,CAAC,CACH"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import "./keystore.mjs";
3
+ import "./mcp.mjs";
4
+ import "./session-key.mjs";
5
+ import "./smart-account.mjs";
6
+ export {};
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env node
2
+ import { Schema } from "effect";
3
+ //#region src/dto/keystore.ts
4
+ const Keystore = Schema.Struct({
5
+ version: Schema.Number,
6
+ id: Schema.String,
7
+ address: Schema.String,
8
+ crypto: Schema.Any
9
+ });
10
+ Schema.Struct({
11
+ path: Schema.String,
12
+ alias: Schema.String,
13
+ data: Keystore
14
+ });
15
+ const GetKeystoreParams = Schema.Struct({ alias: Schema.String.annotate({ description: "The alias of the wallet to retrieve" }) });
16
+ const ListKeystoreParams = Schema.Void;
17
+ const CreateKeystoreParams = Schema.Struct({
18
+ alias: Schema.String.annotate({ description: "The alias of the wallet to create" }),
19
+ password: Schema.redact(Schema.String).annotate({ description: "The password to encrypt the keystore with" })
20
+ });
21
+ const DecryptKeystoreParams = Schema.Struct({
22
+ alias: Schema.String.annotate({ description: "The alias of the keystore to decrypt" }),
23
+ password: Schema.redact(Schema.String).annotate({ description: "The password to decrypt the keystore with" })
24
+ });
25
+ Schema.Struct({
26
+ address: Schema.String.annotate({ description: "The address of the keystore" }),
27
+ alias: Schema.String.annotate({ description: "The alias of the keystore" }),
28
+ privateKey: Schema.Redacted(Schema.String).annotate({ description: "The private key of the keystore" }),
29
+ publicKey: Schema.String.annotate({ description: "The public key of the keystore" })
30
+ });
31
+ const ImportKeystoreParams = Schema.Struct({
32
+ alias: Schema.String.annotate({ description: "The alias of the keystore to import" }),
33
+ privateKey: Schema.String.annotate({ description: "The private key of the keystore to import" }),
34
+ password: Schema.redact(Schema.String).annotate({ description: "The password to encrypt the keystore with" })
35
+ });
36
+ const RemoveKeystoreParams = Schema.Struct({ alias: Schema.String.annotate({ description: "The alias of the keystore to remove" }) });
37
+ Schema.Struct({
38
+ alias: Schema.String.annotate({ description: "The alias of the keystore to get the signer for" }),
39
+ password: Schema.redact(Schema.String).annotate({ description: "The password to decrypt the keystore with" })
40
+ });
41
+ //#endregion
42
+ export { CreateKeystoreParams, DecryptKeystoreParams, GetKeystoreParams, ImportKeystoreParams, Keystore, ListKeystoreParams, RemoveKeystoreParams };
43
+
44
+ //# sourceMappingURL=keystore.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keystore.mjs","names":[],"sources":["../../src/dto/keystore.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nexport const Keystore = Schema.Struct({\n version: Schema.Number,\n id: Schema.String,\n address: Schema.String,\n crypto: Schema.Any,\n});\n\nexport const KeystoreData = Schema.Struct({\n path: Schema.String,\n alias: Schema.String,\n data: Keystore,\n});\n\nexport const GetKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the wallet to retrieve\",\n }),\n});\n\nexport const ListKeystoreParams = Schema.Void;\n\nexport const CreateKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the wallet to create\",\n }),\n password: Schema.redact(Schema.String).annotate({\n description: \"The password to encrypt the keystore with\",\n }),\n});\n\nexport const DecryptKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the keystore to decrypt\",\n }),\n password: Schema.redact(Schema.String).annotate({\n description: \"The password to decrypt the keystore with\",\n }),\n});\n\nexport const DecryptKeystoreResponse = Schema.Struct({\n address: Schema.String.annotate({\n description: \"The address of the keystore\",\n }),\n alias: Schema.String.annotate({\n description: \"The alias of the keystore\",\n }),\n privateKey: Schema.Redacted(Schema.String).annotate({\n description: \"The private key of the keystore\",\n }),\n publicKey: Schema.String.annotate({\n description: \"The public key of the keystore\",\n }),\n});\n\nexport const ImportKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the keystore to import\",\n }),\n privateKey: Schema.String.annotate({\n description: \"The private key of the keystore to import\",\n }),\n password: Schema.redact(Schema.String).annotate({\n description: \"The password to encrypt the keystore with\",\n }),\n});\n\nexport const RemoveKeystoreParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the keystore to remove\",\n }),\n});\n\nexport const GetSignerParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the keystore to get the signer for\",\n }),\n password: Schema.redact(Schema.String).annotate({\n description: \"The password to decrypt the keystore with\",\n }),\n});\n\nexport type Keystore = typeof Keystore.Type;\nexport type KeystoreData = typeof KeystoreData.Type;\nexport type GetKeystoreParams = typeof GetKeystoreParams.Type;\nexport type ListKeystoreParams = typeof ListKeystoreParams.Type;\nexport type CreateKeystoreParams = typeof CreateKeystoreParams.Type;\nexport type DecryptKeystoreParams = typeof DecryptKeystoreParams.Type;\nexport type DecryptKeystoreResponse = typeof DecryptKeystoreResponse.Type;\nexport type ImportKeystoreParams = typeof ImportKeystoreParams.Type;\nexport type RemoveKeystoreParams = typeof RemoveKeystoreParams.Type;\nexport type GetSignerParams = typeof GetSignerParams.Type;\n"],"mappings":";;;AAEA,MAAa,WAAW,OAAO,OAAO;CACpC,SAAS,OAAO;CAChB,IAAI,OAAO;CACX,SAAS,OAAO;CAChB,QAAQ,OAAO;CAChB,CAAC;AAE0B,OAAO,OAAO;CACxC,MAAM,OAAO;CACb,OAAO,OAAO;CACd,MAAM;CACP,CAAC;AAEF,MAAa,oBAAoB,OAAO,OAAO,EAC7C,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,uCACd,CAAC,EACH,CAAC;AAEF,MAAa,qBAAqB,OAAO;AAEzC,MAAa,uBAAuB,OAAO,OAAO;CAChD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,qCACd,CAAC;CACF,UAAU,OAAO,OAAO,OAAO,OAAO,CAAC,SAAS,EAC9C,aAAa,6CACd,CAAC;CACH,CAAC;AAEF,MAAa,wBAAwB,OAAO,OAAO;CACjD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,wCACd,CAAC;CACF,UAAU,OAAO,OAAO,OAAO,OAAO,CAAC,SAAS,EAC9C,aAAa,6CACd,CAAC;CACH,CAAC;AAEqC,OAAO,OAAO;CACnD,SAAS,OAAO,OAAO,SAAS,EAC9B,aAAa,+BACd,CAAC;CACF,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,6BACd,CAAC;CACF,YAAY,OAAO,SAAS,OAAO,OAAO,CAAC,SAAS,EAClD,aAAa,mCACd,CAAC;CACF,WAAW,OAAO,OAAO,SAAS,EAChC,aAAa,kCACd,CAAC;CACH,CAAC;AAEF,MAAa,uBAAuB,OAAO,OAAO;CAChD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,uCACd,CAAC;CACF,YAAY,OAAO,OAAO,SAAS,EACjC,aAAa,6CACd,CAAC;CACF,UAAU,OAAO,OAAO,OAAO,OAAO,CAAC,SAAS,EAC9C,aAAa,6CACd,CAAC;CACH,CAAC;AAEF,MAAa,uBAAuB,OAAO,OAAO,EAChD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,uCACd,CAAC,EACH,CAAC;AAE6B,OAAO,OAAO;CAC3C,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,mDACd,CAAC;CACF,UAAU,OAAO,OAAO,OAAO,OAAO,CAAC,SAAS,EAC9C,aAAa,6CACd,CAAC;CACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import { Schema } from "effect";
3
+ //#region src/dto/mcp.ts
4
+ const StartMcpServerParams = Schema.Struct({
5
+ smartAccountAlias: Schema.String.annotate({ description: "The alias of the smart account to use for the MCP server" }),
6
+ transport: Schema.Literals(["http", "stdio"]).annotate({ description: "The transport to use for the MCP server" }),
7
+ port: Schema.optional(Schema.Int.check(Schema.makeFilter((v) => v > 0 && v < 65536))).annotate({ description: "The port to use for the MCP server when using http transport" }),
8
+ sessionKeys: Schema.mutableKey(Schema.Record(Schema.String, Schema.String))
9
+ });
10
+ //#endregion
11
+ export { StartMcpServerParams };
12
+
13
+ //# sourceMappingURL=mcp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.mjs","names":[],"sources":["../../src/dto/mcp.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nexport const StartMcpServerParams = Schema.Struct({\n smartAccountAlias: Schema.String.annotate({\n description: \"The alias of the smart account to use for the MCP server\",\n }),\n transport: Schema.Literals([\"http\", \"stdio\"]).annotate({\n description: \"The transport to use for the MCP server\",\n }),\n port: Schema.optional(\n Schema.Int.check(Schema.makeFilter((v) => v > 0 && v < 65_536)),\n ).annotate({\n description: \"The port to use for the MCP server when using http transport\",\n }),\n sessionKeys: Schema.mutableKey(Schema.Record(Schema.String, Schema.String)),\n});\n\nexport type StartMcpServerParams = typeof StartMcpServerParams.Type;\n"],"mappings":";;;AAEA,MAAa,uBAAuB,OAAO,OAAO;CAChD,mBAAmB,OAAO,OAAO,SAAS,EACxC,aAAa,4DACd,CAAC;CACF,WAAW,OAAO,SAAS,CAAC,QAAQ,QAAQ,CAAC,CAAC,SAAS,EACrD,aAAa,2CACd,CAAC;CACF,MAAM,OAAO,SACX,OAAO,IAAI,MAAM,OAAO,YAAY,MAAM,IAAI,KAAK,IAAI,MAAO,CAAC,CAChE,CAAC,SAAS,EACT,aAAa,gEACd,CAAC;CACF,aAAa,OAAO,WAAW,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,CAAC;CAC5E,CAAC"}
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ import { Keystore } from "./keystore.mjs";
3
+ import { SupportedChain } from "../schema/chain.mjs";
4
+ import { EthereumAddress } from "../schema/common.mjs";
5
+ import { PolicyParams } from "../schema/policy.mjs";
6
+ import "../schema/index.mjs";
7
+ import { Schema, Struct } from "effect";
8
+ //#region src/dto/session-key.ts
9
+ const BaseSessionKey = Schema.Struct({
10
+ smartAccountAlias: Schema.String,
11
+ serializedAccounts: Schema.Array(Schema.Struct({
12
+ chain: SupportedChain,
13
+ serializedAccount: Schema.String
14
+ }))
15
+ }).mapFields(Struct.assign(Keystore.fields));
16
+ const EcdsaSessionKey = Schema.Struct({
17
+ sessionKeyType: Schema.Literal("ecdsa"),
18
+ sessionKeyAddress: EthereumAddress,
19
+ smartAccountAlias: Schema.String
20
+ }).mapFields(Struct.assign(BaseSessionKey.fields));
21
+ const PasskeySessionKey = Schema.Struct({
22
+ sessionKeyType: Schema.Literal("passkey"),
23
+ passKeyName: Schema.String
24
+ }).mapFields(Struct.assign(BaseSessionKey.fields));
25
+ const SessionKey = Schema.Union([EcdsaSessionKey, PasskeySessionKey]);
26
+ Schema.Struct({
27
+ alias: Schema.String,
28
+ data: SessionKey,
29
+ path: Schema.String
30
+ });
31
+ const CreateSessionKeyParams = Schema.Struct({
32
+ alias: Schema.String.annotate({ description: "The alias of the session key to create" }),
33
+ chains: Schema.mutable(Schema.Array(SupportedChain)).annotate({ description: "The chains to create the session key for" }),
34
+ policyParams: Schema.mutable(Schema.Array(PolicyParams)),
35
+ smartAccountAlias: Schema.String.annotate({ description: "The alias of the smart account to create the session key for" }),
36
+ ownerKeystorePassword: Schema.redact(Schema.String).annotate({ description: "The password to decrypt the owner keystore with" }),
37
+ sessionKeyPassword: Schema.redact(Schema.String).annotate({ description: "The password to encrypt the session key with" })
38
+ });
39
+ Schema.Struct({ alias: Schema.String.annotate({ description: "The alias of the session key to retrieve" }) });
40
+ const ListSessionKeysParams = Schema.Struct({ smartAccount: Schema.optional(Schema.String).annotate({ description: "The alias of the smart account to list session keys for" }) });
41
+ const GetSessionKeyInfoParams = Schema.Struct({ alias: Schema.String.annotate({ description: "The alias of the session key to retrieve" }) });
42
+ const GetSessionKeyStatusParams = Schema.Struct({
43
+ alias: Schema.String.annotate({ description: "The alias of the session key to retrieve" }),
44
+ chain: SupportedChain.annotate({ description: "The chain to retrieve the session key status for" }),
45
+ rpcUrl: Schema.redact(Schema.String.pipe(Schema.optional)).annotate({
46
+ description: "The RPC URL to use for the chain",
47
+ default: "Public RPC URL"
48
+ })
49
+ });
50
+ const RemoveSessionKeyParams = Schema.Struct({ alias: Schema.String.annotate({ description: "The alias of the session key to remove" }) });
51
+ //#endregion
52
+ export { CreateSessionKeyParams, GetSessionKeyInfoParams, GetSessionKeyStatusParams, ListSessionKeysParams, RemoveSessionKeyParams, SessionKey };
53
+
54
+ //# sourceMappingURL=session-key.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-key.mjs","names":[],"sources":["../../src/dto/session-key.ts"],"sourcesContent":["import { Schema, Struct } from \"effect\";\n\nimport { EthereumAddress, PolicyParams, SupportedChain } from \"@/schema\";\n\nimport { Keystore } from \"./keystore\";\n\nconst BaseSessionKey = Schema.Struct({\n smartAccountAlias: Schema.String,\n serializedAccounts: Schema.Array(\n Schema.Struct({\n chain: SupportedChain,\n serializedAccount: Schema.String,\n }),\n ),\n}).mapFields(Struct.assign(Keystore.fields));\n\nconst EcdsaSessionKey = Schema.Struct({\n sessionKeyType: Schema.Literal(\"ecdsa\"),\n sessionKeyAddress: EthereumAddress,\n smartAccountAlias: Schema.String,\n}).mapFields(Struct.assign(BaseSessionKey.fields));\n\nconst PasskeySessionKey = Schema.Struct({\n sessionKeyType: Schema.Literal(\"passkey\"),\n passKeyName: Schema.String,\n}).mapFields(Struct.assign(BaseSessionKey.fields));\n\nexport const SessionKey = Schema.Union([EcdsaSessionKey, PasskeySessionKey]);\n\nexport const SessionKeyData = Schema.Struct({\n alias: Schema.String,\n data: SessionKey,\n path: Schema.String,\n});\n\nexport const CreateSessionKeyParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to create\",\n }),\n chains: Schema.mutable(Schema.Array(SupportedChain)).annotate({\n description: \"The chains to create the session key for\",\n }),\n policyParams: Schema.mutable(Schema.Array(PolicyParams)),\n smartAccountAlias: Schema.String.annotate({\n description: \"The alias of the smart account to create the session key for\",\n }),\n ownerKeystorePassword: Schema.redact(Schema.String).annotate({\n description: \"The password to decrypt the owner keystore with\",\n }),\n sessionKeyPassword: Schema.redact(Schema.String).annotate({\n description: \"The password to encrypt the session key with\",\n }),\n});\n\nexport const GetSessionKeyParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to retrieve\",\n }),\n});\n\nexport const ListSessionKeysParams = Schema.Struct({\n smartAccount: Schema.optional(Schema.String).annotate({\n description: \"The alias of the smart account to list session keys for\",\n }),\n});\n\nexport const GetSessionKeyInfoParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to retrieve\",\n }),\n});\n\nexport const GetSessionKeyStatusParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to retrieve\",\n }),\n chain: SupportedChain.annotate({\n description: \"The chain to retrieve the session key status for\",\n }),\n rpcUrl: Schema.redact(Schema.String.pipe(Schema.optional)).annotate({\n description: \"The RPC URL to use for the chain\",\n default: \"Public RPC URL\",\n }),\n});\n\nexport const RemoveSessionKeyParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the session key to remove\",\n }),\n});\n\nexport type SessionKey = typeof SessionKey.Type;\nexport type SessionKeyData = typeof SessionKeyData.Type;\nexport type CreateSessionKeyParams = typeof CreateSessionKeyParams.Type;\nexport type GetSessionKeyParams = typeof GetSessionKeyParams.Type;\nexport type ListSessionKeysParams = typeof ListSessionKeysParams.Type;\nexport type GetSessionKeyInfoParams = typeof GetSessionKeyInfoParams.Type;\nexport type GetSessionKeyStatusParams = typeof GetSessionKeyStatusParams.Type;\nexport type RemoveSessionKeyParams = typeof RemoveSessionKeyParams.Type;\n"],"mappings":";;;;;;;;AAMA,MAAM,iBAAiB,OAAO,OAAO;CACnC,mBAAmB,OAAO;CAC1B,oBAAoB,OAAO,MACzB,OAAO,OAAO;EACZ,OAAO;EACP,mBAAmB,OAAO;EAC3B,CAAC,CACH;CACF,CAAC,CAAC,UAAU,OAAO,OAAO,SAAS,OAAO,CAAC;AAE5C,MAAM,kBAAkB,OAAO,OAAO;CACpC,gBAAgB,OAAO,QAAQ,QAAQ;CACvC,mBAAmB;CACnB,mBAAmB,OAAO;CAC3B,CAAC,CAAC,UAAU,OAAO,OAAO,eAAe,OAAO,CAAC;AAElD,MAAM,oBAAoB,OAAO,OAAO;CACtC,gBAAgB,OAAO,QAAQ,UAAU;CACzC,aAAa,OAAO;CACrB,CAAC,CAAC,UAAU,OAAO,OAAO,eAAe,OAAO,CAAC;AAElD,MAAa,aAAa,OAAO,MAAM,CAAC,iBAAiB,kBAAkB,CAAC;AAE9C,OAAO,OAAO;CAC1C,OAAO,OAAO;CACd,MAAM;CACN,MAAM,OAAO;CACd,CAAC;AAEF,MAAa,yBAAyB,OAAO,OAAO;CAClD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,0CACd,CAAC;CACF,QAAQ,OAAO,QAAQ,OAAO,MAAM,eAAe,CAAC,CAAC,SAAS,EAC5D,aAAa,4CACd,CAAC;CACF,cAAc,OAAO,QAAQ,OAAO,MAAM,aAAa,CAAC;CACxD,mBAAmB,OAAO,OAAO,SAAS,EACxC,aAAa,gEACd,CAAC;CACF,uBAAuB,OAAO,OAAO,OAAO,OAAO,CAAC,SAAS,EAC3D,aAAa,mDACd,CAAC;CACF,oBAAoB,OAAO,OAAO,OAAO,OAAO,CAAC,SAAS,EACxD,aAAa,gDACd,CAAC;CACH,CAAC;AAEiC,OAAO,OAAO,EAC/C,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,4CACd,CAAC,EACH,CAAC;AAEF,MAAa,wBAAwB,OAAO,OAAO,EACjD,cAAc,OAAO,SAAS,OAAO,OAAO,CAAC,SAAS,EACpD,aAAa,2DACd,CAAC,EACH,CAAC;AAEF,MAAa,0BAA0B,OAAO,OAAO,EACnD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,4CACd,CAAC,EACH,CAAC;AAEF,MAAa,4BAA4B,OAAO,OAAO;CACrD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,4CACd,CAAC;CACF,OAAO,eAAe,SAAS,EAC7B,aAAa,oDACd,CAAC;CACF,QAAQ,OAAO,OAAO,OAAO,OAAO,KAAK,OAAO,SAAS,CAAC,CAAC,SAAS;EAClE,aAAa;EACb,SAAS;EACV,CAAC;CACH,CAAC;AAEF,MAAa,yBAAyB,OAAO,OAAO,EAClD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,0CACd,CAAC,EACH,CAAC"}
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+ import { SupportedChain } from "../schema/chain.mjs";
3
+ import { EntrypointVersion, EthereumAddress, KernelVersion, OwnerType } from "../schema/common.mjs";
4
+ import "../schema/index.mjs";
5
+ import { Schema } from "effect";
6
+ //#region src/dto/smart-account.ts
7
+ const LocalSmartAccount = Schema.Struct({
8
+ entryPointVersion: EntrypointVersion,
9
+ index: Schema.BigIntFromString,
10
+ kernelVersion: KernelVersion,
11
+ ownerAlias: Schema.String,
12
+ ownerType: OwnerType,
13
+ smartAccountAddress: EthereumAddress
14
+ });
15
+ Schema.Struct({
16
+ data: LocalSmartAccount,
17
+ path: Schema.String,
18
+ alias: Schema.String
19
+ });
20
+ const CreateSmartAccountParams = Schema.Struct({
21
+ alias: Schema.String.annotate({ description: "The alias of the smart account to create" }),
22
+ ownerAlias: Schema.String.annotate({ description: "The alias of the owner keystore" }),
23
+ ownerPassword: Schema.redact(Schema.String).annotate({ description: "The password of the owner keystore" }),
24
+ index: Schema.optional(Schema.BigIntFromString.check(Schema.makeFilter((v) => v >= 0n))).annotate({
25
+ description: "The index of the smart account",
26
+ default: 0n
27
+ })
28
+ });
29
+ Schema.Struct({ alias: Schema.String.annotate({ description: "The alias of the smart account to retrieve" }) });
30
+ const ListSmartAccountParams = Schema.Void;
31
+ const GetSmartAccountInfoParams = Schema.Struct({ alias: Schema.String.annotate({ description: "The alias of the smart account to retrieve" }) });
32
+ const RemoveSmartAccountParams = Schema.Struct({ alias: Schema.String.annotate({ description: "The alias of the smart account to remove" }) });
33
+ const GetSmartAccountStatusParams = Schema.Struct({
34
+ alias: Schema.String.annotate({ description: "The alias of the smart account" }),
35
+ chain: SupportedChain.annotate({ description: "The chain to get the status for" }),
36
+ rpcUrl: Schema.redact(Schema.String.pipe(Schema.optional)).annotate({
37
+ description: "The RPC URL to use for the chain",
38
+ default: "Public RPC URL"
39
+ })
40
+ });
41
+ const ImportSmartAccountParams = LocalSmartAccount.pipe(Schema.fieldsAssign({ alias: Schema.String.annotate({ description: "The alias of the smart account to import" }) }));
42
+ //#endregion
43
+ export { CreateSmartAccountParams, GetSmartAccountInfoParams, GetSmartAccountStatusParams, ImportSmartAccountParams, ListSmartAccountParams, LocalSmartAccount, RemoveSmartAccountParams };
44
+
45
+ //# sourceMappingURL=smart-account.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-account.mjs","names":[],"sources":["../../src/dto/smart-account.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nimport {\n EntrypointVersion,\n EthereumAddress,\n KernelVersion,\n OwnerType,\n} from \"@/schema\";\nimport { SupportedChain } from \"@/schema/chain\";\n\nexport const LocalSmartAccount = Schema.Struct({\n entryPointVersion: EntrypointVersion,\n index: Schema.BigIntFromString,\n kernelVersion: KernelVersion,\n ownerAlias: Schema.String,\n ownerType: OwnerType,\n smartAccountAddress: EthereumAddress,\n});\n\nexport const LocalSmartAccountData = Schema.Struct({\n data: LocalSmartAccount,\n path: Schema.String,\n alias: Schema.String,\n});\n\nexport const CreateSmartAccountParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to create\",\n }),\n ownerAlias: Schema.String.annotate({\n description: \"The alias of the owner keystore\",\n }),\n ownerPassword: Schema.redact(Schema.String).annotate({\n description: \"The password of the owner keystore\",\n }),\n index: Schema.optional(\n Schema.BigIntFromString.check(Schema.makeFilter((v) => v >= 0n)),\n ).annotate({\n description: \"The index of the smart account\",\n default: 0n,\n }),\n});\n\nexport const GetSmartAccountParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to retrieve\",\n }),\n});\nexport const ListSmartAccountParams = Schema.Void;\n\nexport const GetSmartAccountInfoParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to retrieve\",\n }),\n});\n\nexport const RemoveSmartAccountParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to remove\",\n }),\n});\n\nexport const GetSmartAccountStatusParams = Schema.Struct({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account\",\n }),\n chain: SupportedChain.annotate({\n description: \"The chain to get the status for\",\n }),\n rpcUrl: Schema.redact(Schema.String.pipe(Schema.optional)).annotate({\n description: \"The RPC URL to use for the chain\",\n default: \"Public RPC URL\",\n }),\n});\n\nexport const ImportSmartAccountParams = LocalSmartAccount.pipe(\n Schema.fieldsAssign({\n alias: Schema.String.annotate({\n description: \"The alias of the smart account to import\",\n }),\n }),\n);\n\nexport type LocalSmartAccount = typeof LocalSmartAccount.Type;\nexport type LocalSmartAccountData = typeof LocalSmartAccountData.Type;\nexport type CreateSmartAccountParams = typeof CreateSmartAccountParams.Type;\nexport type GetSmartAccountParams = typeof GetSmartAccountParams.Type;\nexport type ListSmartAccountParams = typeof ListSmartAccountParams.Type;\nexport type GetSmartAccountInfoParams = typeof GetSmartAccountInfoParams.Type;\nexport type RemoveSmartAccountParams = typeof RemoveSmartAccountParams.Type;\nexport type GetSmartAccountStatusParams =\n typeof GetSmartAccountStatusParams.Type;\n\nexport type ImportSmartAccountParams = typeof ImportSmartAccountParams.Type;\n"],"mappings":";;;;;;AAUA,MAAa,oBAAoB,OAAO,OAAO;CAC7C,mBAAmB;CACnB,OAAO,OAAO;CACd,eAAe;CACf,YAAY,OAAO;CACnB,WAAW;CACX,qBAAqB;CACtB,CAAC;AAEmC,OAAO,OAAO;CACjD,MAAM;CACN,MAAM,OAAO;CACb,OAAO,OAAO;CACf,CAAC;AAEF,MAAa,2BAA2B,OAAO,OAAO;CACpD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,4CACd,CAAC;CACF,YAAY,OAAO,OAAO,SAAS,EACjC,aAAa,mCACd,CAAC;CACF,eAAe,OAAO,OAAO,OAAO,OAAO,CAAC,SAAS,EACnD,aAAa,sCACd,CAAC;CACF,OAAO,OAAO,SACZ,OAAO,iBAAiB,MAAM,OAAO,YAAY,MAAM,KAAK,GAAG,CAAC,CACjE,CAAC,SAAS;EACT,aAAa;EACb,SAAS;EACV,CAAC;CACH,CAAC;AAEmC,OAAO,OAAO,EACjD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,8CACd,CAAC,EACH,CAAC;AACF,MAAa,yBAAyB,OAAO;AAE7C,MAAa,4BAA4B,OAAO,OAAO,EACrD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,8CACd,CAAC,EACH,CAAC;AAEF,MAAa,2BAA2B,OAAO,OAAO,EACpD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,4CACd,CAAC,EACH,CAAC;AAEF,MAAa,8BAA8B,OAAO,OAAO;CACvD,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,kCACd,CAAC;CACF,OAAO,eAAe,SAAS,EAC7B,aAAa,mCACd,CAAC;CACF,QAAQ,OAAO,OAAO,OAAO,OAAO,KAAK,OAAO,SAAS,CAAC,CAAC,SAAS;EAClE,aAAa;EACb,SAAS;EACV,CAAC;CACH,CAAC;AAEF,MAAa,2BAA2B,kBAAkB,KACxD,OAAO,aAAa,EAClB,OAAO,OAAO,OAAO,SAAS,EAC5B,aAAa,4CACd,CAAC,EACH,CAAC,CACH"}
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ import { Effect } from "effect";
3
+ import { Flag, GlobalFlag } from "effect/unstable/cli";
4
+ //#region src/flags/global.ts
5
+ const globalOutput = GlobalFlag.setting("output")({ flag: Flag.choice("output", [
6
+ "pretty",
7
+ "json",
8
+ "ndjson"
9
+ ]).pipe(Flag.withAlias("o"), Flag.withDefault("pretty"), Flag.withDescription("Output format (pretty, json, ndjson)")) });
10
+ const globalQuiet = GlobalFlag.setting("quiet")({ flag: Flag.boolean("quiet").pipe(Flag.withAlias("q"), Flag.withDefault(false), Flag.withDescription("Do not print output")) });
11
+ const globalParams = GlobalFlag.setting("params")({ flag: Flag.string("params").pipe(Flag.optional, Flag.withDescription("JSON Parameters to pass to the command")) });
12
+ const getGlobalFlags = () => Effect.gen(function* () {
13
+ const out = yield* globalOutput;
14
+ const quiet = yield* globalQuiet;
15
+ return {
16
+ out,
17
+ params: yield* globalParams,
18
+ quiet
19
+ };
20
+ });
21
+ const globalFlags = [
22
+ globalOutput,
23
+ globalQuiet,
24
+ globalParams
25
+ ];
26
+ //#endregion
27
+ export { getGlobalFlags, globalFlags };
28
+
29
+ //# sourceMappingURL=global.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.mjs","names":[],"sources":["../../src/flags/global.ts"],"sourcesContent":["import { Effect } from \"effect\";\nimport { Flag, GlobalFlag } from \"effect/unstable/cli\";\n\nexport const globalOutput = GlobalFlag.setting(\"output\")({\n flag: Flag.choice(\"output\", [\"pretty\", \"json\", \"ndjson\"]).pipe(\n Flag.withAlias(\"o\"),\n Flag.withDefault(\"pretty\"),\n Flag.withDescription(\"Output format (pretty, json, ndjson)\"),\n ),\n});\n\nexport const globalQuiet = GlobalFlag.setting(\"quiet\")({\n flag: Flag.boolean(\"quiet\").pipe(\n Flag.withAlias(\"q\"),\n Flag.withDefault(false),\n Flag.withDescription(\"Do not print output\"),\n ),\n});\n\nexport const globalParams = GlobalFlag.setting(\"params\")({\n flag: Flag.string(\"params\").pipe(\n Flag.optional,\n Flag.withDescription(\"JSON Parameters to pass to the command\"),\n ),\n});\n\nexport const getGlobalFlags = () =>\n Effect.gen(function* () {\n const out = yield* globalOutput;\n const quiet = yield* globalQuiet;\n const params = yield* globalParams;\n\n return { out, params, quiet };\n });\n\nexport const globalFlags = [globalOutput, globalQuiet, globalParams];\n"],"mappings":";;;;AAGA,MAAa,eAAe,WAAW,QAAQ,SAAS,CAAC,EACvD,MAAM,KAAK,OAAO,UAAU;CAAC;CAAU;CAAQ;CAAS,CAAC,CAAC,KACxD,KAAK,UAAU,IAAI,EACnB,KAAK,YAAY,SAAS,EAC1B,KAAK,gBAAgB,uCAAuC,CAC7D,EACF,CAAC;AAEF,MAAa,cAAc,WAAW,QAAQ,QAAQ,CAAC,EACrD,MAAM,KAAK,QAAQ,QAAQ,CAAC,KAC1B,KAAK,UAAU,IAAI,EACnB,KAAK,YAAY,MAAM,EACvB,KAAK,gBAAgB,sBAAsB,CAC5C,EACF,CAAC;AAEF,MAAa,eAAe,WAAW,QAAQ,SAAS,CAAC,EACvD,MAAM,KAAK,OAAO,SAAS,CAAC,KAC1B,KAAK,UACL,KAAK,gBAAgB,yCAAyC,CAC/D,EACF,CAAC;AAEF,MAAa,uBACX,OAAO,IAAI,aAAa;CACtB,MAAM,MAAM,OAAO;CACnB,MAAM,QAAQ,OAAO;AAGrB,QAAO;EAAE;EAAK,eAFQ;EAEA;EAAO;EAC7B;AAEJ,MAAa,cAAc;CAAC;CAAc;CAAa;CAAa"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import { supportedChains } from "../schema/chain.mjs";
3
+ import { Flag } from "effect/unstable/cli";
4
+ const chainAndRpcUrl = {
5
+ chain: Flag.choice("chain", Object.keys(supportedChains)).pipe(Flag.withDescription("Chain Name"), Flag.optional),
6
+ rpcUrl: Flag.string("rpc-url").pipe(Flag.withDescription("RPC URL"), Flag.optional)
7
+ };
8
+ //#endregion
9
+ export { chainAndRpcUrl };
10
+
11
+ //# sourceMappingURL=shared.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.mjs","names":[],"sources":["../../src/flags/shared.ts"],"sourcesContent":["import { Flag } from \"effect/unstable/cli\";\n\nimport { type SupportedChain, supportedChains } from \"@/schema/chain\";\n\nconst chain = Flag.choice(\n \"chain\",\n Object.keys(supportedChains) as SupportedChain[],\n).pipe(Flag.withDescription(\"Chain Name\"), Flag.optional);\n\nconst rpcUrl = Flag.string(\"rpc-url\").pipe(\n Flag.withDescription(\"RPC URL\"),\n Flag.optional,\n);\n\nexport const chainAndRpcUrl = { chain, rpcUrl };\n"],"mappings":";;;AAcA,MAAa,iBAAiB;CAAE,OAVlB,KAAK,OACjB,SACA,OAAO,KAAK,gBAAgB,CAC7B,CAAC,KAAK,KAAK,gBAAgB,aAAa,EAAE,KAAK,SAOhB;CAAO,QALxB,KAAK,OAAO,UAAU,CAAC,KACpC,KAAK,gBAAgB,UAAU,EAC/B,KAAK,SAGgC;CAAQ"}
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env node
2
+ import { Duration } from "effect";
3
+ import { formatEther, zeroAddress } from "viem";
4
+ import { deserializePermissionAccountParams } from "@namera-ai/sdk/session-key";
5
+ //#region src/helpers/humanize.ts
6
+ const humanizeDuration = (input) => {
7
+ const millis = Duration.toMillis(Duration.fromInputUnsafe(input));
8
+ let seconds = Math.floor(millis / 1e3);
9
+ const units = [
10
+ {
11
+ label: "year",
12
+ value: 3600 * 24 * 365
13
+ },
14
+ {
15
+ label: "month",
16
+ value: 3600 * 24 * 30
17
+ },
18
+ {
19
+ label: "day",
20
+ value: 3600 * 24
21
+ },
22
+ {
23
+ label: "hour",
24
+ value: 3600
25
+ },
26
+ {
27
+ label: "minute",
28
+ value: 60
29
+ },
30
+ {
31
+ label: "second",
32
+ value: 1
33
+ }
34
+ ];
35
+ const parts = [];
36
+ for (const unit of units) if (seconds >= unit.value) {
37
+ const count = Math.floor(seconds / unit.value);
38
+ seconds %= unit.value;
39
+ parts.push(`${count} ${unit.label}${count > 1 ? "s" : ""}`);
40
+ }
41
+ return parts.length > 0 ? parts.join(" ") : "0 seconds";
42
+ };
43
+ const humanizeRelativeTime = (target) => {
44
+ const now = Date.now();
45
+ const diff = (target instanceof Date ? target.getTime() : target * 1e3) - now;
46
+ const seconds = Math.floor(Math.abs(diff) / 1e3);
47
+ for (const unit of [
48
+ {
49
+ label: "year",
50
+ value: 31536e3
51
+ },
52
+ {
53
+ label: "month",
54
+ value: 2592e3
55
+ },
56
+ {
57
+ label: "day",
58
+ value: 86400
59
+ },
60
+ {
61
+ label: "hour",
62
+ value: 3600
63
+ },
64
+ {
65
+ label: "minute",
66
+ value: 60
67
+ },
68
+ {
69
+ label: "second",
70
+ value: 1
71
+ }
72
+ ]) if (seconds >= unit.value) {
73
+ const count = Math.floor(seconds / unit.value);
74
+ const formatted = `${count} ${unit.label}${count > 1 ? "s" : ""}`;
75
+ return diff > 0 ? `in ${formatted}` : `${formatted} ago`;
76
+ }
77
+ return "just now";
78
+ };
79
+ const humanizePolicyParams = (serializedAccount) => {
80
+ const params = deserializePermissionAccountParams(serializedAccount);
81
+ const result = {};
82
+ result.permissionId = params.permissionParams.permissionId;
83
+ for (const policy of params.permissionParams.policies ?? []) {
84
+ const params = policy.policyParams;
85
+ if (params.type === "sudo") result.sudoPolicy = { enabled: true };
86
+ else if (params.type === "gas") result.gasPolicy = {
87
+ enabled: true,
88
+ allowed: `${formatEther(params.allowed ?? 0n)} ETH`,
89
+ ...params.enforcePaymaster && { enforcePaymaster: params.enforcePaymaster },
90
+ ...params.allowedPaymaster !== zeroAddress && { allowedPaymaster: params.allowedPaymaster }
91
+ };
92
+ else if (params.type === "timestamp") {
93
+ const validAfter = params.validAfter ?? 0;
94
+ const validUntil = params.validUntil ?? 0;
95
+ result.timestampPolicy = {
96
+ enabled: true,
97
+ starts: humanizeRelativeTime(validAfter),
98
+ ends: humanizeRelativeTime(validUntil)
99
+ };
100
+ } else if (params.type === "rate-limit") {
101
+ const formattedInterval = humanizeDuration(params.interval ?? 0);
102
+ result.rateLimitPolicy = {
103
+ enabled: true,
104
+ count: params.count,
105
+ interval: formattedInterval,
106
+ starts: humanizeRelativeTime(params.startAt ?? 0)
107
+ };
108
+ } else if (params.type === "signature-caller") result.signatureCallerPolicy = {
109
+ enabled: true,
110
+ allowedCallers: params.allowedCallers
111
+ };
112
+ else if (params.type === "call") {
113
+ result.callPolicy = {
114
+ enabled: true,
115
+ policyVersion: params.policyVersion
116
+ };
117
+ if (!params.permissions || params.permissions.length === 0) continue;
118
+ for (const permission of params.permissions) {
119
+ result.callPolicy.permissions = result.callPolicy.permissions ?? [];
120
+ if ("abi" in permission) {
121
+ const formattedValue = formatEther(permission.valueLimit ?? 0n);
122
+ const abiFn = permission.abi?.find((f) => f.type === "function" && f.name === permission.functionName);
123
+ const cyan = "\x1B[36m";
124
+ const yellow = "\x1B[33m";
125
+ const magenta = "\x1B[35m";
126
+ const reset = "\x1B[0m";
127
+ let fnName = `${magenta}${permission.functionName ?? "unknown"}${reset}(`;
128
+ if (abiFn) abiFn.inputs.forEach((input, i) => {
129
+ if (i > 0) fnName += ", ";
130
+ fnName += `${cyan}${input.type}${reset}${input.name ? ` ${yellow}${input.name}${reset}` : ""}`;
131
+ });
132
+ fnName += ")";
133
+ result.callPolicy.permissions.push({
134
+ targetAddress: permission.target,
135
+ valueLimit: `${formattedValue} ETH`,
136
+ functionName: fnName
137
+ });
138
+ } else {
139
+ const formattedValue = formatEther(permission.valueLimit ?? 0n);
140
+ result.callPolicy.permissions.push({
141
+ targetAddress: permission.target,
142
+ valueLimit: `${formattedValue} ETH`
143
+ });
144
+ }
145
+ }
146
+ }
147
+ }
148
+ return result;
149
+ };
150
+ //#endregion
151
+ export { humanizePolicyParams };
152
+
153
+ //# sourceMappingURL=humanize.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanize.mjs","names":[],"sources":["../../src/helpers/humanize.ts"],"sourcesContent":["import { deserializePermissionAccountParams } from \"@namera-ai/sdk/session-key\";\nimport { Duration } from \"effect\";\nimport { type AbiFunction, formatEther, zeroAddress } from \"viem\";\n\nexport const humanizeDuration = (input: Duration.Input): string => {\n const millis = Duration.toMillis(Duration.fromInputUnsafe(input));\n let seconds = Math.floor(millis / 1000);\n\n const units = [\n { label: \"year\", value: 60 * 60 * 24 * 365 },\n { label: \"month\", value: 60 * 60 * 24 * 30 },\n { label: \"day\", value: 60 * 60 * 24 },\n { label: \"hour\", value: 60 * 60 },\n { label: \"minute\", value: 60 },\n { label: \"second\", value: 1 },\n ];\n\n const parts: string[] = [];\n\n for (const unit of units) {\n if (seconds >= unit.value) {\n const count = Math.floor(seconds / unit.value);\n seconds %= unit.value;\n\n parts.push(`${count} ${unit.label}${count > 1 ? \"s\" : \"\"}`);\n }\n }\n\n return parts.length > 0 ? parts.join(\" \") : \"0 seconds\";\n};\n\nexport const humanizeRelativeTime = (target: Date | number): string => {\n const now = Date.now();\n const targetMs = target instanceof Date ? target.getTime() : target * 1000;\n\n const diff = targetMs - now;\n const abs = Math.abs(diff);\n\n const seconds = Math.floor(abs / 1000);\n\n const units = [\n { label: \"year\", value: 31_536_000 },\n { label: \"month\", value: 2_592_000 },\n { label: \"day\", value: 86_400 },\n { label: \"hour\", value: 3600 },\n { label: \"minute\", value: 60 },\n { label: \"second\", value: 1 },\n ];\n\n for (const unit of units) {\n if (seconds >= unit.value) {\n const count = Math.floor(seconds / unit.value);\n\n const formatted = `${count} ${unit.label}${count > 1 ? \"s\" : \"\"}`;\n\n return diff > 0 ? `in ${formatted}` : `${formatted} ago`;\n }\n }\n\n return \"just now\";\n};\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: safe\nexport const humanizePolicyParams = (serializedAccount: string) => {\n const params = deserializePermissionAccountParams(serializedAccount);\n\n // biome-ignore lint/suspicious/noExplicitAny: safe\n const result: Record<string, any> = {};\n\n // Permission Id\n result.permissionId = params.permissionParams.permissionId;\n\n for (const policy of params.permissionParams.policies ?? []) {\n const params = policy.policyParams;\n if (params.type === \"sudo\") {\n result.sudoPolicy = {\n enabled: true,\n };\n } else if (params.type === \"gas\") {\n const allowed = formatEther(params.allowed ?? 0n);\n result.gasPolicy = {\n enabled: true,\n allowed: `${allowed} ETH`,\n ...(params.enforcePaymaster && {\n enforcePaymaster: params.enforcePaymaster,\n }),\n ...(params.allowedPaymaster !== zeroAddress && {\n allowedPaymaster: params.allowedPaymaster,\n }),\n };\n } else if (params.type === \"timestamp\") {\n const validAfter = params.validAfter ?? 0;\n const validUntil = params.validUntil ?? 0;\n\n result.timestampPolicy = {\n enabled: true,\n starts: humanizeRelativeTime(validAfter),\n ends: humanizeRelativeTime(validUntil),\n };\n } else if (params.type === \"rate-limit\") {\n const formattedInterval = humanizeDuration(params.interval ?? 0);\n result.rateLimitPolicy = {\n enabled: true,\n count: params.count,\n interval: formattedInterval,\n starts: humanizeRelativeTime(params.startAt ?? 0),\n };\n } else if (params.type === \"signature-caller\") {\n result.signatureCallerPolicy = {\n enabled: true,\n allowedCallers: params.allowedCallers,\n };\n } else if (params.type === \"call\") {\n result.callPolicy = {\n enabled: true,\n policyVersion: params.policyVersion,\n };\n\n if (!params.permissions || params.permissions.length === 0) continue;\n\n for (const permission of params.permissions) {\n result.callPolicy.permissions = result.callPolicy.permissions ?? [];\n\n if (\"abi\" in permission) {\n const formattedValue = formatEther(permission.valueLimit ?? 0n);\n\n const abiFn = permission.abi?.find(\n (f) => f.type === \"function\" && f.name === permission.functionName,\n ) as AbiFunction | undefined;\n\n const cyan = \"\\x1b[36m\";\n const yellow = \"\\x1b[33m\";\n const magenta = \"\\x1b[35m\";\n const reset = \"\\x1b[0m\";\n\n let fnName = `${magenta}${permission.functionName ?? \"unknown\"}${reset}(`;\n\n if (abiFn) {\n abiFn.inputs.forEach((input, i) => {\n if (i > 0) fnName += \", \";\n fnName += `${cyan}${input.type}${reset}${input.name ? ` ${yellow}${input.name}${reset}` : \"\"}`;\n });\n }\n\n fnName += \")\";\n\n result.callPolicy.permissions.push({\n targetAddress: permission.target,\n valueLimit: `${formattedValue} ETH`,\n functionName: fnName,\n });\n } else {\n const formattedValue = formatEther(permission.valueLimit ?? 0n);\n result.callPolicy.permissions.push({\n targetAddress: permission.target,\n valueLimit: `${formattedValue} ETH`,\n });\n }\n }\n }\n }\n\n return result;\n};\n"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env node
2
+ import { Schema } from "effect";
3
+ //#region src/helpers/paths.ts
4
+ /** biome-ignore-all lint/suspicious/noExplicitAny: safe */
5
+ /**
6
+ * Returns the value at a dot-delimited path within a nested object.
7
+ *
8
+ * @param obj - Object to traverse.
9
+ * @param path - Dot-delimited lookup path.
10
+ */
11
+ const getSchema = (obj, path) => {
12
+ return path.split(".").reduce((acc, key) => acc[key], obj);
13
+ };
14
+ /**
15
+ * Extracts all dot-delimited paths that terminate at Effect schemas.
16
+ *
17
+ * @param obj - Object tree to scan.
18
+ * @param prefix - Internal prefix used to build nested paths.
19
+ */
20
+ const extractPaths = (obj, prefix = "") => {
21
+ return Object.entries(obj).flatMap(([key, value]) => {
22
+ const newPath = prefix ? `${prefix}.${key}` : key;
23
+ if (Schema.isSchema(value)) return [newPath];
24
+ if (typeof value === "object" && value !== null) return extractPaths(value, newPath);
25
+ return [];
26
+ });
27
+ };
28
+ //#endregion
29
+ export { extractPaths, getSchema };
30
+
31
+ //# sourceMappingURL=paths.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.mjs","names":[],"sources":["../../src/helpers/paths.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: safe */\nimport { Schema } from \"effect\";\n\nimport type { DeepPaths } from \"@/types\";\n\n/**\n * Returns the value at a dot-delimited path within a nested object.\n *\n * @param obj - Object to traverse.\n * @param path - Dot-delimited lookup path.\n */\nexport const getSchema = <\n T extends Record<string, any>,\n P extends DeepPaths<T>,\n>(\n obj: T,\n path: P,\n): any => {\n return path.split(\".\").reduce((acc, key) => acc[key], obj);\n};\n\n/**\n * Extracts all dot-delimited paths that terminate at Effect schemas.\n *\n * @param obj - Object tree to scan.\n * @param prefix - Internal prefix used to build nested paths.\n */\nexport const extractPaths = <T extends Record<string, any>>(\n obj: T,\n prefix = \"\",\n): DeepPaths<T>[] => {\n return Object.entries(obj).flatMap(([key, value]) => {\n const newPath = prefix ? `${prefix}.${key}` : key;\n\n if (Schema.isSchema(value)) {\n return [newPath];\n }\n\n if (typeof value === \"object\" && value !== null) {\n return extractPaths(value, newPath);\n }\n\n return [];\n }) as DeepPaths<T>[];\n};\n"],"mappings":";;;;;;;;;;AAWA,MAAa,aAIX,KACA,SACQ;AACR,QAAO,KAAK,MAAM,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,IAAI;;;;;;;;AAS5D,MAAa,gBACX,KACA,SAAS,OACU;AACnB,QAAO,OAAO,QAAQ,IAAI,CAAC,SAAS,CAAC,KAAK,WAAW;EACnD,MAAM,UAAU,SAAS,GAAG,OAAO,GAAG,QAAQ;AAE9C,MAAI,OAAO,SAAS,MAAM,CACxB,QAAO,CAAC,QAAQ;AAGlB,MAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QAAO,aAAa,OAAO,QAAQ;AAGrC,SAAO,EAAE;GACT"}