From b23ff95ffe388b25fbb8d24ebc3f4ce0dd3fe8b0 Mon Sep 17 00:00:00 2001 From: droplet Date: Wed, 10 Jun 2026 04:51:41 +0000 Subject: [PATCH 1/4] fix(sdk): accept null for optional fields in swapApprovalResponseSchema MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `/swap/approval` now serializes `approvalTxns`, `steps.originSwap`, `steps.destinationSwap`, and `swapTx` as explicit `null` (rather than omitting them) for cases where they don't apply — e.g. bridgeable-to- bridgeable routes return `null` for the swap legs. Zod's `.optional()` accepts `undefined` but rejects `null`, so `getSwapQuote` was throwing `Invalid swap approval response` on every same-token bridge quote. Switch the four affected fields to `.nullish()`. Downstream consumers (`executeSwapQuote`) already coerce these via truthiness checks, so runtime behavior is unchanged. Co-Authored-By: Claude Opus 4.7 --- .changeset/tolerate-null-swap-approval-fields.md | 5 +++++ packages/sdk/src/api/swap-approval.ts | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 .changeset/tolerate-null-swap-approval-fields.md diff --git a/.changeset/tolerate-null-swap-approval-fields.md b/.changeset/tolerate-null-swap-approval-fields.md new file mode 100644 index 0000000..2688206 --- /dev/null +++ b/.changeset/tolerate-null-swap-approval-fields.md @@ -0,0 +1,5 @@ +--- +"@across-protocol/app-sdk": patch +--- + +Accept `null` (in addition to `undefined`) for optional fields in `swapApprovalResponseSchema`: `approvalTxns`, `steps.originSwap`, `steps.destinationSwap`, and `swapTx`. The `/swap/approval` endpoint now serializes these as explicit `null` for cases where they don't apply (e.g. `bridgeableToBridgeable` routes), which previously caused `getSwapQuote` to throw `Invalid swap approval response`. Consumers already coerce to truthy, so behavior is unchanged. diff --git a/packages/sdk/src/api/swap-approval.ts b/packages/sdk/src/api/swap-approval.ts index 37f92ec..2bbef0e 100644 --- a/packages/sdk/src/api/swap-approval.ts +++ b/packages/sdk/src/api/swap-approval.ts @@ -201,11 +201,11 @@ export const swapApprovalResponseSchema = z.object({ data: z.string(), }), ) - .optional(), + .nullish(), steps: z.object({ - originSwap: swapStepSchema.optional(), + originSwap: swapStepSchema.nullish(), bridge: bridgeStepSchema, - destinationSwap: swapStepSchema.optional(), + destinationSwap: swapStepSchema.nullish(), }), inputToken: z.object({ address: anyChainAddress, @@ -280,7 +280,7 @@ export const swapApprovalResponseSchema = z.object({ expectedOutputAmount: bigNumberString, minOutputAmount: bigNumberString, expectedFillTime: positiveInteger, - swapTx: z.union([swapTxSchema, permitSwapTxSchema]).optional(), + swapTx: z.union([swapTxSchema, permitSwapTxSchema]).nullish(), id: z.string().optional(), }); From bea34fa76f668783ced5aefbbb0df9d3794b6585 Mon Sep 17 00:00:00 2001 From: droplet-rl <284132418+droplet-rl@users.noreply.github.com> Date: Wed, 10 Jun 2026 05:02:42 +0000 Subject: [PATCH 2/4] chore(sdk): bump patch version to 0.6.1 Co-Authored-By: Claude Opus 4.7 --- packages/sdk/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 9d3d8d4..008ddc9 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@across-protocol/app-sdk", - "version": "0.6.0", + "version": "0.6.1", "main": "./dist/index.js", "type": "module", "description": "The official SDK for integrating Across bridge into your dapp.", From 31f8595c367b0be4d5fa608572ba34ab048bf522 Mon Sep 17 00:00:00 2001 From: droplet-rl <284132418+droplet-rl@users.noreply.github.com> Date: Wed, 10 Jun 2026 05:04:25 +0000 Subject: [PATCH 3/4] Revert "chore(sdk): bump patch version to 0.6.1" This reverts commit bea34fa76f668783ced5aefbbb0df9d3794b6585. --- packages/sdk/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 008ddc9..9d3d8d4 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@across-protocol/app-sdk", - "version": "0.6.1", + "version": "0.6.0", "main": "./dist/index.js", "type": "module", "description": "The official SDK for integrating Across bridge into your dapp.", From 21c3029be74b49d0b2cd9c03613d62c4a67b98f9 Mon Sep 17 00:00:00 2001 From: droplet-rl <284132418+droplet-rl@users.noreply.github.com> Date: Wed, 10 Jun 2026 05:05:07 +0000 Subject: [PATCH 4/4] test(sdk): drop Scroll from supported chains list Scroll is no longer a supported chain. Caused "Could not find chainInfo for chain with id 534352" failures in client.test.ts. Co-Authored-By: Claude Opus 4.7 --- packages/sdk/test/common/sdk.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/sdk/test/common/sdk.ts b/packages/sdk/test/common/sdk.ts index 21abac6..c5ddf43 100644 --- a/packages/sdk/test/common/sdk.ts +++ b/packages/sdk/test/common/sdk.ts @@ -7,7 +7,6 @@ import { polygon, linea, lisk, - scroll, zora, sepolia, } from "viem/chains"; @@ -22,7 +21,6 @@ export const MAINNET_SUPPORTED_CHAINS = [ polygon, linea, lisk, - scroll, zora, ] as const;