@waiaas/core 2.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/dist/enums/audit.d.ts +5 -0
  2. package/dist/enums/audit.d.ts.map +1 -0
  3. package/dist/enums/audit.js +31 -0
  4. package/dist/enums/audit.js.map +1 -0
  5. package/dist/enums/chain.d.ts +50 -0
  6. package/dist/enums/chain.d.ts.map +1 -0
  7. package/dist/enums/chain.js +123 -0
  8. package/dist/enums/chain.js.map +1 -0
  9. package/dist/enums/index.d.ts +10 -0
  10. package/dist/enums/index.d.ts.map +1 -0
  11. package/dist/enums/index.js +10 -0
  12. package/dist/enums/index.js.map +1 -0
  13. package/dist/enums/notification.d.ts +8 -0
  14. package/dist/enums/notification.d.ts.map +1 -0
  15. package/dist/enums/notification.js +34 -0
  16. package/dist/enums/notification.js.map +1 -0
  17. package/dist/enums/owner.d.ts +5 -0
  18. package/dist/enums/owner.d.ts.map +1 -0
  19. package/dist/enums/owner.js +5 -0
  20. package/dist/enums/owner.js.map +1 -0
  21. package/dist/enums/policy.d.ts +8 -0
  22. package/dist/enums/policy.d.ts.map +1 -0
  23. package/dist/enums/policy.js +19 -0
  24. package/dist/enums/policy.js.map +1 -0
  25. package/dist/enums/session.d.ts +5 -0
  26. package/dist/enums/session.d.ts.map +1 -0
  27. package/dist/enums/session.js +5 -0
  28. package/dist/enums/session.js.map +1 -0
  29. package/dist/enums/system.d.ts +5 -0
  30. package/dist/enums/system.d.ts.map +1 -0
  31. package/dist/enums/system.js +4 -0
  32. package/dist/enums/system.js.map +1 -0
  33. package/dist/enums/transaction.d.ts +8 -0
  34. package/dist/enums/transaction.d.ts.map +1 -0
  35. package/dist/enums/transaction.js +25 -0
  36. package/dist/enums/transaction.js.map +1 -0
  37. package/dist/enums/wallet.d.ts +5 -0
  38. package/dist/enums/wallet.d.ts.map +1 -0
  39. package/dist/enums/wallet.js +10 -0
  40. package/dist/enums/wallet.js.map +1 -0
  41. package/dist/errors/base-error.d.ts +25 -0
  42. package/dist/errors/base-error.d.ts.map +1 -0
  43. package/dist/errors/base-error.js +33 -0
  44. package/dist/errors/base-error.js.map +1 -0
  45. package/dist/errors/chain-error.d.ts +48 -0
  46. package/dist/errors/chain-error.d.ts.map +1 -0
  47. package/dist/errors/chain-error.js +83 -0
  48. package/dist/errors/chain-error.js.map +1 -0
  49. package/dist/errors/error-codes.d.ts +667 -0
  50. package/dist/errors/error-codes.d.ts.map +1 -0
  51. package/dist/errors/error-codes.js +671 -0
  52. package/dist/errors/error-codes.js.map +1 -0
  53. package/dist/errors/index.d.ts +4 -0
  54. package/dist/errors/index.d.ts.map +1 -0
  55. package/dist/errors/index.js +4 -0
  56. package/dist/errors/index.js.map +1 -0
  57. package/dist/events/event-bus.d.ts +36 -0
  58. package/dist/events/event-bus.d.ts.map +1 -0
  59. package/dist/events/event-bus.js +74 -0
  60. package/dist/events/event-bus.js.map +1 -0
  61. package/dist/events/event-types.d.ts +59 -0
  62. package/dist/events/event-types.d.ts.map +1 -0
  63. package/dist/events/event-types.js +16 -0
  64. package/dist/events/event-types.js.map +1 -0
  65. package/dist/events/index.d.ts +3 -0
  66. package/dist/events/index.d.ts.map +1 -0
  67. package/dist/events/index.js +3 -0
  68. package/dist/events/index.js.map +1 -0
  69. package/dist/i18n/en.d.ts +57 -0
  70. package/dist/i18n/en.d.ts.map +1 -0
  71. package/dist/i18n/en.js +194 -0
  72. package/dist/i18n/en.js.map +1 -0
  73. package/dist/i18n/index.d.ts +5 -0
  74. package/dist/i18n/index.d.ts.map +1 -0
  75. package/dist/i18n/index.js +7 -0
  76. package/dist/i18n/index.js.map +1 -0
  77. package/dist/i18n/ko.d.ts +3 -0
  78. package/dist/i18n/ko.d.ts.map +1 -0
  79. package/dist/i18n/ko.js +194 -0
  80. package/dist/i18n/ko.js.map +1 -0
  81. package/dist/index.d.ts +14 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +26 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/interfaces/IChainAdapter.d.ts +61 -0
  86. package/dist/interfaces/IChainAdapter.d.ts.map +1 -0
  87. package/dist/interfaces/IChainAdapter.js +2 -0
  88. package/dist/interfaces/IChainAdapter.js.map +1 -0
  89. package/dist/interfaces/ILocalKeyStore.d.ts +24 -0
  90. package/dist/interfaces/ILocalKeyStore.d.ts.map +1 -0
  91. package/dist/interfaces/ILocalKeyStore.js +2 -0
  92. package/dist/interfaces/ILocalKeyStore.js.map +1 -0
  93. package/dist/interfaces/INotificationChannel.d.ts +32 -0
  94. package/dist/interfaces/INotificationChannel.d.ts.map +1 -0
  95. package/dist/interfaces/INotificationChannel.js +2 -0
  96. package/dist/interfaces/INotificationChannel.js.map +1 -0
  97. package/dist/interfaces/IPolicyEngine.d.ts +44 -0
  98. package/dist/interfaces/IPolicyEngine.d.ts.map +1 -0
  99. package/dist/interfaces/IPolicyEngine.js +2 -0
  100. package/dist/interfaces/IPolicyEngine.js.map +1 -0
  101. package/dist/interfaces/action-provider.types.d.ts +123 -0
  102. package/dist/interfaces/action-provider.types.d.ts.map +1 -0
  103. package/dist/interfaces/action-provider.types.js +65 -0
  104. package/dist/interfaces/action-provider.types.js.map +1 -0
  105. package/dist/interfaces/chain-adapter.types.d.ts +216 -0
  106. package/dist/interfaces/chain-adapter.types.d.ts.map +1 -0
  107. package/dist/interfaces/chain-adapter.types.js +2 -0
  108. package/dist/interfaces/chain-adapter.types.js.map +1 -0
  109. package/dist/interfaces/forex-rate.types.d.ts +63 -0
  110. package/dist/interfaces/forex-rate.types.d.ts.map +1 -0
  111. package/dist/interfaces/forex-rate.types.js +41 -0
  112. package/dist/interfaces/forex-rate.types.js.map +1 -0
  113. package/dist/interfaces/index.d.ts +15 -0
  114. package/dist/interfaces/index.d.ts.map +1 -0
  115. package/dist/interfaces/index.js +5 -0
  116. package/dist/interfaces/index.js.map +1 -0
  117. package/dist/interfaces/price-oracle.types.d.ts +99 -0
  118. package/dist/interfaces/price-oracle.types.d.ts.map +1 -0
  119. package/dist/interfaces/price-oracle.types.js +48 -0
  120. package/dist/interfaces/price-oracle.types.js.map +1 -0
  121. package/dist/interfaces/x402.types.d.ts +112 -0
  122. package/dist/interfaces/x402.types.d.ts.map +1 -0
  123. package/dist/interfaces/x402.types.js +69 -0
  124. package/dist/interfaces/x402.types.js.map +1 -0
  125. package/dist/schemas/asset.schema.d.ts +32 -0
  126. package/dist/schemas/asset.schema.d.ts.map +1 -0
  127. package/dist/schemas/asset.schema.js +15 -0
  128. package/dist/schemas/asset.schema.js.map +1 -0
  129. package/dist/schemas/config.schema.d.ts +58 -0
  130. package/dist/schemas/config.schema.d.ts.map +1 -0
  131. package/dist/schemas/config.schema.js +23 -0
  132. package/dist/schemas/config.schema.js.map +1 -0
  133. package/dist/schemas/index.d.ts +7 -0
  134. package/dist/schemas/index.d.ts.map +1 -0
  135. package/dist/schemas/index.js +9 -0
  136. package/dist/schemas/index.js.map +1 -0
  137. package/dist/schemas/policy.schema.d.ts +192 -0
  138. package/dist/schemas/policy.schema.d.ts.map +1 -0
  139. package/dist/schemas/policy.schema.js +157 -0
  140. package/dist/schemas/policy.schema.js.map +1 -0
  141. package/dist/schemas/session.schema.d.ts +51 -0
  142. package/dist/schemas/session.schema.d.ts.map +1 -0
  143. package/dist/schemas/session.schema.js +19 -0
  144. package/dist/schemas/session.schema.js.map +1 -0
  145. package/dist/schemas/transaction.schema.d.ts +834 -0
  146. package/dist/schemas/transaction.schema.d.ts.map +1 -0
  147. package/dist/schemas/transaction.schema.js +112 -0
  148. package/dist/schemas/transaction.schema.js.map +1 -0
  149. package/dist/schemas/wallet.schema.d.ts +54 -0
  150. package/dist/schemas/wallet.schema.d.ts.map +1 -0
  151. package/dist/schemas/wallet.schema.js +21 -0
  152. package/dist/schemas/wallet.schema.js.map +1 -0
  153. package/dist/testing/chain-adapter-contract.d.ts +42 -0
  154. package/dist/testing/chain-adapter-contract.d.ts.map +1 -0
  155. package/dist/testing/chain-adapter-contract.js +370 -0
  156. package/dist/testing/chain-adapter-contract.js.map +1 -0
  157. package/dist/testing/index.d.ts +8 -0
  158. package/dist/testing/index.d.ts.map +1 -0
  159. package/dist/testing/index.js +7 -0
  160. package/dist/testing/index.js.map +1 -0
  161. package/dist/utils/format-amount.d.ts +41 -0
  162. package/dist/utils/format-amount.d.ts.map +1 -0
  163. package/dist/utils/format-amount.js +60 -0
  164. package/dist/utils/format-amount.js.map +1 -0
  165. package/dist/utils/format-currency.d.ts +42 -0
  166. package/dist/utils/format-currency.d.ts.map +1 -0
  167. package/dist/utils/format-currency.js +92 -0
  168. package/dist/utils/format-currency.js.map +1 -0
  169. package/dist/utils/index.d.ts +3 -0
  170. package/dist/utils/index.d.ts.map +1 -0
  171. package/dist/utils/index.js +5 -0
  172. package/dist/utils/index.js.map +1 -0
  173. package/package.json +50 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/transaction.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiB5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,4BAA4B;;;;;;;;;;;;EAIvC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAYlF,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;EAMhC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AASzE,2DAA2D;AAC3D,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOrC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,8DAA8D;AAC9D,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBpC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,kFAAkF;AAClF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,sEAAsE;AACtE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAMnC,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
@@ -0,0 +1,112 @@
1
+ import { z } from 'zod';
2
+ import { TransactionTypeEnum, TransactionStatusEnum } from '../enums/transaction.js';
3
+ import { PolicyTierEnum } from '../enums/policy.js';
4
+ import { ChainTypeEnum, NetworkTypeEnum } from '../enums/chain.js';
5
+ export const TransactionSchema = z.object({
6
+ id: z.string().uuid(),
7
+ walletId: z.string().uuid(),
8
+ sessionId: z.string().uuid().nullable(),
9
+ type: TransactionTypeEnum,
10
+ status: TransactionStatusEnum,
11
+ tier: PolicyTierEnum.nullable(),
12
+ chain: ChainTypeEnum,
13
+ network: NetworkTypeEnum.nullable(),
14
+ fromAddress: z.string(),
15
+ toAddress: z.string(),
16
+ amount: z.string(), // bigint as string for JSON/SQLite
17
+ txHash: z.string().nullable(),
18
+ errorMessage: z.string().nullable(),
19
+ metadata: z.record(z.unknown()).nullable(),
20
+ createdAt: z.number().int(),
21
+ updatedAt: z.number().int(),
22
+ });
23
+ export const SendTransactionRequestSchema = z.object({
24
+ to: z.string().min(1),
25
+ amount: z.string().regex(/^\d+$/, 'amount must be a numeric string (lamports)'),
26
+ memo: z.string().max(256).optional(),
27
+ });
28
+ // ---------------------------------------------------------------------------
29
+ // discriminatedUnion 5-type transaction request schemas (v1.4)
30
+ //
31
+ // These schemas validate incoming API requests for all 5 transaction types.
32
+ // The existing SendTransactionRequestSchema is kept for backward compatibility.
33
+ // Stage 1 of the pipeline will switch to TransactionRequestSchema in Phase 81.
34
+ // ---------------------------------------------------------------------------
35
+ const numericStringPattern = /^\d+$/;
36
+ /** Type 1: TRANSFER -- native token transfer (SOL/ETH). */
37
+ export const TransferRequestSchema = z.object({
38
+ type: z.literal('TRANSFER'),
39
+ to: z.string().min(1),
40
+ amount: z.string().regex(numericStringPattern, 'amount must be a numeric string (lamports/wei)'),
41
+ memo: z.string().max(256).optional(),
42
+ network: NetworkTypeEnum.optional(),
43
+ });
44
+ /** Token metadata for TOKEN_TRANSFER and APPROVE requests. */
45
+ const TokenInfoSchema = z.object({
46
+ address: z.string().min(1), // mint address (SPL) or contract address (ERC-20)
47
+ decimals: z.number().int().min(0).max(18),
48
+ symbol: z.string().min(1).max(10),
49
+ });
50
+ /** Type 2: TOKEN_TRANSFER -- SPL/ERC-20 token transfer. */
51
+ export const TokenTransferRequestSchema = z.object({
52
+ type: z.literal('TOKEN_TRANSFER'),
53
+ to: z.string().min(1),
54
+ amount: z.string().regex(numericStringPattern, 'amount must be a numeric string'),
55
+ token: TokenInfoSchema,
56
+ memo: z.string().max(256).optional(),
57
+ network: NetworkTypeEnum.optional(),
58
+ });
59
+ /** Type 3: CONTRACT_CALL -- arbitrary contract invocation. */
60
+ export const ContractCallRequestSchema = z.object({
61
+ type: z.literal('CONTRACT_CALL'),
62
+ to: z.string().min(1), // contract address
63
+ // EVM fields
64
+ calldata: z.string().optional(), // hex-encoded calldata
65
+ abi: z.array(z.record(z.unknown())).optional(), // ABI fragment
66
+ value: z.string().regex(numericStringPattern).optional(), // native token value
67
+ // Solana fields
68
+ programId: z.string().optional(),
69
+ instructionData: z.string().optional(), // base64-encoded
70
+ accounts: z
71
+ .array(z.object({
72
+ pubkey: z.string(),
73
+ isSigner: z.boolean(),
74
+ isWritable: z.boolean(),
75
+ }))
76
+ .optional(),
77
+ network: NetworkTypeEnum.optional(),
78
+ });
79
+ /** Type 4: APPROVE -- token spending approval (ERC-20 approve / SPL delegate). */
80
+ export const ApproveRequestSchema = z.object({
81
+ type: z.literal('APPROVE'),
82
+ spender: z.string().min(1),
83
+ token: TokenInfoSchema,
84
+ amount: z.string().regex(numericStringPattern, 'amount must be a numeric string'),
85
+ network: NetworkTypeEnum.optional(),
86
+ });
87
+ /** Type 5: BATCH -- multiple instructions in a single transaction. */
88
+ export const BatchRequestSchema = z.object({
89
+ type: z.literal('BATCH'),
90
+ instructions: z
91
+ .array(z.union([
92
+ TransferRequestSchema.omit({ type: true }),
93
+ TokenTransferRequestSchema.omit({ type: true }),
94
+ ContractCallRequestSchema.omit({ type: true }),
95
+ ApproveRequestSchema.omit({ type: true }),
96
+ ]))
97
+ .min(2, 'Batch requires at least 2 instructions')
98
+ .max(20, 'Batch maximum 20 instructions'),
99
+ network: NetworkTypeEnum.optional(),
100
+ });
101
+ /**
102
+ * discriminatedUnion 5-type transaction request schema.
103
+ * Identifies the correct schema variant via the `type` field.
104
+ */
105
+ export const TransactionRequestSchema = z.discriminatedUnion('type', [
106
+ TransferRequestSchema,
107
+ TokenTransferRequestSchema,
108
+ ContractCallRequestSchema,
109
+ ApproveRequestSchema,
110
+ BatchRequestSchema,
111
+ ]);
112
+ //# sourceMappingURL=transaction.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.schema.js","sourceRoot":"","sources":["../../src/schemas/transaction.schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { z } from 'zod';
2
+ export declare const WalletSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ name: z.ZodString;
5
+ chain: z.ZodEnum<["solana", "ethereum"]>;
6
+ environment: z.ZodEnum<["testnet", "mainnet"]>;
7
+ defaultNetwork: z.ZodNullable<z.ZodEnum<["mainnet", "devnet", "testnet", "ethereum-mainnet", "ethereum-sepolia", "polygon-mainnet", "polygon-amoy", "arbitrum-mainnet", "arbitrum-sepolia", "optimism-mainnet", "optimism-sepolia", "base-mainnet", "base-sepolia"]>>;
8
+ publicKey: z.ZodString;
9
+ status: z.ZodEnum<["CREATING", "ACTIVE", "SUSPENDED", "TERMINATING", "TERMINATED"]>;
10
+ ownerAddress: z.ZodNullable<z.ZodString>;
11
+ ownerVerified: z.ZodBoolean;
12
+ createdAt: z.ZodNumber;
13
+ updatedAt: z.ZodNumber;
14
+ }, "strip", z.ZodTypeAny, {
15
+ id: string;
16
+ name: string;
17
+ chain: "solana" | "ethereum";
18
+ environment: "mainnet" | "testnet";
19
+ defaultNetwork: "mainnet" | "devnet" | "testnet" | "ethereum-mainnet" | "ethereum-sepolia" | "polygon-mainnet" | "polygon-amoy" | "arbitrum-mainnet" | "arbitrum-sepolia" | "optimism-mainnet" | "optimism-sepolia" | "base-mainnet" | "base-sepolia" | null;
20
+ publicKey: string;
21
+ status: "CREATING" | "ACTIVE" | "SUSPENDED" | "TERMINATING" | "TERMINATED";
22
+ ownerAddress: string | null;
23
+ ownerVerified: boolean;
24
+ createdAt: number;
25
+ updatedAt: number;
26
+ }, {
27
+ id: string;
28
+ name: string;
29
+ chain: "solana" | "ethereum";
30
+ environment: "mainnet" | "testnet";
31
+ defaultNetwork: "mainnet" | "devnet" | "testnet" | "ethereum-mainnet" | "ethereum-sepolia" | "polygon-mainnet" | "polygon-amoy" | "arbitrum-mainnet" | "arbitrum-sepolia" | "optimism-mainnet" | "optimism-sepolia" | "base-mainnet" | "base-sepolia" | null;
32
+ publicKey: string;
33
+ status: "CREATING" | "ACTIVE" | "SUSPENDED" | "TERMINATING" | "TERMINATED";
34
+ ownerAddress: string | null;
35
+ ownerVerified: boolean;
36
+ createdAt: number;
37
+ updatedAt: number;
38
+ }>;
39
+ export type Wallet = z.infer<typeof WalletSchema>;
40
+ export declare const CreateWalletRequestSchema: z.ZodObject<{
41
+ name: z.ZodString;
42
+ chain: z.ZodDefault<z.ZodEnum<["solana", "ethereum"]>>;
43
+ environment: z.ZodDefault<z.ZodEnum<["testnet", "mainnet"]>>;
44
+ }, "strip", z.ZodTypeAny, {
45
+ name: string;
46
+ chain: "solana" | "ethereum";
47
+ environment: "mainnet" | "testnet";
48
+ }, {
49
+ name: string;
50
+ chain?: "solana" | "ethereum" | undefined;
51
+ environment?: "mainnet" | "testnet" | undefined;
52
+ }>;
53
+ export type CreateWalletRequest = z.infer<typeof CreateWalletRequestSchema>;
54
+ //# sourceMappingURL=wallet.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/wallet.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYvB,CAAC;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAIpC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod';
2
+ import { ChainTypeEnum, NetworkTypeEnum, EnvironmentTypeEnum, WalletStatusEnum, } from '../enums/index.js';
3
+ export const WalletSchema = z.object({
4
+ id: z.string().uuid(),
5
+ name: z.string().min(1).max(100),
6
+ chain: ChainTypeEnum,
7
+ environment: EnvironmentTypeEnum,
8
+ defaultNetwork: NetworkTypeEnum.nullable(),
9
+ publicKey: z.string(),
10
+ status: WalletStatusEnum,
11
+ ownerAddress: z.string().nullable(),
12
+ ownerVerified: z.boolean(),
13
+ createdAt: z.number().int(),
14
+ updatedAt: z.number().int(),
15
+ });
16
+ export const CreateWalletRequestSchema = z.object({
17
+ name: z.string().min(1).max(100),
18
+ chain: ChainTypeEnum.default('solana'),
19
+ environment: EnvironmentTypeEnum.default('testnet'),
20
+ });
21
+ //# sourceMappingURL=wallet.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.schema.js","sourceRoot":"","sources":["../../src/schemas/wallet.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAChC,KAAK,EAAE,aAAa;IACpB,WAAW,EAAE,mBAAmB;IAChC,cAAc,EAAE,eAAe,CAAC,QAAQ,EAAE;IAC1C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,MAAM,EAAE,gBAAgB;IACxB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE;IAC1B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;CAC5B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAChC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC;IACtC,WAAW,EAAE,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC;CACpD,CAAC,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * IChainAdapter Contract Test -- shared suite.
3
+ *
4
+ * This file exports `chainAdapterContractTests`, a factory that generates
5
+ * a full describe-block verifying 22 IChainAdapter methods for **shape**
6
+ * conformance (return-type structure, not concrete values).
7
+ *
8
+ * Usage: import into adapter-specific test files and call with a factory
9
+ * function that produces the adapter under test.
10
+ *
11
+ * CTST-01: MockChainAdapter vs SolanaAdapter
12
+ * CTST-02: MockChainAdapter vs EvmAdapter (buildBatch -> BATCH_NOT_SUPPORTED)
13
+ */
14
+ import type { IChainAdapter, ChainType } from '../index.js';
15
+ export interface ChainAdapterContractOptions {
16
+ /** SolanaAdapter -> 'solana', EvmAdapter -> 'ethereum' */
17
+ expectedChain: ChainType;
18
+ /** A valid address for the target chain (used in getBalance, etc.) */
19
+ validAddress: string;
20
+ /** A second valid address for transfer destinations */
21
+ validAddress2?: string;
22
+ /** If true, buildBatch must throw BATCH_NOT_SUPPORTED (EVM) */
23
+ batchNotSupported?: boolean;
24
+ /** If provided, connect() is called before pipeline tests */
25
+ rpcUrl?: string;
26
+ /** Private key for signTransaction / signExternalTransaction */
27
+ privateKey?: Uint8Array;
28
+ /**
29
+ * Methods to skip entirely (e.g. methods whose RPC mocking is too complex).
30
+ * Each entry is the method name.
31
+ */
32
+ skipMethods?: string[];
33
+ }
34
+ /**
35
+ * Generate a full IChainAdapter contract test suite.
36
+ *
37
+ * @param factory - Function returning an IChainAdapter (or Promise<IChainAdapter>).
38
+ * Called once in beforeAll.
39
+ * @param options - Configuration controlling chain-specific behavior.
40
+ */
41
+ export declare function chainAdapterContractTests(factory: () => IChainAdapter | Promise<IChainAdapter>, options: ChainAdapterContractOptions): void;
42
+ //# sourceMappingURL=chain-adapter-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain-adapter-contract.d.ts","sourceRoot":"","sources":["../../src/testing/chain-adapter-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EAOV,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,2BAA2B;IAC1C,0DAA0D;IAC1D,aAAa,EAAE,SAAS,CAAC;IACzB,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAkED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,EACrD,OAAO,EAAE,2BAA2B,GACnC,IAAI,CA4YN"}
@@ -0,0 +1,370 @@
1
+ /**
2
+ * IChainAdapter Contract Test -- shared suite.
3
+ *
4
+ * This file exports `chainAdapterContractTests`, a factory that generates
5
+ * a full describe-block verifying 22 IChainAdapter methods for **shape**
6
+ * conformance (return-type structure, not concrete values).
7
+ *
8
+ * Usage: import into adapter-specific test files and call with a factory
9
+ * function that produces the adapter under test.
10
+ *
11
+ * CTST-01: MockChainAdapter vs SolanaAdapter
12
+ * CTST-02: MockChainAdapter vs EvmAdapter (buildBatch -> BATCH_NOT_SUPPORTED)
13
+ */
14
+ import { describe, it, expect, beforeAll } from 'vitest';
15
+ // ---------------------------------------------------------------------------
16
+ // Helpers
17
+ // ---------------------------------------------------------------------------
18
+ function shouldSkip(opts, method) {
19
+ return opts.skipMethods?.includes(method) ?? false;
20
+ }
21
+ /** Build a minimal TransferRequest for testing. */
22
+ function makeTransferRequest(opts) {
23
+ return {
24
+ from: opts.validAddress,
25
+ to: opts.validAddress2 ?? opts.validAddress,
26
+ amount: 1000n,
27
+ };
28
+ }
29
+ /** Build a minimal TokenTransferParams for testing. */
30
+ function makeTokenTransferParams(opts) {
31
+ return {
32
+ from: opts.validAddress,
33
+ to: opts.validAddress2 ?? opts.validAddress,
34
+ amount: 1000n,
35
+ token: { address: opts.validAddress, decimals: 6, symbol: 'USDC' },
36
+ };
37
+ }
38
+ /** Build a minimal ContractCallParams for testing. */
39
+ function makeContractCallParams(opts) {
40
+ return {
41
+ from: opts.validAddress,
42
+ to: opts.validAddress2 ?? opts.validAddress,
43
+ programId: opts.validAddress,
44
+ instructionData: new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]),
45
+ calldata: '0xdeadbeef00000000',
46
+ accounts: [{ pubkey: opts.validAddress, isSigner: true, isWritable: true }],
47
+ };
48
+ }
49
+ /** Build a minimal ApproveParams for testing. */
50
+ function makeApproveParams(opts) {
51
+ return {
52
+ from: opts.validAddress,
53
+ spender: opts.validAddress2 ?? opts.validAddress,
54
+ token: { address: opts.validAddress, decimals: 6, symbol: 'USDC' },
55
+ amount: 1000n,
56
+ };
57
+ }
58
+ /** Build a minimal BatchParams for testing. */
59
+ function makeBatchParams(opts) {
60
+ return {
61
+ from: opts.validAddress,
62
+ instructions: [
63
+ { from: opts.validAddress, to: opts.validAddress2 ?? opts.validAddress, amount: 500n },
64
+ { from: opts.validAddress, to: opts.validAddress2 ?? opts.validAddress, amount: 500n },
65
+ ],
66
+ };
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Contract Test Factory
70
+ // ---------------------------------------------------------------------------
71
+ /**
72
+ * Generate a full IChainAdapter contract test suite.
73
+ *
74
+ * @param factory - Function returning an IChainAdapter (or Promise<IChainAdapter>).
75
+ * Called once in beforeAll.
76
+ * @param options - Configuration controlling chain-specific behavior.
77
+ */
78
+ export function chainAdapterContractTests(factory, options) {
79
+ let adapter;
80
+ beforeAll(async () => {
81
+ adapter = await factory();
82
+ });
83
+ // ========================================================================
84
+ // 1. Readonly Properties (2)
85
+ // ========================================================================
86
+ describe('readonly properties', () => {
87
+ it('chain must be a valid ChainType', () => {
88
+ expect(['solana', 'ethereum'].includes(adapter.chain), `IChainAdapter.chain: expected 'solana' | 'ethereum', got '${adapter.chain}'`).toBe(true);
89
+ expect(adapter.chain).toBe(options.expectedChain);
90
+ });
91
+ it('network must be a string (valid NetworkType)', () => {
92
+ expect(typeof adapter.network === 'string' && adapter.network.length > 0, `IChainAdapter.network: expected non-empty string, got '${String(adapter.network)}'`).toBe(true);
93
+ });
94
+ });
95
+ // ========================================================================
96
+ // 2. Connection (4): connect, disconnect, isConnected, getHealth
97
+ // ========================================================================
98
+ describe('connection methods', () => {
99
+ it('isConnected() returns boolean', () => {
100
+ if (shouldSkip(options, 'isConnected'))
101
+ return;
102
+ const result = adapter.isConnected();
103
+ expect(typeof result === 'boolean', `IChainAdapter.isConnected: expected boolean, got ${typeof result}`).toBe(true);
104
+ });
105
+ it('getHealth() returns HealthInfo shape', async () => {
106
+ if (shouldSkip(options, 'getHealth'))
107
+ return;
108
+ const health = await adapter.getHealth();
109
+ expect(typeof health.healthy === 'boolean', `IChainAdapter.getHealth: healthy must be boolean, got ${typeof health.healthy}`).toBe(true);
110
+ expect(typeof health.latencyMs === 'number', `IChainAdapter.getHealth: latencyMs must be number, got ${typeof health.latencyMs}`).toBe(true);
111
+ });
112
+ it('connect() + isConnected() returns true', async () => {
113
+ if (shouldSkip(options, 'connect'))
114
+ return;
115
+ if (!options.rpcUrl)
116
+ return; // skip if no RPC URL provided
117
+ await adapter.connect(options.rpcUrl);
118
+ expect(adapter.isConnected(), 'IChainAdapter.connect: after connect(), isConnected() must return true').toBe(true);
119
+ });
120
+ it('disconnect() + isConnected() returns false', async () => {
121
+ if (shouldSkip(options, 'disconnect'))
122
+ return;
123
+ await adapter.disconnect();
124
+ expect(adapter.isConnected(), 'IChainAdapter.disconnect: after disconnect(), isConnected() must return false').toBe(false);
125
+ // Reconnect for subsequent tests
126
+ if (options.rpcUrl) {
127
+ await adapter.connect(options.rpcUrl);
128
+ }
129
+ });
130
+ });
131
+ // ========================================================================
132
+ // 3. Balance (1): getBalance
133
+ // ========================================================================
134
+ describe('balance', () => {
135
+ it('getBalance() returns BalanceInfo shape', async () => {
136
+ if (shouldSkip(options, 'getBalance'))
137
+ return;
138
+ const balance = await adapter.getBalance(options.validAddress);
139
+ expect(typeof balance.address === 'string', `IChainAdapter.getBalance: address must be string, got ${typeof balance.address}`).toBe(true);
140
+ expect(typeof balance.balance === 'bigint', `IChainAdapter.getBalance: balance must be bigint, got ${typeof balance.balance}`).toBe(true);
141
+ expect(typeof balance.decimals === 'number', `IChainAdapter.getBalance: decimals must be number, got ${typeof balance.decimals}`).toBe(true);
142
+ expect(typeof balance.symbol === 'string', `IChainAdapter.getBalance: symbol must be string, got ${typeof balance.symbol}`).toBe(true);
143
+ });
144
+ });
145
+ // ========================================================================
146
+ // 4. Pipeline (4): buildTransaction, simulateTransaction, signTransaction, submitTransaction
147
+ // ========================================================================
148
+ describe('transaction pipeline', () => {
149
+ let builtTx;
150
+ it('buildTransaction() returns UnsignedTransaction shape', async () => {
151
+ if (shouldSkip(options, 'buildTransaction'))
152
+ return;
153
+ builtTx = await adapter.buildTransaction(makeTransferRequest(options));
154
+ assertUnsignedTransactionShape(builtTx, 'buildTransaction');
155
+ });
156
+ it('simulateTransaction() returns SimulationResult shape', async () => {
157
+ if (shouldSkip(options, 'simulateTransaction'))
158
+ return;
159
+ if (!builtTx)
160
+ builtTx = await adapter.buildTransaction(makeTransferRequest(options));
161
+ const result = await adapter.simulateTransaction(builtTx);
162
+ expect(typeof result.success === 'boolean', `IChainAdapter.simulateTransaction: success must be boolean, got ${typeof result.success}`).toBe(true);
163
+ expect(Array.isArray(result.logs), `IChainAdapter.simulateTransaction: logs must be array, got ${typeof result.logs}`).toBe(true);
164
+ });
165
+ it('signTransaction() returns Uint8Array with length > 0', async () => {
166
+ if (shouldSkip(options, 'signTransaction'))
167
+ return;
168
+ if (!options.privateKey)
169
+ return;
170
+ if (!builtTx)
171
+ builtTx = await adapter.buildTransaction(makeTransferRequest(options));
172
+ const signed = await adapter.signTransaction(builtTx, options.privateKey);
173
+ expect(signed instanceof Uint8Array, `IChainAdapter.signTransaction: must return Uint8Array, got ${typeof signed}`).toBe(true);
174
+ expect(signed.length > 0, 'IChainAdapter.signTransaction: returned Uint8Array must have length > 0').toBe(true);
175
+ });
176
+ it('submitTransaction() returns SubmitResult shape', async () => {
177
+ if (shouldSkip(options, 'submitTransaction'))
178
+ return;
179
+ if (!options.privateKey)
180
+ return;
181
+ if (!builtTx)
182
+ builtTx = await adapter.buildTransaction(makeTransferRequest(options));
183
+ const signed = await adapter.signTransaction(builtTx, options.privateKey);
184
+ const result = await adapter.submitTransaction(signed);
185
+ assertSubmitResultShape(result, 'submitTransaction');
186
+ });
187
+ });
188
+ // ========================================================================
189
+ // 5. Confirmation (1): waitForConfirmation
190
+ // ========================================================================
191
+ describe('confirmation', () => {
192
+ it('waitForConfirmation() returns SubmitResult shape', async () => {
193
+ if (shouldSkip(options, 'waitForConfirmation'))
194
+ return;
195
+ const result = await adapter.waitForConfirmation('mock-tx-hash-1234');
196
+ assertSubmitResultShape(result, 'waitForConfirmation');
197
+ });
198
+ });
199
+ // ========================================================================
200
+ // 6. Assets (1): getAssets
201
+ // ========================================================================
202
+ describe('assets', () => {
203
+ it('getAssets() returns AssetInfo[] shape', async () => {
204
+ if (shouldSkip(options, 'getAssets'))
205
+ return;
206
+ const assets = await adapter.getAssets(options.validAddress);
207
+ expect(Array.isArray(assets), `IChainAdapter.getAssets: must return array, got ${typeof assets}`).toBe(true);
208
+ if (assets.length > 0) {
209
+ const first = assets[0];
210
+ expect(typeof first.mint === 'string', `IChainAdapter.getAssets: each element must have mint:string`).toBe(true);
211
+ expect(typeof first.symbol === 'string', `IChainAdapter.getAssets: each element must have symbol:string`).toBe(true);
212
+ expect(typeof first.balance === 'bigint', `IChainAdapter.getAssets: each element must have balance:bigint`).toBe(true);
213
+ expect(typeof first.decimals === 'number', `IChainAdapter.getAssets: each element must have decimals:number`).toBe(true);
214
+ expect(typeof first.isNative === 'boolean', `IChainAdapter.getAssets: each element must have isNative:boolean`).toBe(true);
215
+ }
216
+ });
217
+ });
218
+ // ========================================================================
219
+ // 7. Fee (1): estimateFee
220
+ // ========================================================================
221
+ describe('fee estimation', () => {
222
+ it('estimateFee() returns FeeEstimate shape', async () => {
223
+ if (shouldSkip(options, 'estimateFee'))
224
+ return;
225
+ const fee = await adapter.estimateFee(makeTransferRequest(options));
226
+ expect(typeof fee.fee === 'bigint', `IChainAdapter.estimateFee: fee must be bigint, got ${typeof fee.fee}`).toBe(true);
227
+ });
228
+ });
229
+ // ========================================================================
230
+ // 8. Token (2): buildTokenTransfer, getTokenInfo
231
+ // ========================================================================
232
+ describe('token operations', () => {
233
+ it('buildTokenTransfer() returns UnsignedTransaction shape', async () => {
234
+ if (shouldSkip(options, 'buildTokenTransfer'))
235
+ return;
236
+ const tx = await adapter.buildTokenTransfer(makeTokenTransferParams(options));
237
+ assertUnsignedTransactionShape(tx, 'buildTokenTransfer');
238
+ });
239
+ it('getTokenInfo() returns TokenInfo shape', async () => {
240
+ if (shouldSkip(options, 'getTokenInfo'))
241
+ return;
242
+ const info = await adapter.getTokenInfo(options.validAddress);
243
+ expect(typeof info.address === 'string', `IChainAdapter.getTokenInfo: address must be string`).toBe(true);
244
+ expect(typeof info.symbol === 'string', `IChainAdapter.getTokenInfo: symbol must be string`).toBe(true);
245
+ expect(typeof info.name === 'string', `IChainAdapter.getTokenInfo: name must be string`).toBe(true);
246
+ expect(typeof info.decimals === 'number', `IChainAdapter.getTokenInfo: decimals must be number`).toBe(true);
247
+ });
248
+ });
249
+ // ========================================================================
250
+ // 9. Contract (2): buildContractCall, buildApprove
251
+ // ========================================================================
252
+ describe('contract operations', () => {
253
+ it('buildContractCall() returns UnsignedTransaction shape', async () => {
254
+ if (shouldSkip(options, 'buildContractCall'))
255
+ return;
256
+ const tx = await adapter.buildContractCall(makeContractCallParams(options));
257
+ assertUnsignedTransactionShape(tx, 'buildContractCall');
258
+ });
259
+ it('buildApprove() returns UnsignedTransaction shape', async () => {
260
+ if (shouldSkip(options, 'buildApprove'))
261
+ return;
262
+ const tx = await adapter.buildApprove(makeApproveParams(options));
263
+ assertUnsignedTransactionShape(tx, 'buildApprove');
264
+ });
265
+ });
266
+ // ========================================================================
267
+ // 10. Batch (1): buildBatch
268
+ // ========================================================================
269
+ describe('batch operations', () => {
270
+ if (options.batchNotSupported) {
271
+ it('buildBatch() throws BATCH_NOT_SUPPORTED', async () => {
272
+ if (shouldSkip(options, 'buildBatch'))
273
+ return;
274
+ try {
275
+ await adapter.buildBatch(makeBatchParams(options));
276
+ // Should have thrown
277
+ expect.fail('IChainAdapter.buildBatch: expected BATCH_NOT_SUPPORTED error but did not throw');
278
+ }
279
+ catch (error) {
280
+ // Check the error code or message contains BATCH_NOT_SUPPORTED
281
+ const err = error;
282
+ const hasBatchNotSupported = err.code === 'BATCH_NOT_SUPPORTED' ||
283
+ (err.message ?? '').includes('BATCH_NOT_SUPPORTED') ||
284
+ (err.message ?? '').includes('batch');
285
+ expect(hasBatchNotSupported, `IChainAdapter.buildBatch: expected BATCH_NOT_SUPPORTED error, got code=${err.code} message=${err.message}`).toBe(true);
286
+ }
287
+ });
288
+ }
289
+ else {
290
+ it('buildBatch() returns UnsignedTransaction shape', async () => {
291
+ if (shouldSkip(options, 'buildBatch'))
292
+ return;
293
+ const tx = await adapter.buildBatch(makeBatchParams(options));
294
+ assertUnsignedTransactionShape(tx, 'buildBatch');
295
+ });
296
+ }
297
+ });
298
+ // ========================================================================
299
+ // 11. Utility (3): getTransactionFee, getCurrentNonce, sweepAll
300
+ // ========================================================================
301
+ describe('utility operations', () => {
302
+ it('getTransactionFee() returns bigint', async () => {
303
+ if (shouldSkip(options, 'getTransactionFee'))
304
+ return;
305
+ // Build a tx first to pass to getTransactionFee
306
+ const tx = await adapter.buildTransaction(makeTransferRequest(options));
307
+ const fee = await adapter.getTransactionFee(tx);
308
+ expect(typeof fee === 'bigint', `IChainAdapter.getTransactionFee: must return bigint, got ${typeof fee}`).toBe(true);
309
+ });
310
+ it('getCurrentNonce() returns number', async () => {
311
+ if (shouldSkip(options, 'getCurrentNonce'))
312
+ return;
313
+ const nonce = await adapter.getCurrentNonce(options.validAddress);
314
+ expect(typeof nonce === 'number', `IChainAdapter.getCurrentNonce: must return number, got ${typeof nonce}`).toBe(true);
315
+ });
316
+ it('sweepAll() returns SweepResult shape', async () => {
317
+ if (shouldSkip(options, 'sweepAll'))
318
+ return;
319
+ if (!options.privateKey)
320
+ return;
321
+ const result = await adapter.sweepAll(options.validAddress, options.validAddress2 ?? options.validAddress, options.privateKey);
322
+ expect(typeof result.total === 'number', `IChainAdapter.sweepAll: total must be number, got ${typeof result.total}`).toBe(true);
323
+ expect(typeof result.succeeded === 'number', `IChainAdapter.sweepAll: succeeded must be number, got ${typeof result.succeeded}`).toBe(true);
324
+ expect(typeof result.failed === 'number', `IChainAdapter.sweepAll: failed must be number, got ${typeof result.failed}`).toBe(true);
325
+ expect(Array.isArray(result.results), `IChainAdapter.sweepAll: results must be array, got ${typeof result.results}`).toBe(true);
326
+ if (result.results.length > 0) {
327
+ const r = result.results[0];
328
+ expect(typeof r.mint === 'string', 'IChainAdapter.sweepAll: result.mint must be string').toBe(true);
329
+ expect(typeof r.amount === 'bigint', 'IChainAdapter.sweepAll: result.amount must be bigint').toBe(true);
330
+ }
331
+ });
332
+ });
333
+ // ========================================================================
334
+ // 12. Sign-only (2): parseTransaction, signExternalTransaction
335
+ // ========================================================================
336
+ describe('sign-only operations', () => {
337
+ it('parseTransaction() returns ParsedTransaction shape', async () => {
338
+ if (shouldSkip(options, 'parseTransaction'))
339
+ return;
340
+ // Use a mock raw transaction string (base64 for Solana, hex for EVM)
341
+ const rawTx = options.expectedChain === 'solana' ? 'AAAAAAAAAA==' : '0xdeadbeef';
342
+ const parsed = await adapter.parseTransaction(rawTx);
343
+ expect(Array.isArray(parsed.operations), `IChainAdapter.parseTransaction: operations must be array, got ${typeof parsed.operations}`).toBe(true);
344
+ expect(typeof parsed.rawTx === 'string', `IChainAdapter.parseTransaction: rawTx must be string, got ${typeof parsed.rawTx}`).toBe(true);
345
+ });
346
+ it('signExternalTransaction() returns SignedTransaction shape', async () => {
347
+ if (shouldSkip(options, 'signExternalTransaction'))
348
+ return;
349
+ if (!options.privateKey)
350
+ return;
351
+ const rawTx = options.expectedChain === 'solana' ? 'AAAAAAAAAA==' : '0xdeadbeef';
352
+ const signed = await adapter.signExternalTransaction(rawTx, options.privateKey);
353
+ expect(typeof signed.signedTransaction === 'string', `IChainAdapter.signExternalTransaction: signedTransaction must be string, got ${typeof signed.signedTransaction}`).toBe(true);
354
+ });
355
+ });
356
+ }
357
+ // ---------------------------------------------------------------------------
358
+ // Shared assertion helpers
359
+ // ---------------------------------------------------------------------------
360
+ function assertUnsignedTransactionShape(tx, method) {
361
+ expect(['solana', 'ethereum'].includes(tx.chain), `IChainAdapter.${method}: chain must be 'solana' | 'ethereum', got '${tx.chain}'`).toBe(true);
362
+ expect(tx.serialized instanceof Uint8Array, `IChainAdapter.${method}: serialized must be Uint8Array`).toBe(true);
363
+ expect(typeof tx.estimatedFee === 'bigint', `IChainAdapter.${method}: estimatedFee must be bigint, got ${typeof tx.estimatedFee}`).toBe(true);
364
+ expect(tx.metadata !== null && typeof tx.metadata === 'object', `IChainAdapter.${method}: metadata must be object`).toBe(true);
365
+ }
366
+ function assertSubmitResultShape(result, method) {
367
+ expect(typeof result.txHash === 'string', `IChainAdapter.${method}: txHash must be string, got ${typeof result.txHash}`).toBe(true);
368
+ expect(typeof result.status === 'string', `IChainAdapter.${method}: status must be string, got ${typeof result.status}`).toBe(true);
369
+ }
370
+ //# sourceMappingURL=chain-adapter-contract.js.map