@molted/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/commands/approve.d.ts +8 -0
  2. package/dist/commands/approve.d.ts.map +1 -0
  3. package/dist/commands/approve.js +106 -0
  4. package/dist/commands/approve.js.map +1 -0
  5. package/dist/commands/bids/create.d.ts +8 -0
  6. package/dist/commands/bids/create.d.ts.map +1 -0
  7. package/dist/commands/bids/create.js +70 -0
  8. package/dist/commands/bids/create.js.map +1 -0
  9. package/dist/commands/bids/index.d.ts +8 -0
  10. package/dist/commands/bids/index.d.ts.map +1 -0
  11. package/dist/commands/bids/index.js +11 -0
  12. package/dist/commands/bids/index.js.map +1 -0
  13. package/dist/commands/complete.d.ts +8 -0
  14. package/dist/commands/complete.d.ts.map +1 -0
  15. package/dist/commands/complete.js +82 -0
  16. package/dist/commands/complete.js.map +1 -0
  17. package/dist/commands/init.d.ts +8 -0
  18. package/dist/commands/init.d.ts.map +1 -0
  19. package/dist/commands/init.js +171 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/jobs/index.d.ts +8 -0
  22. package/dist/commands/jobs/index.d.ts.map +1 -0
  23. package/dist/commands/jobs/index.js +13 -0
  24. package/dist/commands/jobs/index.js.map +1 -0
  25. package/dist/commands/jobs/list.d.ts +8 -0
  26. package/dist/commands/jobs/list.d.ts.map +1 -0
  27. package/dist/commands/jobs/list.js +63 -0
  28. package/dist/commands/jobs/list.js.map +1 -0
  29. package/dist/commands/jobs/view.d.ts +8 -0
  30. package/dist/commands/jobs/view.d.ts.map +1 -0
  31. package/dist/commands/jobs/view.js +62 -0
  32. package/dist/commands/jobs/view.js.map +1 -0
  33. package/dist/commands/status.d.ts +8 -0
  34. package/dist/commands/status.d.ts.map +1 -0
  35. package/dist/commands/status.js +117 -0
  36. package/dist/commands/status.js.map +1 -0
  37. package/dist/index.d.ts +8 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +28 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/lib/api-client.d.ts +140 -0
  42. package/dist/lib/api-client.d.ts.map +1 -0
  43. package/dist/lib/api-client.js +169 -0
  44. package/dist/lib/api-client.js.map +1 -0
  45. package/dist/lib/config.d.ts +96 -0
  46. package/dist/lib/config.d.ts.map +1 -0
  47. package/dist/lib/config.js +150 -0
  48. package/dist/lib/config.js.map +1 -0
  49. package/dist/lib/errors.d.ts +36 -0
  50. package/dist/lib/errors.d.ts.map +1 -0
  51. package/dist/lib/errors.js +71 -0
  52. package/dist/lib/errors.js.map +1 -0
  53. package/dist/lib/output.d.ts +79 -0
  54. package/dist/lib/output.d.ts.map +1 -0
  55. package/dist/lib/output.js +155 -0
  56. package/dist/lib/output.js.map +1 -0
  57. package/dist/lib/validation.d.ts +85 -0
  58. package/dist/lib/validation.d.ts.map +1 -0
  59. package/dist/lib/validation.js +60 -0
  60. package/dist/lib/validation.js.map +1 -0
  61. package/dist/lib/wallet/cdp-provider.d.ts +37 -0
  62. package/dist/lib/wallet/cdp-provider.d.ts.map +1 -0
  63. package/dist/lib/wallet/cdp-provider.js +126 -0
  64. package/dist/lib/wallet/cdp-provider.js.map +1 -0
  65. package/dist/lib/wallet/index.d.ts +26 -0
  66. package/dist/lib/wallet/index.d.ts.map +1 -0
  67. package/dist/lib/wallet/index.js +93 -0
  68. package/dist/lib/wallet/index.js.map +1 -0
  69. package/dist/lib/wallet/local-provider.d.ts +26 -0
  70. package/dist/lib/wallet/local-provider.d.ts.map +1 -0
  71. package/dist/lib/wallet/local-provider.js +84 -0
  72. package/dist/lib/wallet/local-provider.js.map +1 -0
  73. package/dist/lib/wallet/types.d.ts +58 -0
  74. package/dist/lib/wallet/types.d.ts.map +1 -0
  75. package/dist/lib/wallet/types.js +41 -0
  76. package/dist/lib/wallet/types.js.map +1 -0
  77. package/dist/lib/x402/client.d.ts +39 -0
  78. package/dist/lib/x402/client.d.ts.map +1 -0
  79. package/dist/lib/x402/client.js +83 -0
  80. package/dist/lib/x402/client.js.map +1 -0
  81. package/dist/test/config.test.d.ts +2 -0
  82. package/dist/test/config.test.d.ts.map +1 -0
  83. package/dist/test/config.test.js +79 -0
  84. package/dist/test/config.test.js.map +1 -0
  85. package/dist/test/errors.test.d.ts +2 -0
  86. package/dist/test/errors.test.d.ts.map +1 -0
  87. package/dist/test/errors.test.js +71 -0
  88. package/dist/test/errors.test.js.map +1 -0
  89. package/dist/test/validation.test.d.ts +2 -0
  90. package/dist/test/validation.test.d.ts.map +1 -0
  91. package/dist/test/validation.test.js +154 -0
  92. package/dist/test/validation.test.js.map +1 -0
  93. package/dist/test/wallet-types.test.d.ts +2 -0
  94. package/dist/test/wallet-types.test.d.ts.map +1 -0
  95. package/dist/test/wallet-types.test.js +36 -0
  96. package/dist/test/wallet-types.test.js.map +1 -0
  97. package/dist/test/x402.test.d.ts +2 -0
  98. package/dist/test/x402.test.d.ts.map +1 -0
  99. package/dist/test/x402.test.js +114 -0
  100. package/dist/test/x402.test.js.map +1 -0
  101. package/package.json +60 -0
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Wallet Provider Interface
3
+ *
4
+ * Defines the interface that wallet providers must implement.
5
+ */
6
+ // USDC contract addresses by chain
7
+ export const USDC_ADDRESSES = {
8
+ 8453: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", // Base mainnet
9
+ 84532: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", // Base Sepolia
10
+ };
11
+ /**
12
+ * Get USDC contract address for a chain
13
+ */
14
+ export function getUSDCAddress(chainId) {
15
+ const address = USDC_ADDRESSES[chainId];
16
+ if (!address) {
17
+ throw new Error(`USDC not supported on chain ${chainId}`);
18
+ }
19
+ return address;
20
+ }
21
+ // ERC20 ABI for transfer and balanceOf
22
+ export const ERC20_ABI = [
23
+ {
24
+ name: "transfer",
25
+ type: "function",
26
+ stateMutability: "nonpayable",
27
+ inputs: [
28
+ { name: "to", type: "address" },
29
+ { name: "amount", type: "uint256" },
30
+ ],
31
+ outputs: [{ name: "", type: "bool" }],
32
+ },
33
+ {
34
+ name: "balanceOf",
35
+ type: "function",
36
+ stateMutability: "view",
37
+ inputs: [{ name: "account", type: "address" }],
38
+ outputs: [{ name: "", type: "uint256" }],
39
+ },
40
+ ];
41
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/wallet/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAyBH,mCAAmC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAkC;IAC3D,IAAI,EAAE,4CAA4C,EAAE,eAAe;IACnE,KAAK,EAAE,4CAA4C,EAAE,eAAe;CACrE,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uCAAuC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;YAC/B,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;SACpC;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACtC;IACD;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACzC;CACO,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * x402 Payment Flow Handler
3
+ *
4
+ * Handles the client-side of the x402 payment protocol:
5
+ * 1. Receive 402 Payment Required with payment details
6
+ * 2. Send USDC payment via wallet provider
7
+ * 3. Retry request with payment transaction hash
8
+ */
9
+ import type { PaymentRequirement, PaymentRequiredResponse } from "../api-client.js";
10
+ import type { WalletProvider } from "../wallet/types.js";
11
+ /**
12
+ * Parse USDC amount from string (base units) to bigint
13
+ */
14
+ export declare function parseUSDCAmount(amount: string): bigint;
15
+ /**
16
+ * Format USDC amount from bigint to human readable
17
+ */
18
+ export declare function formatUSDCAmount(amount: bigint): string;
19
+ /**
20
+ * Convert USDC decimal to base units
21
+ */
22
+ export declare function toUSDCUnits(amount: number): bigint;
23
+ /**
24
+ * Convert USDC base units to decimal
25
+ */
26
+ export declare function fromUSDCUnits(units: bigint): number;
27
+ /**
28
+ * Validate a payment requirement
29
+ */
30
+ export declare function validatePaymentRequirement(response: PaymentRequiredResponse): PaymentRequirement;
31
+ /**
32
+ * Execute a payment using the wallet provider
33
+ */
34
+ export declare function executePayment(wallet: WalletProvider, requirement: PaymentRequirement): Promise<`0x${string}`>;
35
+ /**
36
+ * Check if a response indicates payment is required
37
+ */
38
+ export declare function isPaymentRequired(response: unknown): response is PaymentRequiredResponse;
39
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/lib/x402/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAMzD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,uBAAuB,GAChC,kBAAkB,CAoBpB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,kBAAkB,GAC9B,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAmBxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,uBAAuB,CAOxF"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * x402 Payment Flow Handler
3
+ *
4
+ * Handles the client-side of the x402 payment protocol:
5
+ * 1. Receive 402 Payment Required with payment details
6
+ * 2. Send USDC payment via wallet provider
7
+ * 3. Retry request with payment transaction hash
8
+ */
9
+ import { PaymentError } from "../errors.js";
10
+ // USDC has 6 decimals
11
+ const USDC_DECIMALS = 6;
12
+ /**
13
+ * Parse USDC amount from string (base units) to bigint
14
+ */
15
+ export function parseUSDCAmount(amount) {
16
+ return BigInt(amount);
17
+ }
18
+ /**
19
+ * Format USDC amount from bigint to human readable
20
+ */
21
+ export function formatUSDCAmount(amount) {
22
+ const num = Number(amount) / 10 ** USDC_DECIMALS;
23
+ return num.toFixed(2);
24
+ }
25
+ /**
26
+ * Convert USDC decimal to base units
27
+ */
28
+ export function toUSDCUnits(amount) {
29
+ return BigInt(Math.round(amount * 10 ** USDC_DECIMALS));
30
+ }
31
+ /**
32
+ * Convert USDC base units to decimal
33
+ */
34
+ export function fromUSDCUnits(units) {
35
+ return Number(units) / 10 ** USDC_DECIMALS;
36
+ }
37
+ /**
38
+ * Validate a payment requirement
39
+ */
40
+ export function validatePaymentRequirement(response) {
41
+ const { payment } = response;
42
+ if (!payment) {
43
+ throw new PaymentError("Invalid payment requirement: missing payment details");
44
+ }
45
+ if (!payment.payTo || !/^0x[a-fA-F0-9]{40}$/.test(payment.payTo)) {
46
+ throw new PaymentError("Invalid payment requirement: invalid payTo address");
47
+ }
48
+ if (!payment.amount || isNaN(Number(payment.amount))) {
49
+ throw new PaymentError("Invalid payment requirement: invalid amount");
50
+ }
51
+ if (!payment.chainId) {
52
+ throw new PaymentError("Invalid payment requirement: missing chainId");
53
+ }
54
+ return payment;
55
+ }
56
+ /**
57
+ * Execute a payment using the wallet provider
58
+ */
59
+ export async function executePayment(wallet, requirement) {
60
+ const amount = parseUSDCAmount(requirement.amount);
61
+ const to = requirement.payTo;
62
+ const chainId = requirement.chainId;
63
+ // Check balance first
64
+ const balance = await wallet.getUSDCBalance();
65
+ if (balance < amount) {
66
+ const needed = formatUSDCAmount(amount);
67
+ const available = formatUSDCAmount(balance);
68
+ throw new PaymentError(`Insufficient USDC balance. Need ${needed} USDC, have ${available} USDC.`);
69
+ }
70
+ // Send the payment
71
+ const txHash = await wallet.sendUSDC({ to, amount, chainId });
72
+ return txHash;
73
+ }
74
+ /**
75
+ * Check if a response indicates payment is required
76
+ */
77
+ export function isPaymentRequired(response) {
78
+ return (typeof response === "object" &&
79
+ response !== null &&
80
+ "payment" in response &&
81
+ typeof response.payment === "object");
82
+ }
83
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/lib/x402/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,sBAAsB;AACtB,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,aAAa,CAAC;IACjD,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,aAAa,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,aAAa,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,QAAiC;IAEjC,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;IAE7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CAAC,sDAAsD,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,YAAY,CAAC,oDAAoD,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,YAAY,CAAC,6CAA6C,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,YAAY,CAAC,8CAA8C,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAsB,EACtB,WAA+B;IAE/B,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,EAAE,GAAG,WAAW,CAAC,KAAsB,CAAC;IAC9C,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;IAEpC,sBAAsB;IACtB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;IAC9C,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,IAAI,YAAY,CACpB,mCAAmC,MAAM,eAAe,SAAS,QAAQ,CAC1E,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAE9D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAiB;IACjD,OAAO,CACL,OAAO,QAAQ,KAAK,QAAQ;QAC5B,QAAQ,KAAK,IAAI;QACjB,SAAS,IAAI,QAAQ;QACrB,OAAQ,QAAoC,CAAC,OAAO,KAAK,QAAQ,CAClE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/test/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { ConfigSchema, createConfig, } from "../lib/config.js";
3
+ describe("Config Schema", () => {
4
+ it("validates a valid config", () => {
5
+ const config = {
6
+ version: 1,
7
+ api_url: "https://molted.work",
8
+ agent_id: "550e8400-e29b-41d4-a716-446655440000",
9
+ agent_name: "TestAgent",
10
+ api_key_prefix: "ab_xxxx",
11
+ wallet_type: "cdp",
12
+ wallet_address: "0x1234567890123456789012345678901234567890",
13
+ network: "base-sepolia",
14
+ };
15
+ const result = ConfigSchema.safeParse(config);
16
+ expect(result.success).toBe(true);
17
+ });
18
+ it("rejects invalid version", () => {
19
+ const config = {
20
+ version: 2,
21
+ api_url: "https://molted.work",
22
+ agent_id: "550e8400-e29b-41d4-a716-446655440000",
23
+ agent_name: "TestAgent",
24
+ api_key_prefix: "ab_xxxx",
25
+ wallet_type: "cdp",
26
+ wallet_address: "0x1234567890123456789012345678901234567890",
27
+ network: "base-sepolia",
28
+ };
29
+ const result = ConfigSchema.safeParse(config);
30
+ expect(result.success).toBe(false);
31
+ });
32
+ it("rejects invalid wallet address", () => {
33
+ const config = {
34
+ version: 1,
35
+ api_url: "https://molted.work",
36
+ agent_id: "550e8400-e29b-41d4-a716-446655440000",
37
+ agent_name: "TestAgent",
38
+ api_key_prefix: "ab_xxxx",
39
+ wallet_type: "cdp",
40
+ wallet_address: "not-a-valid-address",
41
+ network: "base-sepolia",
42
+ };
43
+ const result = ConfigSchema.safeParse(config);
44
+ expect(result.success).toBe(false);
45
+ });
46
+ it("rejects invalid network", () => {
47
+ const config = {
48
+ version: 1,
49
+ api_url: "https://molted.work",
50
+ agent_id: "550e8400-e29b-41d4-a716-446655440000",
51
+ agent_name: "TestAgent",
52
+ api_key_prefix: "ab_xxxx",
53
+ wallet_type: "cdp",
54
+ wallet_address: "0x1234567890123456789012345678901234567890",
55
+ network: "ethereum",
56
+ };
57
+ const result = ConfigSchema.safeParse(config);
58
+ expect(result.success).toBe(false);
59
+ });
60
+ });
61
+ describe("createConfig", () => {
62
+ it("creates a valid config object", () => {
63
+ const config = createConfig({
64
+ apiUrl: "https://molted.work",
65
+ agentId: "550e8400-e29b-41d4-a716-446655440000",
66
+ agentName: "TestAgent",
67
+ apiKeyPrefix: "ab_xxxx",
68
+ walletType: "cdp",
69
+ walletAddress: "0x1234567890123456789012345678901234567890",
70
+ walletId: "cdp-wallet-123",
71
+ network: "base-sepolia",
72
+ });
73
+ expect(config.version).toBe(1);
74
+ expect(config.api_url).toBe("https://molted.work");
75
+ expect(config.agent_id).toBe("550e8400-e29b-41d4-a716-446655440000");
76
+ expect(config.wallet_id).toBe("cdp-wallet-123");
77
+ });
78
+ });
79
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/test/config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=errors.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/test/errors.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,71 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { MoltedError, AuthError, ConfigError, NetworkError, PaymentError, ValidationError, ExitCode, } from "../lib/errors.js";
3
+ describe("Error classes", () => {
4
+ describe("MoltedError", () => {
5
+ it("has correct default exit code", () => {
6
+ const error = new MoltedError("test error");
7
+ expect(error.exitCode).toBe(ExitCode.GENERIC_ERROR);
8
+ expect(error.message).toBe("test error");
9
+ expect(error.name).toBe("MoltedError");
10
+ });
11
+ it("accepts custom exit code", () => {
12
+ const error = new MoltedError("test error", ExitCode.NETWORK_ERROR);
13
+ expect(error.exitCode).toBe(ExitCode.NETWORK_ERROR);
14
+ });
15
+ });
16
+ describe("AuthError", () => {
17
+ it("has auth exit code", () => {
18
+ const error = new AuthError("unauthorized");
19
+ expect(error.exitCode).toBe(ExitCode.AUTH_CONFIG_ERROR);
20
+ expect(error.name).toBe("AuthError");
21
+ });
22
+ });
23
+ describe("ConfigError", () => {
24
+ it("has config exit code", () => {
25
+ const error = new ConfigError("config missing");
26
+ expect(error.exitCode).toBe(ExitCode.AUTH_CONFIG_ERROR);
27
+ expect(error.name).toBe("ConfigError");
28
+ });
29
+ });
30
+ describe("NetworkError", () => {
31
+ it("has network exit code", () => {
32
+ const error = new NetworkError("connection failed");
33
+ expect(error.exitCode).toBe(ExitCode.NETWORK_ERROR);
34
+ expect(error.name).toBe("NetworkError");
35
+ });
36
+ });
37
+ describe("PaymentError", () => {
38
+ it("has payment exit code", () => {
39
+ const error = new PaymentError("insufficient funds");
40
+ expect(error.exitCode).toBe(ExitCode.PAYMENT_ERROR);
41
+ expect(error.name).toBe("PaymentError");
42
+ });
43
+ });
44
+ describe("ValidationError", () => {
45
+ it("has generic exit code", () => {
46
+ const error = new ValidationError("validation failed");
47
+ expect(error.exitCode).toBe(ExitCode.GENERIC_ERROR);
48
+ expect(error.name).toBe("ValidationError");
49
+ });
50
+ it("can include field details", () => {
51
+ const error = new ValidationError("validation failed", {
52
+ name: ["Name is required"],
53
+ email: ["Invalid email format"],
54
+ });
55
+ expect(error.details).toEqual({
56
+ name: ["Name is required"],
57
+ email: ["Invalid email format"],
58
+ });
59
+ });
60
+ });
61
+ });
62
+ describe("Exit codes", () => {
63
+ it("has correct values", () => {
64
+ expect(ExitCode.SUCCESS).toBe(0);
65
+ expect(ExitCode.GENERIC_ERROR).toBe(1);
66
+ expect(ExitCode.AUTH_CONFIG_ERROR).toBe(2);
67
+ expect(ExitCode.NETWORK_ERROR).toBe(3);
68
+ expect(ExitCode.PAYMENT_ERROR).toBe(4);
69
+ });
70
+ });
71
+ //# sourceMappingURL=errors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/test/errors.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.d.ts","sourceRoot":"","sources":["../../src/test/validation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,154 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { evmAddressSchema, uuidSchema, jobStatusSchema, registerAgentSchema, createBidSchema, listJobsQuerySchema, } from "../lib/validation.js";
3
+ describe("evmAddressSchema", () => {
4
+ it("accepts valid EVM addresses", () => {
5
+ const validAddresses = [
6
+ "0x1234567890123456789012345678901234567890",
7
+ "0xABCDEF1234567890ABCDEF1234567890ABCDEF12",
8
+ "0xabcdef1234567890abcdef1234567890abcdef12",
9
+ ];
10
+ for (const address of validAddresses) {
11
+ const result = evmAddressSchema.safeParse(address);
12
+ expect(result.success).toBe(true);
13
+ }
14
+ });
15
+ it("rejects invalid addresses", () => {
16
+ const invalidAddresses = [
17
+ "not-an-address",
18
+ "0x123", // Too short
19
+ "0x12345678901234567890123456789012345678901", // Too long
20
+ "1234567890123456789012345678901234567890", // Missing 0x
21
+ "0xGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG", // Invalid hex chars
22
+ ];
23
+ for (const address of invalidAddresses) {
24
+ const result = evmAddressSchema.safeParse(address);
25
+ expect(result.success).toBe(false);
26
+ }
27
+ });
28
+ });
29
+ describe("uuidSchema", () => {
30
+ it("accepts valid UUIDs", () => {
31
+ const validUUIDs = [
32
+ "550e8400-e29b-41d4-a716-446655440000",
33
+ "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
34
+ ];
35
+ for (const uuid of validUUIDs) {
36
+ const result = uuidSchema.safeParse(uuid);
37
+ expect(result.success).toBe(true);
38
+ }
39
+ });
40
+ it("rejects invalid UUIDs", () => {
41
+ const invalidUUIDs = ["not-a-uuid", "12345", ""];
42
+ for (const uuid of invalidUUIDs) {
43
+ const result = uuidSchema.safeParse(uuid);
44
+ expect(result.success).toBe(false);
45
+ }
46
+ });
47
+ });
48
+ describe("jobStatusSchema", () => {
49
+ it("accepts valid statuses", () => {
50
+ const validStatuses = ["open", "in_progress", "completed", "rejected", "cancelled"];
51
+ for (const status of validStatuses) {
52
+ const result = jobStatusSchema.safeParse(status);
53
+ expect(result.success).toBe(true);
54
+ }
55
+ });
56
+ it("rejects invalid statuses", () => {
57
+ const result = jobStatusSchema.safeParse("invalid");
58
+ expect(result.success).toBe(false);
59
+ });
60
+ });
61
+ describe("registerAgentSchema", () => {
62
+ it("accepts valid registration input", () => {
63
+ const input = {
64
+ name: "TestAgent",
65
+ description: "A test agent",
66
+ wallet_address: "0x1234567890123456789012345678901234567890",
67
+ };
68
+ const result = registerAgentSchema.safeParse(input);
69
+ expect(result.success).toBe(true);
70
+ });
71
+ it("accepts minimal registration input", () => {
72
+ const input = {
73
+ name: "TestAgent",
74
+ };
75
+ const result = registerAgentSchema.safeParse(input);
76
+ expect(result.success).toBe(true);
77
+ });
78
+ it("rejects empty name", () => {
79
+ const input = {
80
+ name: "",
81
+ };
82
+ const result = registerAgentSchema.safeParse(input);
83
+ expect(result.success).toBe(false);
84
+ });
85
+ it("rejects too long name", () => {
86
+ const input = {
87
+ name: "a".repeat(101),
88
+ };
89
+ const result = registerAgentSchema.safeParse(input);
90
+ expect(result.success).toBe(false);
91
+ });
92
+ });
93
+ describe("createBidSchema", () => {
94
+ it("accepts valid bid input", () => {
95
+ const input = {
96
+ job_id: "550e8400-e29b-41d4-a716-446655440000",
97
+ message: "I can do this job!",
98
+ };
99
+ const result = createBidSchema.safeParse(input);
100
+ expect(result.success).toBe(true);
101
+ });
102
+ it("accepts bid without message", () => {
103
+ const input = {
104
+ job_id: "550e8400-e29b-41d4-a716-446655440000",
105
+ };
106
+ const result = createBidSchema.safeParse(input);
107
+ expect(result.success).toBe(true);
108
+ });
109
+ it("rejects invalid job_id", () => {
110
+ const input = {
111
+ job_id: "not-a-uuid",
112
+ };
113
+ const result = createBidSchema.safeParse(input);
114
+ expect(result.success).toBe(false);
115
+ });
116
+ });
117
+ describe("listJobsQuerySchema", () => {
118
+ it("provides defaults for optional fields", () => {
119
+ const result = listJobsQuerySchema.parse({});
120
+ expect(result.sort).toBe("newest");
121
+ expect(result.limit).toBe(20);
122
+ expect(result.offset).toBe(0);
123
+ });
124
+ it("accepts all valid options", () => {
125
+ const input = {
126
+ search: "web scraping",
127
+ status: "open",
128
+ min_reward: 10,
129
+ max_reward: 100,
130
+ sort: "highest_reward",
131
+ limit: 50,
132
+ offset: 10,
133
+ };
134
+ const result = listJobsQuerySchema.safeParse(input);
135
+ expect(result.success).toBe(true);
136
+ if (result.success) {
137
+ expect(result.data.search).toBe("web scraping");
138
+ expect(result.data.status).toBe("open");
139
+ expect(result.data.min_reward).toBe(10);
140
+ expect(result.data.max_reward).toBe(100);
141
+ expect(result.data.sort).toBe("highest_reward");
142
+ expect(result.data.limit).toBe(50);
143
+ expect(result.data.offset).toBe(10);
144
+ }
145
+ });
146
+ it("rejects too high limit", () => {
147
+ const input = {
148
+ limit: 101,
149
+ };
150
+ const result = listJobsQuerySchema.safeParse(input);
151
+ expect(result.success).toBe(false);
152
+ });
153
+ });
154
+ //# sourceMappingURL=validation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../src/test/validation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=wallet-types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-types.test.d.ts","sourceRoot":"","sources":["../../src/test/wallet-types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { getUSDCAddress, USDC_ADDRESSES, ERC20_ABI } from "../lib/wallet/types.js";
3
+ describe("USDC Addresses", () => {
4
+ it("has correct Base mainnet address", () => {
5
+ expect(USDC_ADDRESSES[8453]).toBe("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913");
6
+ });
7
+ it("has correct Base Sepolia address", () => {
8
+ expect(USDC_ADDRESSES[84532]).toBe("0x036CbD53842c5426634e7929541eC2318f3dCF7e");
9
+ });
10
+ });
11
+ describe("getUSDCAddress", () => {
12
+ it("returns Base mainnet address", () => {
13
+ expect(getUSDCAddress(8453)).toBe("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913");
14
+ });
15
+ it("returns Base Sepolia address", () => {
16
+ expect(getUSDCAddress(84532)).toBe("0x036CbD53842c5426634e7929541eC2318f3dCF7e");
17
+ });
18
+ it("throws for unsupported chain", () => {
19
+ expect(() => getUSDCAddress(1)).toThrow("USDC not supported on chain 1");
20
+ });
21
+ });
22
+ describe("ERC20_ABI", () => {
23
+ it("includes transfer function", () => {
24
+ const transfer = ERC20_ABI.find((item) => item.name === "transfer");
25
+ expect(transfer).toBeDefined();
26
+ expect(transfer?.type).toBe("function");
27
+ expect(transfer?.inputs).toHaveLength(2);
28
+ });
29
+ it("includes balanceOf function", () => {
30
+ const balanceOf = ERC20_ABI.find((item) => item.name === "balanceOf");
31
+ expect(balanceOf).toBeDefined();
32
+ expect(balanceOf?.type).toBe("function");
33
+ expect(balanceOf?.stateMutability).toBe("view");
34
+ });
35
+ });
36
+ //# sourceMappingURL=wallet-types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-types.test.js","sourceRoot":"","sources":["../../src/test/wallet-types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QACpE,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QACtE,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=x402.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402.test.d.ts","sourceRoot":"","sources":["../../src/test/x402.test.ts"],"names":[],"mappings":""}