@debridge-finance/borderless-validation-sdk 0.4.1 → 0.5.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 (160) hide show
  1. package/README.md +15 -0
  2. package/dist/cjs/helpers/solana-hook-instructions.js +66 -0
  3. package/dist/cjs/helpers/solana-hook-instructions.js.map +1 -0
  4. package/dist/cjs/helpers/solana-instruction.js +5 -1
  5. package/dist/cjs/helpers/solana-instruction.js.map +1 -1
  6. package/dist/cjs/helpers/solana-intent-id.js +11 -1
  7. package/dist/cjs/helpers/solana-intent-id.js.map +1 -1
  8. package/dist/cjs/helpers/solana-intent-instruction.js +106 -0
  9. package/dist/cjs/helpers/solana-intent-instruction.js.map +1 -0
  10. package/dist/cjs/types/enums.js +2 -8
  11. package/dist/cjs/types/enums.js.map +1 -1
  12. package/dist/cjs/types/response.js +12 -2
  13. package/dist/cjs/types/response.js.map +1 -1
  14. package/dist/cjs/types/validation.js +30 -0
  15. package/dist/cjs/types/validation.js.map +1 -1
  16. package/dist/cjs/validations/evm-required-actions.js +2 -0
  17. package/dist/cjs/validations/evm-required-actions.js.map +1 -1
  18. package/dist/cjs/validations/evm-sign712-shared.js +2 -5
  19. package/dist/cjs/validations/evm-sign712-shared.js.map +1 -1
  20. package/dist/cjs/validations/evm-transaction-scope.js +29 -0
  21. package/dist/cjs/validations/evm-transaction-scope.js.map +1 -0
  22. package/dist/cjs/validations/hooks-common.js +18 -15
  23. package/dist/cjs/validations/hooks-common.js.map +1 -1
  24. package/dist/cjs/validations/low-input-sweep-bundle.js +94 -0
  25. package/dist/cjs/validations/low-input-sweep-bundle.js.map +1 -0
  26. package/dist/cjs/validations/low-input-sweep-hook.js +204 -0
  27. package/dist/cjs/validations/low-input-sweep-hook.js.map +1 -0
  28. package/dist/cjs/validations/low-input-sweep.js +294 -0
  29. package/dist/cjs/validations/low-input-sweep.js.map +1 -0
  30. package/dist/cjs/validations/on-chain-intent-submission.js +16 -5
  31. package/dist/cjs/validations/on-chain-intent-submission.js.map +1 -1
  32. package/dist/cjs/validations/ptp.js +13 -15
  33. package/dist/cjs/validations/ptp.js.map +1 -1
  34. package/dist/cjs/validations/solana-embedded-intent.js +187 -0
  35. package/dist/cjs/validations/solana-embedded-intent.js.map +1 -0
  36. package/dist/cjs/validations/solana-hook.js +1 -1
  37. package/dist/cjs/validations/solana-hook.js.map +1 -1
  38. package/dist/cjs/validations/solana-intent-accounts.js +99 -0
  39. package/dist/cjs/validations/solana-intent-accounts.js.map +1 -0
  40. package/dist/cjs/validations/solana-low-input-sweep.js +251 -0
  41. package/dist/cjs/validations/solana-low-input-sweep.js.map +1 -0
  42. package/dist/cjs/validations/solana-required-actions.js +6 -2
  43. package/dist/cjs/validations/solana-required-actions.js.map +1 -1
  44. package/dist/cjs/validations/solana-transaction.js +25 -5
  45. package/dist/cjs/validations/solana-transaction.js.map +1 -1
  46. package/dist/cjs/validations/trade-grouping.js +23 -26
  47. package/dist/cjs/validations/trade-grouping.js.map +1 -1
  48. package/dist/cjs/validations/trade-matching.js +21 -13
  49. package/dist/cjs/validations/trade-matching.js.map +1 -1
  50. package/dist/cjs/validations/trades.js +33 -20
  51. package/dist/cjs/validations/trades.js.map +1 -1
  52. package/dist/cjs/validator.js +14 -5
  53. package/dist/cjs/validator.js.map +1 -1
  54. package/dist/cjs/whitelists/environment-config.js +45 -3
  55. package/dist/cjs/whitelists/environment-config.js.map +1 -1
  56. package/dist/cjs/whitelists/types.js.map +1 -1
  57. package/dist/esm/helpers/solana-hook-instructions.js +63 -0
  58. package/dist/esm/helpers/solana-hook-instructions.js.map +1 -0
  59. package/dist/esm/helpers/solana-instruction.js +4 -0
  60. package/dist/esm/helpers/solana-instruction.js.map +1 -1
  61. package/dist/esm/helpers/solana-intent-id.js +10 -1
  62. package/dist/esm/helpers/solana-intent-id.js.map +1 -1
  63. package/dist/esm/helpers/solana-intent-instruction.js +98 -0
  64. package/dist/esm/helpers/solana-intent-instruction.js.map +1 -0
  65. package/dist/esm/types/enums.js +0 -6
  66. package/dist/esm/types/enums.js.map +1 -1
  67. package/dist/esm/types/response.js +12 -2
  68. package/dist/esm/types/response.js.map +1 -1
  69. package/dist/esm/types/validation.js +30 -0
  70. package/dist/esm/types/validation.js.map +1 -1
  71. package/dist/esm/validations/evm-required-actions.js +2 -0
  72. package/dist/esm/validations/evm-required-actions.js.map +1 -1
  73. package/dist/esm/validations/evm-sign712-shared.js +2 -5
  74. package/dist/esm/validations/evm-sign712-shared.js.map +1 -1
  75. package/dist/esm/validations/evm-transaction-scope.js +26 -0
  76. package/dist/esm/validations/evm-transaction-scope.js.map +1 -0
  77. package/dist/esm/validations/hooks-common.js +18 -15
  78. package/dist/esm/validations/hooks-common.js.map +1 -1
  79. package/dist/esm/validations/low-input-sweep-bundle.js +91 -0
  80. package/dist/esm/validations/low-input-sweep-bundle.js.map +1 -0
  81. package/dist/esm/validations/low-input-sweep-hook.js +201 -0
  82. package/dist/esm/validations/low-input-sweep-hook.js.map +1 -0
  83. package/dist/esm/validations/low-input-sweep.js +291 -0
  84. package/dist/esm/validations/low-input-sweep.js.map +1 -0
  85. package/dist/esm/validations/on-chain-intent-submission.js +17 -6
  86. package/dist/esm/validations/on-chain-intent-submission.js.map +1 -1
  87. package/dist/esm/validations/ptp.js +13 -15
  88. package/dist/esm/validations/ptp.js.map +1 -1
  89. package/dist/esm/validations/solana-embedded-intent.js +184 -0
  90. package/dist/esm/validations/solana-embedded-intent.js.map +1 -0
  91. package/dist/esm/validations/solana-hook.js +2 -2
  92. package/dist/esm/validations/solana-hook.js.map +1 -1
  93. package/dist/esm/validations/solana-intent-accounts.js +95 -0
  94. package/dist/esm/validations/solana-intent-accounts.js.map +1 -0
  95. package/dist/esm/validations/solana-low-input-sweep.js +248 -0
  96. package/dist/esm/validations/solana-low-input-sweep.js.map +1 -0
  97. package/dist/esm/validations/solana-required-actions.js +6 -2
  98. package/dist/esm/validations/solana-required-actions.js.map +1 -1
  99. package/dist/esm/validations/solana-transaction.js +25 -5
  100. package/dist/esm/validations/solana-transaction.js.map +1 -1
  101. package/dist/esm/validations/trade-grouping.js +23 -26
  102. package/dist/esm/validations/trade-grouping.js.map +1 -1
  103. package/dist/esm/validations/trade-matching.js +21 -13
  104. package/dist/esm/validations/trade-matching.js.map +1 -1
  105. package/dist/esm/validations/trades.js +33 -20
  106. package/dist/esm/validations/trades.js.map +1 -1
  107. package/dist/esm/validator.js +14 -5
  108. package/dist/esm/validator.js.map +1 -1
  109. package/dist/esm/whitelists/environment-config.js +45 -3
  110. package/dist/esm/whitelists/environment-config.js.map +1 -1
  111. package/dist/esm/whitelists/types.js.map +1 -1
  112. package/dist/types/helpers/solana-hook-instructions.d.ts +14 -0
  113. package/dist/types/helpers/solana-hook-instructions.d.ts.map +1 -0
  114. package/dist/types/helpers/solana-instruction.d.ts +3 -0
  115. package/dist/types/helpers/solana-instruction.d.ts.map +1 -1
  116. package/dist/types/helpers/solana-intent-id.d.ts +5 -0
  117. package/dist/types/helpers/solana-intent-id.d.ts.map +1 -1
  118. package/dist/types/helpers/solana-intent-instruction.d.ts +34 -0
  119. package/dist/types/helpers/solana-intent-instruction.d.ts.map +1 -0
  120. package/dist/types/types/enums.d.ts +0 -4
  121. package/dist/types/types/enums.d.ts.map +1 -1
  122. package/dist/types/types/response.d.ts +71 -1
  123. package/dist/types/types/response.d.ts.map +1 -1
  124. package/dist/types/types/validation.d.ts +29 -0
  125. package/dist/types/types/validation.d.ts.map +1 -1
  126. package/dist/types/validations/evm-required-actions.d.ts.map +1 -1
  127. package/dist/types/validations/evm-sign712-shared.d.ts.map +1 -1
  128. package/dist/types/validations/evm-transaction-scope.d.ts +3 -0
  129. package/dist/types/validations/evm-transaction-scope.d.ts.map +1 -0
  130. package/dist/types/validations/hooks-common.d.ts +2 -1
  131. package/dist/types/validations/hooks-common.d.ts.map +1 -1
  132. package/dist/types/validations/low-input-sweep-bundle.d.ts +3 -0
  133. package/dist/types/validations/low-input-sweep-bundle.d.ts.map +1 -0
  134. package/dist/types/validations/low-input-sweep-hook.d.ts +9 -0
  135. package/dist/types/validations/low-input-sweep-hook.d.ts.map +1 -0
  136. package/dist/types/validations/low-input-sweep.d.ts +15 -0
  137. package/dist/types/validations/low-input-sweep.d.ts.map +1 -0
  138. package/dist/types/validations/on-chain-intent-submission.d.ts.map +1 -1
  139. package/dist/types/validations/ptp.d.ts +3 -2
  140. package/dist/types/validations/ptp.d.ts.map +1 -1
  141. package/dist/types/validations/solana-embedded-intent.d.ts +3 -0
  142. package/dist/types/validations/solana-embedded-intent.d.ts.map +1 -0
  143. package/dist/types/validations/solana-hook.d.ts.map +1 -1
  144. package/dist/types/validations/solana-intent-accounts.d.ts +14 -0
  145. package/dist/types/validations/solana-intent-accounts.d.ts.map +1 -0
  146. package/dist/types/validations/solana-low-input-sweep.d.ts +9 -0
  147. package/dist/types/validations/solana-low-input-sweep.d.ts.map +1 -0
  148. package/dist/types/validations/solana-required-actions.d.ts.map +1 -1
  149. package/dist/types/validations/solana-transaction.d.ts.map +1 -1
  150. package/dist/types/validations/trade-grouping.d.ts +1 -1
  151. package/dist/types/validations/trade-grouping.d.ts.map +1 -1
  152. package/dist/types/validations/trade-matching.d.ts +1 -1
  153. package/dist/types/validations/trade-matching.d.ts.map +1 -1
  154. package/dist/types/validations/trades.d.ts +1 -1
  155. package/dist/types/validations/trades.d.ts.map +1 -1
  156. package/dist/types/validator.d.ts.map +1 -1
  157. package/dist/types/whitelists/environment-config.d.ts.map +1 -1
  158. package/dist/types/whitelists/types.d.ts +1 -0
  159. package/dist/types/whitelists/types.d.ts.map +1 -1
  160. package/package.json +70 -66
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.matchLowInputSweepHooks = matchLowInputSweepHooks;
4
+ const viem_1 = require("viem");
5
+ const types_1 = require("../types");
6
+ const address_1 = require("../helpers/address");
7
+ const solana_instruction_1 = require("../helpers/solana-instruction");
8
+ const evm_calldata_1 = require("../helpers/evm-calldata");
9
+ const integer_1 = require("../helpers/integer");
10
+ const solana_low_input_sweep_1 = require("./solana-low-input-sweep");
11
+ // CRITICAL: one independently bound transfer hook must cover each sweep.
12
+ // User hooks retain their request positions; among appended hooks, match by
13
+ // source chain, authority, asset and amount rather than trusting metadata order.
14
+ function matchLowInputSweepHooks(request, response, sweeps, envConfig) {
15
+ const result = { expectedHooks: new Map(), violations: [] };
16
+ for (const sweep of sweeps) {
17
+ const match = findSweepTransfer(request, response, sweep, result.expectedHooks);
18
+ if (match === undefined) {
19
+ result.violations.push({
20
+ code: types_1.ViolationCode.LowInputSweepHookMissing,
21
+ message: "low-input sweep must have its own matching native/token transfer preHook",
22
+ path: `response.lowInputSweeps[${sweep.sweepIndex}]`,
23
+ expected: {
24
+ tradeIndex: sweep.requestIndex,
25
+ chainId: sweep.trade.srcChainId,
26
+ tokenAddress: sweep.trade.srcChainTokenIn,
27
+ from: sweep.sender,
28
+ amount: sweep.amount.toString(),
29
+ },
30
+ });
31
+ continue;
32
+ }
33
+ // Binding identifies the hook but does not authorize its recipient or action
34
+ // kinds. Report those violations even when the transfer itself matches.
35
+ result.expectedHooks.set(match.hookIndex, match.expectedHook);
36
+ result.violations.push(...validateSweepRecipient(sweep, match, envConfig));
37
+ result.violations.push(...validateSweepSigningActions(response.preHooks[match.hookIndex].requiredActions, `response.preHooks[${match.hookIndex}]`, sweep.realChainId));
38
+ }
39
+ return result;
40
+ }
41
+ // Finds an unused appended hook matching this sweep. Returns `undefined` if none
42
+ // matches; the caller then reports LowInputSweepHookMissing.
43
+ function findSweepTransfer(request, response, sweep, matchedHooks) {
44
+ const operation = (0, address_1.getChainEngine)(sweep.realChainId) === types_1.ChainEngine.Solana
45
+ ? types_1.SolanaActionOperation.Hook : types_1.EvmActionOperation.Hook;
46
+ // User-provided hooks keep their request positions and cannot cover an added sweep.
47
+ for (let i = request.preHooks?.length ?? 0; i < response.preHooks.length; i++) {
48
+ // A single hook cannot cover multiple sweep entries.
49
+ if (matchedHooks.has(i))
50
+ continue;
51
+ const payload = response.preHooks[i];
52
+ const hook = payload.hook;
53
+ // Compensation transfers can have identical asset/amount/from values.
54
+ // They must not consume a sweep slot; full action validation still runs.
55
+ if (hook.gasCompensationInfo !== undefined
56
+ || !payload.requiredActions.some(action => action.actions.includes(operation)))
57
+ continue;
58
+ if (hook.chainId !== sweep.trade.srcChainId
59
+ || !(0, address_1.addressEquals)(sweep.realChainId, hook.from, sweep.sender)) {
60
+ continue;
61
+ }
62
+ const transfer = readMatchingTransfer(hook, sweep);
63
+ if (transfer !== undefined) {
64
+ return {
65
+ hookIndex: i,
66
+ ...transfer,
67
+ expectedHook: buildExpectedSweepHook(hook, sweep, transfer.destinationAddress),
68
+ };
69
+ }
70
+ }
71
+ // The caller reports LowInputSweepHookMissing; no sweep is silently unbound.
72
+ return undefined;
73
+ }
74
+ // Reads a transfer using the source chain's encoding. Returns `undefined` if it
75
+ // cannot be bound to the sweep; destination whitelisting is checked separately.
76
+ function readMatchingTransfer(hook, sweep) {
77
+ if ((0, address_1.getChainEngine)(sweep.realChainId) === types_1.ChainEngine.Solana) {
78
+ return (0, solana_low_input_sweep_1.readSolanaSweepTransfer)(hook, sweep);
79
+ }
80
+ const recipient = readEvmMatchingTransferRecipient(hook, sweep);
81
+ return recipient === undefined ? undefined : { destinationAddress: recipient };
82
+ }
83
+ // Checks EVM/Tron native or ERC20 transfer encoding and the exact sweep amount.
84
+ // Returns the recipient address, or `undefined` for a malformed/non-matching call.
85
+ function readEvmMatchingTransferRecipient(hook, sweep) {
86
+ if (hook.to === undefined)
87
+ return undefined;
88
+ try {
89
+ const value = (0, integer_1.parseIntegerString)(hook.value ?? "0");
90
+ // Native transfers send the entire amount through value, without calldata.
91
+ if ((0, address_1.isNativeToken)(sweep.trade.srcChainTokenIn, sweep.realChainId)) {
92
+ return hook.data.toLowerCase() === "0x"
93
+ && value === sweep.amount
94
+ && (0, address_1.isAddressRepresentationValidForChain)(sweep.realChainId, hook.to)
95
+ ? hook.to : undefined;
96
+ }
97
+ // ERC20 transfers call the requested token contract and must not also send native funds.
98
+ if (value !== 0n
99
+ || !(0, address_1.addressEquals)(sweep.realChainId, hook.to, sweep.trade.srcChainTokenIn)) {
100
+ return undefined;
101
+ }
102
+ const transfer = (0, evm_calldata_1.decodeTransferCalldata)(hook.data);
103
+ const encoded = (0, viem_1.encodeFunctionData)({
104
+ abi: viem_1.erc20Abi,
105
+ functionName: "transfer",
106
+ args: [transfer.to, sweep.amount],
107
+ });
108
+ // CRITICAL: re-encoding rejects trailing calldata and non-canonical ABI
109
+ // operands that a permissive decoder might otherwise ignore.
110
+ return transfer.amount === sweep.amount
111
+ && encoded.toLowerCase() === hook.data.toLowerCase()
112
+ ? transfer.to : undefined;
113
+ }
114
+ catch {
115
+ // This candidate cannot bind the sweep. Missing bindings are reported by
116
+ // matchLowInputSweepHooks; unmatched appended hooks still undergo their
117
+ // ordinary compensation/count checks.
118
+ return undefined;
119
+ }
120
+ }
121
+ // Builds the expected payload for ordinary hook echo/signing checks after transfer
122
+ // matching. Recipient authorization remains a separate validation step.
123
+ function buildExpectedSweepHook(hook, sweep, recipient) {
124
+ const native = (0, address_1.isNativeToken)(sweep.trade.srcChainTokenIn, sweep.realChainId);
125
+ const solana = (0, address_1.getChainEngine)(sweep.realChainId) === types_1.ChainEngine.Solana;
126
+ return {
127
+ chainId: sweep.trade.srcChainId,
128
+ from: sweep.sender,
129
+ to: solana ? undefined : (native ? recipient : sweep.trade.srcChainTokenIn),
130
+ // The matched bytes/value encode the verified sweep amount (fixed or
131
+ // API-resolved max-like); preserve spelling for the hook echo checks.
132
+ data: hook.data,
133
+ value: solana ? undefined : hook.value,
134
+ isAtomic: false,
135
+ placeHolders: [],
136
+ // Solana always signs the independently decoded transaction bytes;
137
+ // hook.type does not select a different signing representation there.
138
+ // EVM/Tron sweeps must use Delegated/default, never Direct.
139
+ type: solana ? hook.type
140
+ : (hook.type === types_1.BundleHookType.Delegated ? types_1.BundleHookType.Delegated : undefined),
141
+ };
142
+ }
143
+ // CRITICAL: a sweep may ask the user to sign, not to submit a transaction.
144
+ // Apply this to every action, including malformed extra/Delegate actions;
145
+ // operation counts and the permitted signing shapes are checked by validateHooks.
146
+ function validateSweepSigningActions(actions, basePath, realChainId) {
147
+ const violations = [];
148
+ const solana = (0, address_1.getChainEngine)(realChainId) === types_1.ChainEngine.Solana;
149
+ const transactionKind = solana ? types_1.SolanaActionKind.Transaction : types_1.EvmActionKind.Transaction;
150
+ for (let i = 0; i < actions.length; i++) {
151
+ if (actions[i].type !== transactionKind)
152
+ continue;
153
+ violations.push({
154
+ code: solana ? types_1.ViolationCode.SolanaForbiddenTransactionWithAA : types_1.ViolationCode.ForbiddenTransactionWithAA,
155
+ message: "low-input sweep actions must request signatures, not user transaction submission",
156
+ path: `${basePath}.requiredActions[${i}].type`,
157
+ actual: actions[i].type,
158
+ });
159
+ }
160
+ return violations;
161
+ }
162
+ // Checks the transfer destination against the source chain/environment sweep whitelist.
163
+ // For SPL, whitelist entries are owners and the actual destination must be their ATA.
164
+ function validateSweepRecipient(sweep, match, envConfig) {
165
+ const violations = [];
166
+ const allowedOwners = envConfig.sweepRecipientAddresses[sweep.realChainId] ?? [];
167
+ const allowed = getSweepRecipientDestinations(sweep, match, allowedOwners);
168
+ // CRITICAL: magic intent senders do not authorize sweep recipients. An empty
169
+ // environment/chain whitelist rejects every recipient, rather than disabling
170
+ // this check. SPL destinations are ATAs derived from the whitelisted owners.
171
+ if (!allowed.some(address => (0, address_1.addressEquals)(sweep.realChainId, address, match.destinationAddress))) {
172
+ const nativeEvm = (0, address_1.getChainEngine)(sweep.realChainId) !== types_1.ChainEngine.Solana
173
+ && (0, address_1.isNativeToken)(sweep.trade.srcChainTokenIn, sweep.realChainId);
174
+ const field = nativeEvm ? "to" : "data";
175
+ violations.push({
176
+ code: types_1.ViolationCode.LowInputSweepRecipientNotWhitelisted,
177
+ message: match.tokenProgram === undefined
178
+ ? "sweep transfer recipient is not whitelisted for the environment and source chain"
179
+ : "sweep token destination must be an ATA of a whitelisted recipient for the source mint",
180
+ path: `response.preHooks[${match.hookIndex}].hook.${field}`,
181
+ expected: allowed,
182
+ actual: match.destinationAddress,
183
+ });
184
+ }
185
+ return violations;
186
+ }
187
+ // Returns directly whitelisted recipients for native/EVM transfers, or derived
188
+ // destination ATAs for SPL. Invalid owner entries authorize no SPL destination.
189
+ function getSweepRecipientDestinations(sweep, match, allowedOwners) {
190
+ const tokenProgram = match.tokenProgram;
191
+ if (tokenProgram === undefined)
192
+ return [...allowedOwners];
193
+ return allowedOwners.flatMap(owner => {
194
+ try {
195
+ return [(0, solana_instruction_1.deriveAta)(owner, sweep.trade.srcChainTokenIn, tokenProgram)];
196
+ }
197
+ catch {
198
+ // An invalid whitelist owner cannot authorize a token destination.
199
+ // No matching derived ATA produces LowInputSweepRecipientNotWhitelisted.
200
+ return [];
201
+ }
202
+ });
203
+ }
204
+ //# sourceMappingURL=low-input-sweep-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"low-input-sweep-hook.js","sourceRoot":"","sources":["../../../src/validations/low-input-sweep-hook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,294 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateLowInputSweeps = validateLowInputSweeps;
4
+ const viem_1 = require("viem");
5
+ const types_1 = require("../types");
6
+ const address_1 = require("../helpers/address");
7
+ const integer_1 = require("../helpers/integer");
8
+ const subscription_to_chain_id_1 = require("../whitelists/subscription-to-chain-id");
9
+ const interactions_1 = require("../helpers/interactions");
10
+ const hex_1 = require("../helpers/hex");
11
+ const amount_1 = require("../helpers/amount");
12
+ const low_input_sweep_bundle_1 = require("./low-input-sweep-bundle");
13
+ // CRITICAL: a sweep may remove only its own request trade from intent validation.
14
+ // The economic decision to sweep is delegated to the API, not recomputed from
15
+ // response-supplied prices. Transfer authorization is checked separately.
16
+ function validateLowInputSweeps(request, response, quoteMode) {
17
+ const result = {
18
+ sweeps: [],
19
+ violations: (0, low_input_sweep_bundle_1.validateLowInputSweepBundle)(request, response, quoteMode),
20
+ };
21
+ // Safe skip: prohibited modes or missing surviving trades/intents are
22
+ // reported above. Their metadata cannot remove request trades from the
23
+ // ordinary validation flow.
24
+ if (result.violations.length > 0)
25
+ return result;
26
+ const seen = new Set();
27
+ const sweeps = response.lowInputSweeps ?? [];
28
+ for (let i = 0; i < sweeps.length; i++) {
29
+ const sweep = sweeps[i];
30
+ const violations = validateSweepIndex(sweep.tradeIndex, request.trades.length, seen, i);
31
+ seen.add(sweep.tradeIndex);
32
+ if (violations.length > 0) {
33
+ result.violations.push(...violations);
34
+ continue;
35
+ }
36
+ // Only entries without metadata/amount violations become sweep contexts.
37
+ // Their transfer hooks and recipients are validated in a separate pass.
38
+ const entry = validateSweepTrade(sweep, request.trades[sweep.tradeIndex], i);
39
+ result.violations.push(...entry.violations);
40
+ result.sweeps.push(...entry.sweeps);
41
+ }
42
+ return result;
43
+ }
44
+ // Checks that an index refers to an existing original request trade and has not
45
+ // appeared in earlier sweep metadata. It is not an index into response.trades.
46
+ function validateSweepIndex(tradeIndex, tradeCount, seen, sweepIndex) {
47
+ const violations = [];
48
+ const path = `response.lowInputSweeps[${sweepIndex}].tradeIndex`;
49
+ // CRITICAL: indices must identify distinct entries in the original request.
50
+ if (!Number.isSafeInteger(tradeIndex)
51
+ || tradeIndex < 0
52
+ || tradeIndex >= tradeCount) {
53
+ violations.push({
54
+ code: types_1.ViolationCode.LowInputSweepTradeIndexInvalid,
55
+ message: "lowInputSweeps.tradeIndex must identify an existing request trade",
56
+ path,
57
+ expected: { min: 0, maxExclusive: tradeCount },
58
+ actual: tradeIndex,
59
+ });
60
+ }
61
+ else if (seen.has(tradeIndex)) {
62
+ violations.push({
63
+ code: types_1.ViolationCode.LowInputSweepTradeDuplicate,
64
+ message: "a request trade must not be swept more than once",
65
+ path,
66
+ actual: tradeIndex,
67
+ });
68
+ }
69
+ return violations;
70
+ }
71
+ // Binds one sweep entry to its original request trade and parses its transfer amount.
72
+ // Returns no sweep context when any check fails, so the trade remains in ordinary validation.
73
+ function validateSweepTrade(sweep, trade, sweepIndex) {
74
+ const violations = [];
75
+ const realChainId = (0, subscription_to_chain_id_1.resolveChainId)(trade.srcChainId);
76
+ const destinationChainId = (0, subscription_to_chain_id_1.resolveChainId)(trade.dstChainId);
77
+ const basePath = `response.lowInputSweeps[${sweepIndex}]`;
78
+ // Both chains are needed to compare originalTrade addresses using the right formats.
79
+ if (realChainId === undefined || destinationChainId === undefined) {
80
+ violations.push({
81
+ code: types_1.ViolationCode.UnknownSubscriptionId,
82
+ message: "a swept request trade must use known source and destination subscriptionIds",
83
+ path: `request.trades[${sweep.tradeIndex}]`,
84
+ actual: { srcChainId: trade.srcChainId, dstChainId: trade.dstChainId },
85
+ });
86
+ return { sweeps: [], violations };
87
+ }
88
+ violations.push(...validateSweepIdentity(sweep, trade, realChainId, destinationChainId, basePath));
89
+ violations.push(...validateSweepSourceAuthority(trade, realChainId, basePath));
90
+ const amount = validateSweepAmount(sweep, trade, realChainId, basePath, violations);
91
+ if (violations.length > 0
92
+ || amount === undefined
93
+ || trade.srcChainAuthorityAddress === undefined) {
94
+ // Safe skip: invalid identity/authority and unbound amounts are reported
95
+ // above; these entries do not remove request trades.
96
+ return { sweeps: [], violations };
97
+ }
98
+ return {
99
+ sweeps: [{
100
+ sweepIndex,
101
+ requestIndex: sweep.tradeIndex,
102
+ realChainId,
103
+ trade,
104
+ sender: trade.srcChainAuthorityAddress,
105
+ amount,
106
+ }],
107
+ violations,
108
+ };
109
+ }
110
+ // Requires a valid source authority to bind the transfer.
111
+ function validateSweepSourceAuthority(trade, realChainId, basePath) {
112
+ const violations = [];
113
+ // CRITICAL: the transfer must be bound to a valid source authority for its chain.
114
+ if (trade.srcChainAuthorityAddress === undefined
115
+ || !(0, address_1.isAddressRepresentationValidForChain)(realChainId, trade.srcChainAuthorityAddress)) {
116
+ violations.push({
117
+ code: types_1.ViolationCode.LowInputSweepSourceAuthorityInvalid,
118
+ message: "a swept trade must have a valid source authority",
119
+ path: `${basePath}.originalTrade.srcChainAuthorityAddress`,
120
+ actual: { address: trade.srcChainAuthorityAddress, realChainId },
121
+ });
122
+ }
123
+ return violations;
124
+ }
125
+ // Compares duplicated sweep metadata with the request, using chain-aware address
126
+ // comparison and field-specific equivalence rules for the originalTrade echo.
127
+ function validateSweepIdentity(sweep, trade, sourceChainId, destinationChainId, basePath) {
128
+ const violations = [];
129
+ // CRITICAL: the duplicated metadata cannot redefine the asset or source chain.
130
+ if (sweep.chainId !== trade.srcChainId) {
131
+ violations.push(sweepMismatch(types_1.ViolationCode.LowInputSweepChainIdMismatch, `${basePath}.chainId`, trade.srcChainId, sweep.chainId));
132
+ }
133
+ if (!(0, address_1.addressEquals)(sourceChainId, sweep.tokenAddress, trade.srcChainTokenIn)) {
134
+ violations.push(sweepMismatch(types_1.ViolationCode.LowInputSweepTokenAddressMismatch, `${basePath}.tokenAddress`, trade.srcChainTokenIn, sweep.tokenAddress));
135
+ }
136
+ return [
137
+ ...violations,
138
+ ...validateOriginalTrade(sweep, trade, sourceChainId, destinationChainId, basePath),
139
+ ];
140
+ }
141
+ // CRITICAL: preserve every request field except the explicitly supported
142
+ // amount/default normalization.
143
+ function validateOriginalTrade(sweep, trade, sourceChainId, destinationChainId, basePath) {
144
+ const violations = [];
145
+ // Max-like amounts are resolved before sweep planning, with operating expenses
146
+ // no longer prepended to that trade. All other fields retain their request values.
147
+ const expectedTrade = (0, amount_1.isMaxAmountMode)(trade.srcChainTokenInAmount)
148
+ ? { ...trade, srcChainTokenInAmount: sweep.amount, prependOperatingExpenses: false }
149
+ : trade;
150
+ // Inspect fields from both objects so an added response field is not silently ignored.
151
+ // A sweep replaces the whole trade, including its trade-level calls. Echoing
152
+ // those calls does not authorize executing them: the hook matcher accepts only
153
+ // the bound transfer and permitted auxiliary instructions. Bundle hooks are unchanged.
154
+ const fields = new Set([
155
+ ...Object.keys(expectedTrade),
156
+ ...Object.keys(sweep.originalTrade),
157
+ ]);
158
+ for (const field of fields) {
159
+ if (!originalTradeFieldMatches(field, expectedTrade, sweep.originalTrade, sourceChainId, destinationChainId)) {
160
+ violations.push(sweepMismatch(types_1.ViolationCode.LowInputSweepOriginalTradeMismatch, `${basePath}.originalTrade.${field}`, expectedTrade[field], sweep.originalTrade[field]));
161
+ }
162
+ }
163
+ return violations;
164
+ }
165
+ const SOURCE_ADDRESS_FIELDS = [
166
+ "srcChainTokenIn", "srcChainAuthorityAddress", "srcAllowedCancelBeneficiary",
167
+ ];
168
+ const DESTINATION_ADDRESS_FIELDS = [
169
+ "dstChainTokenOut", "dstChainTokenOutRecipient", "dstChainAuthorityAddress", "allowedTaker",
170
+ ];
171
+ // Compares one echoed request field without requiring identical address casing or
172
+ // numeric spelling. Returns false for any difference outside the accepted field rules.
173
+ function originalTradeFieldMatches(field, requestTrade, originalTrade, sourceChainId, destinationChainId) {
174
+ const expected = requestTrade[field];
175
+ const actual = originalTrade[field];
176
+ // These request flags default to false; explicit false and omission are equivalent.
177
+ if (field === "prependOperatingExpenses" || field === "ptp") {
178
+ return (expected ?? false) === (actual ?? false);
179
+ }
180
+ if (field === "preInteractions" || field === "postInteractions") {
181
+ return (0, interactions_1.interactionsEqual)(sourceChainId, requestTrade[field], originalTrade[field]);
182
+ }
183
+ // An omitted destination amount means 'auto', including in the echoed original trade.
184
+ if (field === "dstChainTokenOutAmount") {
185
+ return integerOrLiteralEquals(expected === undefined ? types_1.SpecialAmount.Auto : String(expected), actual === undefined ? types_1.SpecialAmount.Auto : String(actual));
186
+ }
187
+ // For other fields, omission must match before applying representation equivalence.
188
+ if (expected === undefined || actual === undefined)
189
+ return expected === actual;
190
+ if (SOURCE_ADDRESS_FIELDS.includes(field) || DESTINATION_ADDRESS_FIELDS.includes(field)) {
191
+ const chainId = SOURCE_ADDRESS_FIELDS.includes(field) ? sourceChainId : destinationChainId;
192
+ return typeof expected === "string"
193
+ && typeof actual === "string"
194
+ && (0, address_1.addressEquals)(chainId, expected, actual);
195
+ }
196
+ if (field === "srcChainTokenInAmount") {
197
+ return integerOrLiteralEquals(String(expected), String(actual));
198
+ }
199
+ if (field === "dlnMetadata")
200
+ return (0, hex_1.hexEquals)(requestTrade[field], originalTrade[field]);
201
+ return expected === actual;
202
+ }
203
+ // Accepts identical literals or equal parsed integers. Different non-numeric
204
+ // amount modes cannot be treated as equivalent and return false.
205
+ function integerOrLiteralEquals(expected, actual) {
206
+ if (expected === actual)
207
+ return true;
208
+ try {
209
+ return (0, integer_1.parseIntegerString)(expected) === (0, integer_1.parseIntegerString)(actual);
210
+ }
211
+ catch {
212
+ // Non-numeric amount modes must have the same literal spelling.
213
+ return false;
214
+ }
215
+ }
216
+ // Returns the parsed transfer amount and records violations through the supplied array.
217
+ // Auto is rejected; fixed amounts must match the request; max-like amounts are API-resolved.
218
+ // A returned amount does not imply success: the caller must also check accumulated violations.
219
+ function validateSweepAmount(sweep, trade, realChainId, basePath, violations) {
220
+ // HIGH: auto source amounts cannot be replaced by sweep transfers.
221
+ if (trade.srcChainTokenInAmount === types_1.SpecialAmount.Auto) {
222
+ violations.push({
223
+ code: types_1.ViolationCode.LowInputSweepWithAutoSourceAmount,
224
+ message: "low-input sweeps are not allowed when srcChainTokenInAmount=auto",
225
+ path: `request.trades[${sweep.tradeIndex}].srcChainTokenInAmount`,
226
+ actual: trade.srcChainTokenInAmount,
227
+ });
228
+ return undefined;
229
+ }
230
+ const amount = parseSweepTransferAmount(sweep.amount, realChainId, `${basePath}.amount`, violations);
231
+ // Safe skip: malformed/out-of-range metadata amounts are reported by the parser.
232
+ if (amount === undefined)
233
+ return undefined;
234
+ // Max-like requests authorize API balance resolution, not a fixed number.
235
+ // The SDK cannot independently verify the balance or reserved portion.
236
+ // Hook validation still requires the exact resolved amount and whitelisted recipient.
237
+ if ((0, amount_1.isMaxAmountMode)(trade.srcChainTokenInAmount))
238
+ return amount;
239
+ violations.push(...validateFixedSweepAmount(amount, trade.srcChainTokenInAmount, sweep, realChainId, basePath));
240
+ return amount;
241
+ }
242
+ // Parses a positive transfer amount within the source engine's integer range.
243
+ // Returns `undefined` and appends a violation for malformed or out-of-range values.
244
+ function parseSweepTransferAmount(value, realChainId, path, violations) {
245
+ try {
246
+ const amount = (0, integer_1.parseIntegerString)(value);
247
+ // Solana transfer instructions encode uint64; EVM/Tron amounts use uint256.
248
+ const maximum = (0, address_1.getChainEngine)(realChainId) === types_1.ChainEngine.Solana ? viem_1.maxUint64 : viem_1.maxUint256;
249
+ // CRITICAL: fixed and API-resolved transfer amounts must be positive and encodable.
250
+ if (amount > 0n && amount <= maximum)
251
+ return amount;
252
+ violations.push({
253
+ code: types_1.ViolationCode.LowInputSweepAmountOutOfRange,
254
+ message: "amount must be > 0 and fit the source chain transfer amount",
255
+ path,
256
+ expected: { min: "1", max: maximum.toString() },
257
+ actual: value,
258
+ });
259
+ }
260
+ catch (error) {
261
+ violations.push({
262
+ code: types_1.ViolationCode.LowInputSweepAmountNotInteger,
263
+ message: "amount must be an integer",
264
+ path,
265
+ actual: value,
266
+ details: error,
267
+ });
268
+ }
269
+ return undefined;
270
+ }
271
+ // Checks a fixed request amount's format/range and requires exact numeric equality
272
+ // with the metadata amount. The transfer instruction is compared separately.
273
+ function validateFixedSweepAmount(amount, requestAmount, sweep, realChainId, basePath) {
274
+ const violations = [];
275
+ const requested = parseSweepTransferAmount(requestAmount, realChainId, `request.trades[${sweep.tradeIndex}].srcChainTokenInAmount`, violations);
276
+ // Safe skip: an invalid fixed request amount is reported by the parser.
277
+ if (requested === undefined)
278
+ return violations;
279
+ // CRITICAL: fixed requests retain their exact spending limit.
280
+ if (amount !== requested) {
281
+ violations.push({
282
+ code: types_1.ViolationCode.LowInputSweepAmountMismatch,
283
+ message: "sweep amount must equal the fixed request source amount",
284
+ path: `${basePath}.amount`,
285
+ expected: requested.toString(),
286
+ actual: sweep.amount,
287
+ });
288
+ }
289
+ return violations;
290
+ }
291
+ function sweepMismatch(code, path, expected, actual, message = "low-input sweep metadata must match the original request trade") {
292
+ return { code, message, path, expected, actual };
293
+ }
294
+ //# sourceMappingURL=low-input-sweep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"low-input-sweep.js","sourceRoot":"","sources":["../../../src/validations/low-input-sweep.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ const address_1 = require("../helpers/address");
6
6
  const subscription_to_chain_id_1 = require("../whitelists/subscription-to-chain-id");
7
7
  const SUPPORTED_ON_CHAIN_INTENT_SOURCE_ENGINES = [
8
8
  types_1.ChainEngine.EVM,
9
- types_1.ChainEngine.Tron,
9
+ types_1.ChainEngine.Solana,
10
10
  ];
11
11
  function validateOnChainIntentSubmission(request) {
12
12
  if (request.intentOnChainSubmission !== true)
@@ -14,9 +14,22 @@ function validateOnChainIntentSubmission(request) {
14
14
  return [
15
15
  ...validateAccountAbstractionDisabled(request),
16
16
  ...validateRefillDisabled(request),
17
+ ...validatePermitDisabled(request),
17
18
  ...validateSupportedSourceChains(request),
18
19
  ];
19
20
  }
21
+ // HIGH: on-chain intent submission does not use a permit action.
22
+ function validatePermitDisabled(request) {
23
+ if (request.approvalMode !== types_1.ApprovalMode.Permit)
24
+ return [];
25
+ return [{
26
+ code: types_1.ViolationCode.OnChainIntentForbiddenWithPermit,
27
+ message: "on-chain intent submission is incompatible with permit approval mode",
28
+ path: "request.approvalMode",
29
+ expected: types_1.ApprovalMode.Approve,
30
+ actual: request.approvalMode,
31
+ }];
32
+ }
20
33
  // HIGH: on-chain intent submission is incompatible with account abstraction.
21
34
  function validateAccountAbstractionDisabled(request) {
22
35
  if (!request.enableAccountAbstraction)
@@ -41,9 +54,7 @@ function validateRefillDisabled(request) {
41
54
  actual: request.useRefill,
42
55
  }];
43
56
  }
44
- // HIGH: on-chain intent submission uses the EVM-compatible flow supported by
45
- // EVM and Tron source chains (Solana is not currently supported by the API for
46
- // this flow).
57
+ // HIGH: reject only source engines for which the API has no on-chain submission flow.
47
58
  function validateSupportedSourceChains(request) {
48
59
  const violations = [];
49
60
  for (let i = 0; i < request.trades.length; i++) {
@@ -57,7 +68,7 @@ function validateSupportedSourceChains(request) {
57
68
  continue;
58
69
  violations.push({
59
70
  code: types_1.ViolationCode.OnChainIntentUnsupportedSourceChain,
60
- message: "on-chain intent submission requires an EVM or Tron source chain",
71
+ message: "on-chain intent submission requires an EVM or Solana source chain",
61
72
  path: `request.trades[${i}].srcChainId`,
62
73
  expected: {
63
74
  chainEngines: SUPPORTED_ON_CHAIN_INTENT_SOURCE_ENGINES.map(engine => types_1.ChainEngine[engine]),
@@ -1 +1 @@
1
- {"version":3,"file":"on-chain-intent-submission.js","sourceRoot":"","sources":["../../../src/validations/on-chain-intent-submission.ts"],"names":[],"mappings":";;AAcA,0EAUC;AAxBD,oCAKkB;AAClB,gDAAoD;AACpD,qFAAwE;AAExE,MAAM,wCAAwC,GAA2B;IACrE,mBAAW,CAAC,GAAG;IACf,mBAAW,CAAC,IAAI;CACnB,CAAC;AAEF,SAAgB,+BAA+B,CAC3C,OAA8B;IAE9B,IAAI,OAAO,CAAC,uBAAuB,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAExD,OAAO;QACH,GAAG,kCAAkC,CAAC,OAAO,CAAC;QAC9C,GAAG,sBAAsB,CAAC,OAAO,CAAC;QAClC,GAAG,6BAA6B,CAAC,OAAO,CAAC;KAC5C,CAAC;AACN,CAAC;AAED,6EAA6E;AAC7E,SAAS,kCAAkC,CAAC,OAA8B;IACtE,IAAI,CAAC,OAAO,CAAC,wBAAwB;QAAE,OAAO,EAAE,CAAC;IAEjD,OAAO,CAAC;YACJ,IAAI,EAAE,qBAAa,CAAC,4BAA4B;YAChD,OAAO,EAAE,qEAAqE;YAC9E,IAAI,EAAE,kCAAkC;YACxC,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,OAAO,CAAC,wBAAwB;SAC3C,CAAC,CAAC;AACP,CAAC;AAED,gEAAgE;AAChE,SAAS,sBAAsB,CAAC,OAA8B;IAC1D,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAE1C,OAAO,CAAC;YACJ,IAAI,EAAE,qBAAa,CAAC,gCAAgC;YACpD,OAAO,EAAE,wDAAwD;YACjE,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,OAAO,CAAC,SAAS;SAC5B,CAAC,CAAC;AACP,CAAC;AAED,6EAA6E;AAC7E,+EAA+E;AAC/E,cAAc;AACd,SAAS,6BAA6B,CAAC,OAA8B;IACjE,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,WAAW,GAAG,IAAA,yCAAc,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAErD,qFAAqF;QACrF,IAAI,WAAW,KAAK,SAAS;YAAE,SAAS;QAExC,MAAM,WAAW,GAAG,IAAA,wBAAc,EAAC,WAAW,CAAC,CAAC;QAChD,IAAI,wCAAwC,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,SAAS;QAE7E,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,mCAAmC;YACvD,OAAO,EAAE,iEAAiE;YAC1E,IAAI,EAAE,kBAAkB,CAAC,cAAc;YACvC,QAAQ,EAAE;gBACN,YAAY,EAAE,wCAAwC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,mBAAW,CAAC,MAAM,CAAC,CAAC;aAC5F;YACD,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,WAAW,EAAE,mBAAW,CAAC,WAAW,CAAC,EAAE;SAC/E,CAAC,CAAC;IACP,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"on-chain-intent-submission.js","sourceRoot":"","sources":["../../../src/validations/on-chain-intent-submission.ts"],"names":[],"mappings":"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"}