@debridge-finance/borderless-validation-sdk 0.0.1 → 0.0.2
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.
- package/README.md +164 -0
- package/dist/cjs/helpers/address.js +53 -18
- package/dist/cjs/helpers/address.js.map +1 -1
- package/dist/cjs/helpers/evm-action.js +3 -3
- package/dist/cjs/helpers/evm-action.js.map +1 -1
- package/dist/cjs/helpers/evm-dln-hook-pack.js +87 -0
- package/dist/cjs/helpers/evm-dln-hook-pack.js.map +1 -0
- package/dist/cjs/helpers/evm-gas-compensation-tx.js +102 -0
- package/dist/cjs/helpers/evm-gas-compensation-tx.js.map +1 -0
- package/dist/cjs/helpers/evm-intent-id.js +27 -13
- package/dist/cjs/helpers/evm-intent-id.js.map +1 -1
- package/dist/cjs/helpers/evm-trade-amounts.js +36 -1
- package/dist/cjs/helpers/evm-trade-amounts.js.map +1 -1
- package/dist/cjs/helpers/gas-compensation.js +36 -0
- package/dist/cjs/helpers/gas-compensation.js.map +1 -0
- package/dist/cjs/helpers/hex.js +24 -0
- package/dist/cjs/helpers/hex.js.map +1 -0
- package/dist/cjs/helpers/placeholder.js +174 -0
- package/dist/cjs/helpers/placeholder.js.map +1 -0
- package/dist/cjs/helpers/sets.js +13 -0
- package/dist/cjs/helpers/sets.js.map +1 -0
- package/dist/cjs/types/enums.js +32 -2
- package/dist/cjs/types/enums.js.map +1 -1
- package/dist/cjs/types/request.js +36 -3
- package/dist/cjs/types/request.js.map +1 -1
- package/dist/cjs/types/response.js +125 -5
- package/dist/cjs/types/response.js.map +1 -1
- package/dist/cjs/types/validation.js +81 -10
- package/dist/cjs/types/validation.js.map +1 -1
- package/dist/cjs/validations/compensation-hook.js +203 -0
- package/dist/cjs/validations/compensation-hook.js.map +1 -0
- package/dist/cjs/validations/evm-caveats.js +4 -14
- package/dist/cjs/validations/evm-caveats.js.map +1 -1
- package/dist/cjs/validations/evm-op-budget.js +13 -10
- package/dist/cjs/validations/evm-op-budget.js.map +1 -1
- package/dist/cjs/validations/evm-op-hook.js +410 -3
- package/dist/cjs/validations/evm-op-hook.js.map +1 -1
- package/dist/cjs/validations/evm-op-wrap.js +10 -7
- package/dist/cjs/validations/evm-op-wrap.js.map +1 -1
- package/dist/cjs/validations/evm-required-actions.js +7 -9
- package/dist/cjs/validations/evm-required-actions.js.map +1 -1
- package/dist/cjs/validations/evm-sign712-metamask.js +17 -94
- package/dist/cjs/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/cjs/validations/evm-sign712-shared.js +116 -0
- package/dist/cjs/validations/evm-sign712-shared.js.map +1 -0
- package/dist/cjs/validations/evm-sign7702.js +34 -22
- package/dist/cjs/validations/evm-sign7702.js.map +1 -1
- package/dist/cjs/validations/hooks-common.js +252 -37
- package/dist/cjs/validations/hooks-common.js.map +1 -1
- package/dist/cjs/validations/intent-destinations.js +197 -0
- package/dist/cjs/validations/intent-destinations.js.map +1 -0
- package/dist/cjs/validations/intent-tokens.js +347 -0
- package/dist/cjs/validations/intent-tokens.js.map +1 -0
- package/dist/cjs/validations/intent.js +288 -0
- package/dist/cjs/validations/intent.js.map +1 -0
- package/dist/cjs/validations/required-actions.js +7 -7
- package/dist/cjs/validations/required-actions.js.map +1 -1
- package/dist/cjs/validations/solana-hook.js +33 -22
- package/dist/cjs/validations/solana-hook.js.map +1 -1
- package/dist/cjs/validations/solana-op-budget.js +56 -18
- package/dist/cjs/validations/solana-op-budget.js.map +1 -1
- package/dist/cjs/validations/solana-op-wrap.js +46 -13
- package/dist/cjs/validations/solana-op-wrap.js.map +1 -1
- package/dist/cjs/validations/solana-required-actions.js +3 -3
- package/dist/cjs/validations/solana-required-actions.js.map +1 -1
- package/dist/cjs/validations/solana-transaction.js +5 -5
- package/dist/cjs/validations/solana-transaction.js.map +1 -1
- package/dist/cjs/validations/trade-grouping.js +139 -1
- package/dist/cjs/validations/trade-grouping.js.map +1 -1
- package/dist/cjs/validations/trades.js +168 -40
- package/dist/cjs/validations/trades.js.map +1 -1
- package/dist/cjs/validator.js +11 -16
- package/dist/cjs/validator.js.map +1 -1
- package/dist/cjs/whitelists/environment-config.js +47 -28
- package/dist/cjs/whitelists/environment-config.js.map +1 -1
- package/dist/cjs/whitelists/evm/caveat-enforcers.js +21 -5
- package/dist/cjs/whitelists/evm/caveat-enforcers.js.map +1 -1
- package/dist/cjs/whitelists/evm/delegation-manager.js +7 -2
- package/dist/cjs/whitelists/evm/delegation-manager.js.map +1 -1
- package/dist/cjs/whitelists/evm/eip7702-delegation.js +7 -2
- package/dist/cjs/whitelists/evm/eip7702-delegation.js.map +1 -1
- package/dist/cjs/whitelists/evm/index.js +14 -1
- package/dist/cjs/whitelists/evm/index.js.map +1 -1
- package/dist/cjs/whitelists/evm/metamask-delegation-chains.js +16 -0
- package/dist/cjs/whitelists/evm/metamask-delegation-chains.js.map +1 -0
- package/dist/cjs/whitelists/evm/permit2.js +16 -12
- package/dist/cjs/whitelists/evm/permit2.js.map +1 -1
- package/dist/cjs/whitelists/evm/weth.js +16 -5
- package/dist/cjs/whitelists/evm/weth.js.map +1 -1
- package/dist/cjs/whitelists/solana/intent-signature.js +0 -1
- package/dist/cjs/whitelists/solana/intent-signature.js.map +1 -1
- package/dist/cjs/whitelists/subscription-to-chain-id.js +10 -0
- package/dist/cjs/whitelists/subscription-to-chain-id.js.map +1 -1
- package/dist/cjs/whitelists/types.js +13 -3
- package/dist/cjs/whitelists/types.js.map +1 -1
- package/dist/esm/helpers/address.js +48 -17
- package/dist/esm/helpers/address.js.map +1 -1
- package/dist/esm/helpers/evm-action.js +3 -3
- package/dist/esm/helpers/evm-action.js.map +1 -1
- package/dist/esm/helpers/evm-dln-hook-pack.js +82 -0
- package/dist/esm/helpers/evm-dln-hook-pack.js.map +1 -0
- package/dist/esm/helpers/evm-gas-compensation-tx.js +99 -0
- package/dist/esm/helpers/evm-gas-compensation-tx.js.map +1 -0
- package/dist/esm/helpers/evm-intent-id.js +27 -13
- package/dist/esm/helpers/evm-intent-id.js.map +1 -1
- package/dist/esm/helpers/evm-trade-amounts.js +36 -1
- package/dist/esm/helpers/evm-trade-amounts.js.map +1 -1
- package/dist/esm/helpers/gas-compensation.js +33 -0
- package/dist/esm/helpers/gas-compensation.js.map +1 -0
- package/dist/esm/helpers/hex.js +20 -0
- package/dist/esm/helpers/hex.js.map +1 -0
- package/dist/esm/helpers/placeholder.js +168 -0
- package/dist/esm/helpers/placeholder.js.map +1 -0
- package/dist/esm/helpers/sets.js +10 -0
- package/dist/esm/helpers/sets.js.map +1 -0
- package/dist/esm/types/enums.js +31 -1
- package/dist/esm/types/enums.js.map +1 -1
- package/dist/esm/types/request.js +37 -4
- package/dist/esm/types/request.js.map +1 -1
- package/dist/esm/types/response.js +124 -4
- package/dist/esm/types/response.js.map +1 -1
- package/dist/esm/types/validation.js +81 -10
- package/dist/esm/types/validation.js.map +1 -1
- package/dist/esm/validations/compensation-hook.js +200 -0
- package/dist/esm/validations/compensation-hook.js.map +1 -0
- package/dist/esm/validations/evm-caveats.js +4 -14
- package/dist/esm/validations/evm-caveats.js.map +1 -1
- package/dist/esm/validations/evm-op-budget.js +13 -10
- package/dist/esm/validations/evm-op-budget.js.map +1 -1
- package/dist/esm/validations/evm-op-hook.js +409 -2
- package/dist/esm/validations/evm-op-hook.js.map +1 -1
- package/dist/esm/validations/evm-op-wrap.js +10 -7
- package/dist/esm/validations/evm-op-wrap.js.map +1 -1
- package/dist/esm/validations/evm-required-actions.js +7 -9
- package/dist/esm/validations/evm-required-actions.js.map +1 -1
- package/dist/esm/validations/evm-sign712-metamask.js +17 -94
- package/dist/esm/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/esm/validations/evm-sign712-shared.js +110 -0
- package/dist/esm/validations/evm-sign712-shared.js.map +1 -0
- package/dist/esm/validations/evm-sign7702.js +33 -22
- package/dist/esm/validations/evm-sign7702.js.map +1 -1
- package/dist/esm/validations/hooks-common.js +251 -38
- package/dist/esm/validations/hooks-common.js.map +1 -1
- package/dist/esm/validations/intent-destinations.js +194 -0
- package/dist/esm/validations/intent-destinations.js.map +1 -0
- package/dist/esm/validations/intent-tokens.js +344 -0
- package/dist/esm/validations/intent-tokens.js.map +1 -0
- package/dist/esm/validations/intent.js +285 -0
- package/dist/esm/validations/intent.js.map +1 -0
- package/dist/esm/validations/required-actions.js +7 -7
- package/dist/esm/validations/required-actions.js.map +1 -1
- package/dist/esm/validations/solana-hook.js +35 -24
- package/dist/esm/validations/solana-hook.js.map +1 -1
- package/dist/esm/validations/solana-op-budget.js +56 -18
- package/dist/esm/validations/solana-op-budget.js.map +1 -1
- package/dist/esm/validations/solana-op-wrap.js +47 -14
- package/dist/esm/validations/solana-op-wrap.js.map +1 -1
- package/dist/esm/validations/solana-required-actions.js +3 -3
- package/dist/esm/validations/solana-required-actions.js.map +1 -1
- package/dist/esm/validations/solana-transaction.js +7 -7
- package/dist/esm/validations/solana-transaction.js.map +1 -1
- package/dist/esm/validations/trade-grouping.js +139 -1
- package/dist/esm/validations/trade-grouping.js.map +1 -1
- package/dist/esm/validations/trades.js +169 -41
- package/dist/esm/validations/trades.js.map +1 -1
- package/dist/esm/validator.js +11 -16
- package/dist/esm/validator.js.map +1 -1
- package/dist/esm/whitelists/environment-config.js +47 -28
- package/dist/esm/whitelists/environment-config.js.map +1 -1
- package/dist/esm/whitelists/evm/caveat-enforcers.js +20 -4
- package/dist/esm/whitelists/evm/caveat-enforcers.js.map +1 -1
- package/dist/esm/whitelists/evm/delegation-manager.js +6 -1
- package/dist/esm/whitelists/evm/delegation-manager.js.map +1 -1
- package/dist/esm/whitelists/evm/eip7702-delegation.js +6 -1
- package/dist/esm/whitelists/evm/eip7702-delegation.js.map +1 -1
- package/dist/esm/whitelists/evm/index.js +4 -4
- package/dist/esm/whitelists/evm/index.js.map +1 -1
- package/dist/esm/whitelists/evm/metamask-delegation-chains.js +13 -0
- package/dist/esm/whitelists/evm/metamask-delegation-chains.js.map +1 -0
- package/dist/esm/whitelists/evm/permit2.js +9 -5
- package/dist/esm/whitelists/evm/permit2.js.map +1 -1
- package/dist/esm/whitelists/evm/weth.js +16 -5
- package/dist/esm/whitelists/evm/weth.js.map +1 -1
- package/dist/esm/whitelists/solana/intent-signature.js +0 -1
- package/dist/esm/whitelists/solana/intent-signature.js.map +1 -1
- package/dist/esm/whitelists/subscription-to-chain-id.js +9 -0
- package/dist/esm/whitelists/subscription-to-chain-id.js.map +1 -1
- package/dist/esm/whitelists/types.js +14 -5
- package/dist/esm/whitelists/types.js.map +1 -1
- package/dist/types/helpers/address.d.ts +7 -7
- package/dist/types/helpers/address.d.ts.map +1 -1
- package/dist/types/helpers/evm-dln-hook-pack.d.ts +19 -0
- package/dist/types/helpers/evm-dln-hook-pack.d.ts.map +1 -0
- package/dist/types/helpers/evm-gas-compensation-tx.d.ts +13 -0
- package/dist/types/helpers/evm-gas-compensation-tx.d.ts.map +1 -0
- package/dist/types/helpers/evm-intent-id.d.ts.map +1 -1
- package/dist/types/helpers/evm-trade-amounts.d.ts +2 -2
- package/dist/types/helpers/evm-trade-amounts.d.ts.map +1 -1
- package/dist/types/helpers/gas-compensation.d.ts +10 -0
- package/dist/types/helpers/gas-compensation.d.ts.map +1 -0
- package/dist/types/helpers/hex.d.ts +3 -0
- package/dist/types/helpers/hex.d.ts.map +1 -0
- package/dist/types/helpers/placeholder.d.ts +41 -0
- package/dist/types/helpers/placeholder.d.ts.map +1 -0
- package/dist/types/helpers/sets.d.ts +2 -0
- package/dist/types/helpers/sets.d.ts.map +1 -0
- package/dist/types/types/enums.d.ts +24 -1
- package/dist/types/types/enums.d.ts.map +1 -1
- package/dist/types/types/request.d.ts +21 -11
- package/dist/types/types/request.d.ts.map +1 -1
- package/dist/types/types/response.d.ts +1015 -17
- package/dist/types/types/response.d.ts.map +1 -1
- package/dist/types/types/validation.d.ts +73 -11
- package/dist/types/types/validation.d.ts.map +1 -1
- package/dist/types/validations/compensation-hook.d.ts +3 -0
- package/dist/types/validations/compensation-hook.d.ts.map +1 -0
- package/dist/types/validations/evm-caveats.d.ts.map +1 -1
- package/dist/types/validations/evm-op-budget.d.ts +2 -2
- package/dist/types/validations/evm-op-budget.d.ts.map +1 -1
- package/dist/types/validations/evm-op-hook.d.ts +4 -2
- package/dist/types/validations/evm-op-hook.d.ts.map +1 -1
- package/dist/types/validations/evm-op-wrap.d.ts +2 -2
- package/dist/types/validations/evm-op-wrap.d.ts.map +1 -1
- package/dist/types/validations/evm-required-actions.d.ts +2 -2
- package/dist/types/validations/evm-required-actions.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712-metamask.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712-shared.d.ts +7 -0
- package/dist/types/validations/evm-sign712-shared.d.ts.map +1 -0
- package/dist/types/validations/evm-sign7702.d.ts +2 -1
- package/dist/types/validations/evm-sign7702.d.ts.map +1 -1
- package/dist/types/validations/hooks-common.d.ts +1 -0
- package/dist/types/validations/hooks-common.d.ts.map +1 -1
- package/dist/types/validations/intent-destinations.d.ts +4 -0
- package/dist/types/validations/intent-destinations.d.ts.map +1 -0
- package/dist/types/validations/intent-tokens.d.ts +4 -0
- package/dist/types/validations/intent-tokens.d.ts.map +1 -0
- package/dist/types/validations/intent.d.ts +5 -0
- package/dist/types/validations/intent.d.ts.map +1 -0
- package/dist/types/validations/required-actions.d.ts +2 -1
- package/dist/types/validations/required-actions.d.ts.map +1 -1
- package/dist/types/validations/solana-hook.d.ts +4 -2
- package/dist/types/validations/solana-hook.d.ts.map +1 -1
- package/dist/types/validations/solana-op-budget.d.ts +2 -2
- package/dist/types/validations/solana-op-budget.d.ts.map +1 -1
- package/dist/types/validations/solana-op-wrap.d.ts +2 -2
- package/dist/types/validations/solana-op-wrap.d.ts.map +1 -1
- package/dist/types/validations/solana-required-actions.d.ts +2 -2
- package/dist/types/validations/solana-required-actions.d.ts.map +1 -1
- package/dist/types/validations/solana-transaction.d.ts +3 -3
- package/dist/types/validations/solana-transaction.d.ts.map +1 -1
- package/dist/types/validations/trade-grouping.d.ts +6 -2
- package/dist/types/validations/trade-grouping.d.ts.map +1 -1
- package/dist/types/validations/trades.d.ts.map +1 -1
- package/dist/types/validator.d.ts.map +1 -1
- package/dist/types/whitelists/environment-config.d.ts.map +1 -1
- package/dist/types/whitelists/evm/caveat-enforcers.d.ts +8 -0
- package/dist/types/whitelists/evm/caveat-enforcers.d.ts.map +1 -1
- package/dist/types/whitelists/evm/delegation-manager.d.ts +2 -0
- package/dist/types/whitelists/evm/delegation-manager.d.ts.map +1 -1
- package/dist/types/whitelists/evm/eip7702-delegation.d.ts +2 -0
- package/dist/types/whitelists/evm/eip7702-delegation.d.ts.map +1 -1
- package/dist/types/whitelists/evm/index.d.ts +4 -4
- package/dist/types/whitelists/evm/index.d.ts.map +1 -1
- package/dist/types/whitelists/evm/metamask-delegation-chains.d.ts +3 -0
- package/dist/types/whitelists/evm/metamask-delegation-chains.d.ts.map +1 -0
- package/dist/types/whitelists/evm/permit2.d.ts +1 -0
- package/dist/types/whitelists/evm/permit2.d.ts.map +1 -1
- package/dist/types/whitelists/evm/weth.d.ts.map +1 -1
- package/dist/types/whitelists/solana/intent-signature.d.ts.map +1 -1
- package/dist/types/whitelists/subscription-to-chain-id.d.ts +1 -0
- package/dist/types/whitelists/subscription-to-chain-id.d.ts.map +1 -1
- package/dist/types/whitelists/types.d.ts +1 -1
- package/dist/types/whitelists/types.d.ts.map +1 -1
- package/package.json +4 -3
- package/dist/cjs/helpers/constants.js +0 -6
- package/dist/cjs/helpers/constants.js.map +0 -1
- package/dist/cjs/validations/evm-op-gas-compensation.js +0 -152
- package/dist/cjs/validations/evm-op-gas-compensation.js.map +0 -1
- package/dist/esm/helpers/constants.js +0 -3
- package/dist/esm/helpers/constants.js.map +0 -1
- package/dist/esm/validations/evm-op-gas-compensation.js +0 -149
- package/dist/esm/validations/evm-op-gas-compensation.js.map +0 -1
- package/dist/types/helpers/constants.d.ts +0 -2
- package/dist/types/helpers/constants.d.ts.map +0 -1
- package/dist/types/validations/evm-op-gas-compensation.d.ts +0 -3
- package/dist/types/validations/evm-op-gas-compensation.d.ts.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# @debridge-finance/borderless-validation-sdk
|
|
2
|
+
|
|
3
|
+
Validation SDK for deBridge **borderless intents** API (`POST /v1.0/bundle`) responses.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
When a user submits a bundle request to the deBridge API, the response contains transactions and signable payloads (EIP-712 messages, permits, Solana transactions, etc.) that the user is expected to sign.
|
|
8
|
+
|
|
9
|
+
**Every field the user signs is a potential attack vector.** If the API is compromised (MITM, server bug, malicious rewrite), the user could unknowingly sign a transaction that drains their funds.
|
|
10
|
+
|
|
11
|
+
This SDK runs on the client and independently verifies that every signable field in the response matches the original request — before the user signs anything.
|
|
12
|
+
|
|
13
|
+
### Threats mitigated
|
|
14
|
+
|
|
15
|
+
- **MITM attacks** against the API endpoint.
|
|
16
|
+
- **Bugs on the API side** that produce subtly wrong responses.
|
|
17
|
+
- **Reduced API trust** — the client no longer has to take API responses on faith.
|
|
18
|
+
- **Regression safety net** when testing new API versions.
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install @debridge-finance/borderless-validation-sdk
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Peer dependencies:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install viem zod bs58 @solana/web3.js
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Basic usage
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import { createValidator, Environment } from "@debridge-finance/borderless-validation-sdk";
|
|
36
|
+
|
|
37
|
+
const validator = createValidator({ environment: Environment.Prod });
|
|
38
|
+
|
|
39
|
+
const url = "https://cross-chain-api.debridge.finance/v1.0/bundle";
|
|
40
|
+
|
|
41
|
+
const response = await fetch(url, {
|
|
42
|
+
method: "POST",
|
|
43
|
+
headers: { "Content-Type": "application/json" },
|
|
44
|
+
body: JSON.stringify(request),
|
|
45
|
+
}).then(res => res.json());
|
|
46
|
+
|
|
47
|
+
const result = validator.validate(url, request, response);
|
|
48
|
+
|
|
49
|
+
if (!result.ok) {
|
|
50
|
+
console.error("Validation failed:", result.violations);
|
|
51
|
+
// Do NOT let the user sign anything.
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Safe to proceed with signing.
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### API
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
createValidator(config: { environment: Environment }): Validator
|
|
62
|
+
|
|
63
|
+
type Validator = {
|
|
64
|
+
validate(url: string, request: object, response: object): ValidationResult;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
type ValidationResult = {
|
|
68
|
+
ok: boolean; // true if no violations
|
|
69
|
+
violations: Violation[]; // all issues found
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
type Violation = {
|
|
73
|
+
code: ViolationCode; // machine-readable identifier
|
|
74
|
+
message: string; // human-readable description
|
|
75
|
+
path: string; // JSON path of the offending field
|
|
76
|
+
expected?: unknown;
|
|
77
|
+
actual?: unknown;
|
|
78
|
+
details?: unknown;
|
|
79
|
+
};
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
`validator.validate()` **never throws** — every error condition is reported as a `Violation`. Safe to call in any code path.
|
|
83
|
+
|
|
84
|
+
## Integration guide for UI teams
|
|
85
|
+
|
|
86
|
+
The SDK is designed to run **between** receiving the API response and presenting it to the user for signing. Wire it into that seam.
|
|
87
|
+
|
|
88
|
+
### 1. Where to call
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
┌──────────────┐ ┌─────────┐ ┌─────────────────-─┐ ┌──────────────┐
|
|
92
|
+
│ Build request│ ──▶ │ fetch() │ ──▶ │ validator.validate│ ──▶ │ Sign / submit│
|
|
93
|
+
└──────────────┘ └─────────┘ └──────────────────-┘ └──────────────┘
|
|
94
|
+
│
|
|
95
|
+
▼
|
|
96
|
+
ok ? proceed : block
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
- **Before `validate`:** the user has not yet seen or signed anything.
|
|
100
|
+
- **After `validate`:** if `result.ok === false`, **do not forward any signable payload** (intent message, permit, transaction) to the wallet. The API response cannot be trusted.
|
|
101
|
+
|
|
102
|
+
### 2. Choosing the environment
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
import { Environment } from "@debridge-finance/borderless-validation-sdk";
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
- `Environment.Prod` — production.
|
|
109
|
+
- `Environment.Hanoi`, `Environment.Dubai`, `Environment.Madrid` — non-prod deployments (may have empty whitelists; ask the SDK team before use).
|
|
110
|
+
|
|
111
|
+
Pass the same environment your app is already configured for — don't make it user-selectable.
|
|
112
|
+
|
|
113
|
+
### 3. Pass the exact URL you called
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
const url = "https://cross-chain-api.debridge.finance/v1.0/bundle";
|
|
117
|
+
const response = await fetch(url, { ... });
|
|
118
|
+
const result = validator.validate(url, request, response);
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
The `url` argument is checked against a per-environment whitelist. Passing a hardcoded constant defeats the check — pass the same string you handed to `fetch`.
|
|
122
|
+
|
|
123
|
+
### 4. Handling violations
|
|
124
|
+
|
|
125
|
+
On `result.ok === false`:
|
|
126
|
+
|
|
127
|
+
1. **Block the signing flow.** Do not show a wallet popup or write any pending tx to state.
|
|
128
|
+
2. **Log the full `violations` array** to your error reporting system (Sentry / Datadog / etc.). Include `code`, `path`, `expected`, `actual`, `details`.
|
|
129
|
+
3. **Show the user a generic error.** Do not leak raw `Violation` data into the UI — messages are for developers, not end-users. A single "Quote is invalid, please retry" is enough.
|
|
130
|
+
4. **Do not retry automatically.** If the API is compromised, retries make it worse. Let the user manually trigger a retry.
|
|
131
|
+
|
|
132
|
+
### 5. Browser compatibility
|
|
133
|
+
|
|
134
|
+
The SDK is published as both CJS and ESM and uses only browser-compatible APIs (no `fs`, `crypto`, `Buffer`, `process`). It has been smoke-tested in a plain `<script type="module">` environment — see [`tmp/front/`](./tmp/front/) for a minimal example.
|
|
135
|
+
|
|
136
|
+
Tree-shaking: the ESM build preserves named exports. Importing only `createValidator` will not pull in unused validators.
|
|
137
|
+
|
|
138
|
+
### 6. Bundle size
|
|
139
|
+
|
|
140
|
+
Roughly 1 MB unpacked (a lot of it is source maps — drop them in production). The heaviest peer dep is `@solana/web3.js`; if your app only deals with EVM trades, your bundler's tree-shaking should eliminate most of it.
|
|
141
|
+
|
|
142
|
+
### 7. TypeScript
|
|
143
|
+
|
|
144
|
+
Full type declarations ship in `dist/types/`. `ValidatorConfig`, `ValidationResult`, `Violation`, and `ViolationCode` are all exported — use them directly, don't re-declare.
|
|
145
|
+
|
|
146
|
+
### 8. What NOT to do
|
|
147
|
+
|
|
148
|
+
- ❌ **Don't skip validation** because "the API is our own." Compromise detection is the whole point.
|
|
149
|
+
- ❌ **Don't mutate `request` or `response`** between the API call and `validate()` — the validator needs the exact payload the user received.
|
|
150
|
+
- ❌ **Don't interpret `violations[].message` programmatically** — message wording may change between versions. Branch on `code` instead.
|
|
151
|
+
- ❌ **Don't cache the validator if `environment` changes.** Create a new instance via `createValidator` for each environment.
|
|
152
|
+
|
|
153
|
+
## Development
|
|
154
|
+
|
|
155
|
+
See [`CLAUDE.md`](./CLAUDE.md) for project conventions, validation rules, and security guidelines.
|
|
156
|
+
|
|
157
|
+
- Unit tests: `npm test`
|
|
158
|
+
- Coverage: `npm run coverage`
|
|
159
|
+
- E2E tests (hit the staging API): `npm run test:e2e`
|
|
160
|
+
- Build: `npm run build`
|
|
161
|
+
|
|
162
|
+
## License
|
|
163
|
+
|
|
164
|
+
BUSL-1.1
|
|
@@ -3,12 +3,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
7
|
-
exports.
|
|
6
|
+
exports.TRON_NATIVE_ADDRESS = void 0;
|
|
7
|
+
exports.getChainEngine = getChainEngine;
|
|
8
8
|
exports.isTronAddress = isTronAddress;
|
|
9
9
|
exports.tronAddressToEvmHex = tronAddressToEvmHex;
|
|
10
10
|
exports.normalizeAddress = normalizeAddress;
|
|
11
|
+
exports.detectChainEngine = detectChainEngine;
|
|
12
|
+
exports.normalizeAddressByValue = normalizeAddressByValue;
|
|
11
13
|
exports.addressEquals = addressEquals;
|
|
14
|
+
exports.addressToHex = addressToHex;
|
|
15
|
+
exports.addressToHexByValue = addressToHexByValue;
|
|
12
16
|
exports.isNativeToken = isNativeToken;
|
|
13
17
|
const viem_1 = require("viem");
|
|
14
18
|
const bs58_1 = __importDefault(require("bs58"));
|
|
@@ -16,18 +20,12 @@ const enums_1 = require("../types/enums");
|
|
|
16
20
|
const solana_1 = require("../whitelists/solana");
|
|
17
21
|
// Tron-specific addresses (Base58Check format)
|
|
18
22
|
exports.TRON_NATIVE_ADDRESS = "T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb";
|
|
19
|
-
|
|
20
|
-
(function (AddressFormat) {
|
|
21
|
-
AddressFormat[AddressFormat["EVM"] = 0] = "EVM";
|
|
22
|
-
AddressFormat[AddressFormat["Tron"] = 1] = "Tron";
|
|
23
|
-
AddressFormat[AddressFormat["Solana"] = 2] = "Solana";
|
|
24
|
-
})(AddressFormat || (exports.AddressFormat = AddressFormat = {}));
|
|
25
|
-
function getAddressFormat(chainId) {
|
|
23
|
+
function getChainEngine(chainId) {
|
|
26
24
|
if (chainId === enums_1.ChainId.Tron)
|
|
27
|
-
return
|
|
25
|
+
return enums_1.ChainEngine.Tron;
|
|
28
26
|
if (chainId === enums_1.ChainId.Solana)
|
|
29
|
-
return
|
|
30
|
-
return
|
|
27
|
+
return enums_1.ChainEngine.Solana;
|
|
28
|
+
return enums_1.ChainEngine.EVM;
|
|
31
29
|
}
|
|
32
30
|
function isTronAddress(address) {
|
|
33
31
|
if (!address)
|
|
@@ -50,10 +48,26 @@ function tronAddressToEvmHex(tronAddress) {
|
|
|
50
48
|
const addressBytes = decoded.slice(1, 21);
|
|
51
49
|
return (0, viem_1.bytesToHex)(addressBytes);
|
|
52
50
|
}
|
|
53
|
-
// Normalizes address for comparison based on chain
|
|
51
|
+
// Normalizes address for comparison based on chain engine
|
|
54
52
|
function normalizeAddress(chainId, address) {
|
|
55
|
-
const
|
|
56
|
-
|
|
53
|
+
const engine = getChainEngine(chainId);
|
|
54
|
+
return applyEngineNormalization(address, engine);
|
|
55
|
+
}
|
|
56
|
+
// Detects the chain engine from the address value alone (no chainId required).
|
|
57
|
+
// Useful when a chain is not fixed (e.g. destinationChainIds = "any").
|
|
58
|
+
function detectChainEngine(address) {
|
|
59
|
+
if (address.startsWith("0x"))
|
|
60
|
+
return enums_1.ChainEngine.EVM;
|
|
61
|
+
if (isTronAddress(address))
|
|
62
|
+
return enums_1.ChainEngine.Tron;
|
|
63
|
+
return enums_1.ChainEngine.Solana;
|
|
64
|
+
}
|
|
65
|
+
// Normalizes an address using only its own value — no chainId needed.
|
|
66
|
+
function normalizeAddressByValue(address) {
|
|
67
|
+
return applyEngineNormalization(address, detectChainEngine(address));
|
|
68
|
+
}
|
|
69
|
+
function applyEngineNormalization(address, engine) {
|
|
70
|
+
if (engine === enums_1.ChainEngine.Tron || engine === enums_1.ChainEngine.Solana) {
|
|
57
71
|
return address; // case-sensitive
|
|
58
72
|
}
|
|
59
73
|
return address.toLowerCase(); // EVM: case-insensitive
|
|
@@ -62,12 +76,33 @@ function normalizeAddress(chainId, address) {
|
|
|
62
76
|
function addressEquals(chainId, a, b) {
|
|
63
77
|
return normalizeAddress(chainId, a) === normalizeAddress(chainId, b);
|
|
64
78
|
}
|
|
65
|
-
//
|
|
79
|
+
// Raw byte representation, used when an address flows into the intent ID
|
|
80
|
+
// keccak256 hash. EVM → 20 bytes, Tron → 20 bytes (after stripping 0x41
|
|
81
|
+
// prefix and checksum), Solana → 32 bytes (base58, no checksum).
|
|
82
|
+
function addressToHex(chainId, address) {
|
|
83
|
+
return applyEngineToHex(address, getChainEngine(chainId));
|
|
84
|
+
}
|
|
85
|
+
// Same as addressToHex but infers the engine from the address value alone.
|
|
86
|
+
// Use when the chainId is unknown (e.g. destinationChainIds = "any").
|
|
87
|
+
function addressToHexByValue(address) {
|
|
88
|
+
return applyEngineToHex(address, detectChainEngine(address));
|
|
89
|
+
}
|
|
90
|
+
function applyEngineToHex(address, engine) {
|
|
91
|
+
if (engine === enums_1.ChainEngine.EVM) {
|
|
92
|
+
return address.toLowerCase();
|
|
93
|
+
}
|
|
94
|
+
if (engine === enums_1.ChainEngine.Tron) {
|
|
95
|
+
return tronAddressToEvmHex(address);
|
|
96
|
+
}
|
|
97
|
+
return (0, viem_1.bytesToHex)(bs58_1.default.decode(address));
|
|
98
|
+
}
|
|
99
|
+
// Checks if address is the native token for the given chain.
|
|
66
100
|
function isNativeToken(address, chainId) {
|
|
67
|
-
|
|
101
|
+
const engine = getChainEngine(chainId);
|
|
102
|
+
if (engine === enums_1.ChainEngine.Tron) {
|
|
68
103
|
return address === exports.TRON_NATIVE_ADDRESS;
|
|
69
104
|
}
|
|
70
|
-
if (
|
|
105
|
+
if (engine === enums_1.ChainEngine.Solana) {
|
|
71
106
|
return address === solana_1.SYSTEM_PROGRAM;
|
|
72
107
|
}
|
|
73
108
|
return address.toLowerCase() === viem_1.zeroAddress;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"address.js","sourceRoot":"","sources":["../../../src/helpers/address.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"address.js","sourceRoot":"","sources":["../../../src/helpers/address.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,14 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.actionUsesTransactionCalls = actionUsesTransactionCalls;
|
|
4
4
|
exports.getTransactionCalls = getTransactionCalls;
|
|
5
5
|
const types_1 = require("../types");
|
|
6
|
-
// Transaction and
|
|
6
|
+
// Transaction and Sign712MetaMaskCaveats actions carry transactionCalls;
|
|
7
7
|
// Sign712 (Permit/Permit2) and Sign7702Authorization do not.
|
|
8
8
|
function actionUsesTransactionCalls(action) {
|
|
9
9
|
return action.type === types_1.EvmActionKind.Transaction
|
|
10
|
-
|| action.type === types_1.EvmActionKind.
|
|
10
|
+
|| action.type === types_1.EvmActionKind.Sign712MetaMaskCaveats;
|
|
11
11
|
}
|
|
12
12
|
// For Transaction-type actions (non-AA), the call is in action.data directly.
|
|
13
|
-
// For
|
|
13
|
+
// For Sign712MetaMaskCaveats-type actions (AA), the calls are in details.transactionCalls.
|
|
14
14
|
function getTransactionCalls(action) {
|
|
15
15
|
if (action.type === types_1.EvmActionKind.Transaction) {
|
|
16
16
|
return [action.data];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-action.js","sourceRoot":"","sources":["../../../src/helpers/evm-action.ts"],"names":[],"mappings":";;AAIA,gEAGC;AAID,kDAKC;AAhBD,oCAAgF;AAEhF,
|
|
1
|
+
{"version":3,"file":"evm-action.js","sourceRoot":"","sources":["../../../src/helpers/evm-action.ts"],"names":[],"mappings":";;AAIA,gEAGC;AAID,kDAKC;AAhBD,oCAAgF;AAEhF,yEAAyE;AACzE,6DAA6D;AAC7D,SAAgB,0BAA0B,CAAC,MAAyB;IAChE,OAAO,MAAM,CAAC,IAAI,KAAK,qBAAa,CAAC,WAAW;WACzC,MAAM,CAAC,IAAI,KAAK,qBAAa,CAAC,sBAAsB,CAAC;AAChE,CAAC;AAED,8EAA8E;AAC9E,2FAA2F;AAC3F,SAAgB,mBAAmB,CAAC,MAAyB;IACzD,IAAI,MAAM,CAAC,IAAI,KAAK,qBAAa,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,CAAC,MAAM,CAAC,IAA0B,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,EAAE,gBAAgB,IAAI,EAAE,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.packEvmHookV1 = packEvmHookV1;
|
|
4
|
+
exports.packEvmTransactionCall = packEvmTransactionCall;
|
|
5
|
+
exports.serializeDlnHook = serializeDlnHook;
|
|
6
|
+
const viem_1 = require("viem");
|
|
7
|
+
const enums_1 = require("../types/enums");
|
|
8
|
+
// Hook envelope: ABI-encoded tuple prefixed with a `uint8 version=1` byte.
|
|
9
|
+
// keccak256 of these bytes is what ends up in `intent.externalCallHash`.
|
|
10
|
+
const ENVELOPE_TUPLE = {
|
|
11
|
+
type: "tuple",
|
|
12
|
+
components: [
|
|
13
|
+
{ name: "fallbackAddress", type: "address" },
|
|
14
|
+
{ name: "executorAddress", type: "address" },
|
|
15
|
+
{ name: "executionFee", type: "uint160" },
|
|
16
|
+
{ name: "allowDelayedExecution", type: "bool" },
|
|
17
|
+
{ name: "requireSuccessfullExecution", type: "bool" },
|
|
18
|
+
{ name: "payload", type: "bytes" },
|
|
19
|
+
],
|
|
20
|
+
};
|
|
21
|
+
const ENVELOPE_VERSION_PREFIX = "0x01";
|
|
22
|
+
function packEvmHookV1(data) {
|
|
23
|
+
const tuple = (0, viem_1.encodeAbiParameters)([ENVELOPE_TUPLE], [{
|
|
24
|
+
fallbackAddress: data.fallbackAddress,
|
|
25
|
+
executorAddress: data.target,
|
|
26
|
+
executionFee: BigInt(data.reward),
|
|
27
|
+
allowDelayedExecution: data.isNonAtomic,
|
|
28
|
+
requireSuccessfullExecution: data.isSuccessRequired,
|
|
29
|
+
payload: data.targetPayload,
|
|
30
|
+
}]);
|
|
31
|
+
return (0, viem_1.concatHex)([ENVELOPE_VERSION_PREFIX, tuple]);
|
|
32
|
+
}
|
|
33
|
+
// `evm_transaction_call` wraps the user-supplied (to, gas, calldata) tuple in
|
|
34
|
+
// the same envelope, with fixed field values:
|
|
35
|
+
// executionFee = 0
|
|
36
|
+
// allowDelayedExecution = false
|
|
37
|
+
// requireSuccessfullExecution = true
|
|
38
|
+
// fallbackAddress = dstChainAuthorityAddress
|
|
39
|
+
// executorAddress = 0x0
|
|
40
|
+
function packEvmTransactionCall(data, dstChainAuthorityAddress) {
|
|
41
|
+
const inner = (0, viem_1.encodeAbiParameters)([{
|
|
42
|
+
type: "tuple",
|
|
43
|
+
components: [
|
|
44
|
+
{ name: "to", type: "address" },
|
|
45
|
+
{ name: "txGas", type: "uint32" },
|
|
46
|
+
{ name: "callData", type: "bytes" },
|
|
47
|
+
],
|
|
48
|
+
}], [{
|
|
49
|
+
to: data.to,
|
|
50
|
+
txGas: Number(data.gas ?? 0),
|
|
51
|
+
callData: data.calldata,
|
|
52
|
+
}]);
|
|
53
|
+
return packEvmHookV1({
|
|
54
|
+
fallbackAddress: dstChainAuthorityAddress,
|
|
55
|
+
target: viem_1.zeroAddress,
|
|
56
|
+
reward: "0",
|
|
57
|
+
isNonAtomic: false,
|
|
58
|
+
isSuccessRequired: true,
|
|
59
|
+
targetPayload: inner,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
// Parses a request trade's `dlnHook` JSON and returns the bytes the API
|
|
63
|
+
// hashes into `intent.externalCallHash`. Returns `undefined` when the trade
|
|
64
|
+
// has no hook. Throws on unknown / Solana hook types — Solana hooks live in
|
|
65
|
+
// the response under their own validator and never feed into this hash.
|
|
66
|
+
function serializeDlnHook(trade) {
|
|
67
|
+
if (!trade.dlnHook)
|
|
68
|
+
return undefined;
|
|
69
|
+
const hook = JSON.parse(trade.dlnHook);
|
|
70
|
+
switch (hook.type) {
|
|
71
|
+
case enums_1.DlnHookType.EvmHookV1:
|
|
72
|
+
return packEvmHookV1(hook.data);
|
|
73
|
+
case enums_1.DlnHookType.EvmTransactionCall: {
|
|
74
|
+
if (trade.dstChainAuthorityAddress === undefined) {
|
|
75
|
+
throw new Error("evm_transaction_call hook requires dstChainAuthorityAddress on the trade");
|
|
76
|
+
}
|
|
77
|
+
return packEvmTransactionCall(hook.data, trade.dstChainAuthorityAddress);
|
|
78
|
+
}
|
|
79
|
+
case enums_1.DlnHookType.SolanaSerializedInstructions:
|
|
80
|
+
throw new Error("Solana hook types are not folded into externalCallHash");
|
|
81
|
+
default: {
|
|
82
|
+
const exhaustive = hook;
|
|
83
|
+
throw new Error(`Unknown dlnHook type: ${JSON.stringify(exhaustive)}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=evm-dln-hook-pack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm-dln-hook-pack.js","sourceRoot":"","sources":["../../../src/helpers/evm-dln-hook-pack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateEvmGasCompensationTx = validateEvmGasCompensationTx;
|
|
4
|
+
const evm_calldata_1 = require("./evm-calldata");
|
|
5
|
+
const evm_token_1 = require("./evm-token");
|
|
6
|
+
const address_1 = require("./address");
|
|
7
|
+
// Validates an EVM `{to, data, value}` triplet that is expected to encode a
|
|
8
|
+
// gas-compensation transfer. `groups` are the gas-compensation groups
|
|
9
|
+
// associated with this triplet's source (already filtered to the relevant
|
|
10
|
+
// `(chainId, sender)` pair by the caller).
|
|
11
|
+
//
|
|
12
|
+
// Classification: dispatched on `triplet.data`:
|
|
13
|
+
// - `data === "0x"` → native compensation (data="0x", value > 0,
|
|
14
|
+
// and at least one group must carry a native token).
|
|
15
|
+
// - otherwise → ERC20 compensation (`triplet.to` matches some non-native
|
|
16
|
+
// group's tokenAddress, data is `transfer(...)`, value === "0").
|
|
17
|
+
function validateEvmGasCompensationTx(triplet, groups, realChainId, basePath, codes) {
|
|
18
|
+
if (triplet.data === "0x") {
|
|
19
|
+
return validateNativeCompensation(triplet, groups, basePath, codes);
|
|
20
|
+
}
|
|
21
|
+
return validateErc20Compensation(triplet, groups, realChainId, basePath, codes);
|
|
22
|
+
}
|
|
23
|
+
function validateNativeCompensation(triplet, groups, basePath, codes) {
|
|
24
|
+
const violations = [];
|
|
25
|
+
// CRITICAL: data="0x" implies native — must have at least one native group.
|
|
26
|
+
const hasNativeGroup = groups.some(g => (0, evm_token_1.isNativeToken)(g.tokenAddress, g.realChainId));
|
|
27
|
+
if (!hasNativeGroup) {
|
|
28
|
+
violations.push({
|
|
29
|
+
code: codes.dataInvalid,
|
|
30
|
+
message: "data=\"0x\" implies native compensation but no group has a native token",
|
|
31
|
+
path: `${basePath}.data`,
|
|
32
|
+
expected: groups.map(g => g.tokenAddress),
|
|
33
|
+
actual: "0x",
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
// HIGH: native compensation value must parse and be > 0.
|
|
37
|
+
violations.push(...validateNativeValue(triplet.value, basePath, codes));
|
|
38
|
+
return violations;
|
|
39
|
+
}
|
|
40
|
+
function validateNativeValue(rawValue, basePath, codes) {
|
|
41
|
+
try {
|
|
42
|
+
if (BigInt(rawValue) <= 0n) {
|
|
43
|
+
return [{
|
|
44
|
+
code: codes.valueInvalid,
|
|
45
|
+
message: "native compensation must have value > 0",
|
|
46
|
+
path: `${basePath}.value`,
|
|
47
|
+
actual: rawValue,
|
|
48
|
+
}];
|
|
49
|
+
}
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return [{
|
|
54
|
+
code: codes.valueInvalid,
|
|
55
|
+
message: "native compensation value is not a valid number",
|
|
56
|
+
path: `${basePath}.value`,
|
|
57
|
+
actual: rawValue,
|
|
58
|
+
details: error,
|
|
59
|
+
}];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function validateErc20Compensation(triplet, groups, realChainId, basePath, codes) {
|
|
63
|
+
const violations = [];
|
|
64
|
+
// CRITICAL: `to` must equal some non-native group's tokenAddress.
|
|
65
|
+
const erc20Groups = groups.filter(g => !(0, evm_token_1.isNativeToken)(g.tokenAddress, g.realChainId));
|
|
66
|
+
const matches = erc20Groups.some(g => (0, address_1.normalizeAddress)(g.realChainId, g.tokenAddress)
|
|
67
|
+
=== (0, address_1.normalizeAddress)(realChainId, triplet.to));
|
|
68
|
+
if (!matches) {
|
|
69
|
+
violations.push({
|
|
70
|
+
code: codes.toMismatch,
|
|
71
|
+
message: "ERC20 compensation `to` does not match any group's tokenAddress",
|
|
72
|
+
path: `${basePath}.to`,
|
|
73
|
+
expected: erc20Groups.map(g => g.tokenAddress),
|
|
74
|
+
actual: triplet.to,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// CRITICAL: data must be a valid ERC20 transfer calldata.
|
|
78
|
+
try {
|
|
79
|
+
(0, evm_calldata_1.decodeTransferCalldata)(triplet.data);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
violations.push({
|
|
83
|
+
code: codes.dataInvalid,
|
|
84
|
+
message: "ERC20 compensation data is not a valid transfer calldata",
|
|
85
|
+
path: `${basePath}.data`,
|
|
86
|
+
actual: triplet.data,
|
|
87
|
+
details: error,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// HIGH: ERC20 compensation must have value="0".
|
|
91
|
+
if (triplet.value !== "0") {
|
|
92
|
+
violations.push({
|
|
93
|
+
code: codes.valueInvalid,
|
|
94
|
+
message: "ERC20 compensation must have value=\"0\"",
|
|
95
|
+
path: `${basePath}.value`,
|
|
96
|
+
expected: "0",
|
|
97
|
+
actual: triplet.value,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return violations;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=evm-gas-compensation-tx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm-gas-compensation-tx.js","sourceRoot":"","sources":["../../../src/helpers/evm-gas-compensation-tx.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.computeIntentId = computeIntentId;
|
|
4
4
|
const viem_1 = require("viem");
|
|
5
5
|
const evm_intent_id_abi_1 = require("./evm-intent-id-abi");
|
|
6
|
+
const address_1 = require("./address");
|
|
7
|
+
const subscription_to_chain_id_1 = require("../whitelists/subscription-to-chain-id");
|
|
6
8
|
function computeIntentId(intent) {
|
|
7
9
|
const struct = convertToIntentStruct(intent);
|
|
8
10
|
const encoded = (0, viem_1.encodeAbiParameters)(evm_intent_id_abi_1.SUBMIT_INTENT_ABI_PARAMS, [struct]);
|
|
@@ -20,7 +22,7 @@ function convertToIntentStruct(intent) {
|
|
|
20
22
|
intentTimestamp: BigInt(intent.intentTimestamp),
|
|
21
23
|
srcAllowedSender: (intent.srcAllowedSender ?? []),
|
|
22
24
|
executionMetadata: (intent.executionMetadata ?? viem_1.zeroHash),
|
|
23
|
-
isAnyDlnMetadataAllowed:
|
|
25
|
+
isAnyDlnMetadataAllowed: !intent.dlnMetadata,
|
|
24
26
|
dlnMetadata: (intent.dlnMetadata ?? "0x"),
|
|
25
27
|
externalCallHash: (intent.externalCallHash ?? viem_1.zeroHash),
|
|
26
28
|
combinedInteractions: "0x",
|
|
@@ -29,14 +31,22 @@ function convertToIntentStruct(intent) {
|
|
|
29
31
|
intentAuthority: intent.intentAuthority,
|
|
30
32
|
};
|
|
31
33
|
}
|
|
34
|
+
// Encodes addresses as raw bytes — non-EVM strings can't be passed as-is.
|
|
32
35
|
function convertAllowedAddresses(details) {
|
|
33
36
|
if (!details)
|
|
34
37
|
return [];
|
|
35
|
-
return details.map(d =>
|
|
36
|
-
|
|
37
|
-
chains
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
return details.map(d => {
|
|
39
|
+
const isAnyChain = d.destinationChainIds === "any";
|
|
40
|
+
const chains = isAnyChain ? [] : d.destinationChainIds;
|
|
41
|
+
// All chains within one entry share the same address family (validated
|
|
42
|
+
// elsewhere), so any chainId in the list resolves the address family
|
|
43
|
+
// identically. For "any" / empty chains, the family is inferred from
|
|
44
|
+
// the address itself.
|
|
45
|
+
const allowedAddress = chains.length > 0
|
|
46
|
+
? (0, address_1.addressToHex)((0, subscription_to_chain_id_1.resolveChainId)(chains[0]) ?? chains[0], d.address)
|
|
47
|
+
: (0, address_1.addressToHexByValue)(d.address);
|
|
48
|
+
return { allowedAddress, chains, isAnyChain };
|
|
49
|
+
});
|
|
40
50
|
}
|
|
41
51
|
function convertInputTokens(tokens) {
|
|
42
52
|
if (!tokens)
|
|
@@ -58,13 +68,17 @@ function convertGiveTokens(tokens) {
|
|
|
58
68
|
denominator: Number(t.denominator),
|
|
59
69
|
}));
|
|
60
70
|
}
|
|
71
|
+
// Encode addresses as raw bytes — non-EVM strings can't be passed as-is.
|
|
61
72
|
function convertTakeTokens(tokens) {
|
|
62
|
-
return tokens.map(t =>
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
73
|
+
return tokens.map(t => {
|
|
74
|
+
const realChainId = (0, subscription_to_chain_id_1.resolveChainId)(t.takeTokenChainId) ?? t.takeTokenChainId;
|
|
75
|
+
return {
|
|
76
|
+
giveToken: t.fromTokenAddress,
|
|
77
|
+
takeTokenChain: t.takeTokenChainId,
|
|
78
|
+
takeToken: (0, address_1.addressToHex)(realChainId, t.takeTokenAddress),
|
|
79
|
+
numerator: BigInt(t.numerator),
|
|
80
|
+
denominator: Number(t.denominator),
|
|
81
|
+
};
|
|
82
|
+
});
|
|
69
83
|
}
|
|
70
84
|
//# sourceMappingURL=evm-intent-id.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-intent-id.js","sourceRoot":"","sources":["../../../src/helpers/evm-intent-id.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"evm-intent-id.js","sourceRoot":"","sources":["../../../src/helpers/evm-intent-id.ts"],"names":[],"mappings":"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"}
|