@debridge-finance/borderless-validation-sdk 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +120 -11
- package/dist/cjs/graylists/evm/token-permit-metadata.js +7 -1
- package/dist/cjs/graylists/evm/token-permit-metadata.js.map +1 -1
- package/dist/cjs/helpers/address.js +139 -63
- package/dist/cjs/helpers/address.js.map +1 -1
- package/dist/cjs/helpers/amount.js +8 -0
- package/dist/cjs/helpers/amount.js.map +1 -0
- package/dist/cjs/helpers/evm-dln-hook-pack.js +16 -4
- package/dist/cjs/helpers/evm-dln-hook-pack.js.map +1 -1
- package/dist/cjs/helpers/evm-gas-compensation-tx.js +11 -26
- package/dist/cjs/helpers/evm-gas-compensation-tx.js.map +1 -1
- package/dist/cjs/helpers/evm-intent-id-abi.js +8 -1
- package/dist/cjs/helpers/evm-intent-id-abi.js.map +1 -1
- package/dist/cjs/helpers/evm-trade-amounts.js +11 -3
- package/dist/cjs/helpers/evm-trade-amounts.js.map +1 -1
- package/dist/cjs/helpers/expected-delegate.js +2 -6
- package/dist/cjs/helpers/expected-delegate.js.map +1 -1
- package/dist/cjs/helpers/gas-compensation.js +8 -4
- package/dist/cjs/helpers/gas-compensation.js.map +1 -1
- package/dist/cjs/helpers/interactions.js +4 -20
- package/dist/cjs/helpers/interactions.js.map +1 -1
- package/dist/cjs/helpers/synthetic-native-wrap.js +3 -2
- package/dist/cjs/helpers/synthetic-native-wrap.js.map +1 -1
- package/dist/cjs/types/enums.js +1 -0
- package/dist/cjs/types/enums.js.map +1 -1
- package/dist/cjs/types/request.js +15 -2
- package/dist/cjs/types/request.js.map +1 -1
- package/dist/cjs/types/response.js +2 -1
- package/dist/cjs/types/response.js.map +1 -1
- package/dist/cjs/types/validation.js +21 -3
- package/dist/cjs/types/validation.js.map +1 -1
- package/dist/cjs/validations/compensation-hook.js +4 -5
- package/dist/cjs/validations/compensation-hook.js.map +1 -1
- package/dist/cjs/validations/cost-token.js +9 -1
- package/dist/cjs/validations/cost-token.js.map +1 -1
- package/dist/cjs/validations/echo-fields.js +18 -0
- package/dist/cjs/validations/echo-fields.js.map +1 -1
- package/dist/cjs/validations/evm-caveats.js +3 -0
- package/dist/cjs/validations/evm-caveats.js.map +1 -1
- package/dist/cjs/validations/evm-on-chain-intent.js +150 -0
- package/dist/cjs/validations/evm-on-chain-intent.js.map +1 -0
- package/dist/cjs/validations/evm-op-budget.js +23 -3
- package/dist/cjs/validations/evm-op-budget.js.map +1 -1
- package/dist/cjs/validations/evm-op-hook.js +6 -6
- package/dist/cjs/validations/evm-op-hook.js.map +1 -1
- package/dist/cjs/validations/evm-permit.js +17 -6
- package/dist/cjs/validations/evm-permit.js.map +1 -1
- package/dist/cjs/validations/evm-permit2.js +14 -6
- package/dist/cjs/validations/evm-permit2.js.map +1 -1
- package/dist/cjs/validations/evm-required-actions.js +26 -7
- package/dist/cjs/validations/evm-required-actions.js.map +1 -1
- package/dist/cjs/validations/evm-sign712-metamask.js +3 -126
- package/dist/cjs/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/cjs/validations/evm-sign712-shared.js +127 -0
- package/dist/cjs/validations/evm-sign712-shared.js.map +1 -1
- package/dist/cjs/validations/evm-sign712.js +18 -2
- package/dist/cjs/validations/evm-sign712.js.map +1 -1
- package/dist/cjs/validations/evm-sign7702.js +2 -0
- package/dist/cjs/validations/evm-sign7702.js.map +1 -1
- package/dist/cjs/validations/evm-transaction.js +7 -1
- package/dist/cjs/validations/evm-transaction.js.map +1 -1
- package/dist/cjs/validations/external-call.js +9 -20
- package/dist/cjs/validations/external-call.js.map +1 -1
- package/dist/cjs/validations/hook-version.js +35 -0
- package/dist/cjs/validations/hook-version.js.map +1 -0
- package/dist/cjs/validations/hooks-common.js +74 -199
- package/dist/cjs/validations/hooks-common.js.map +1 -1
- package/dist/cjs/validations/intent-destinations.js +52 -50
- package/dist/cjs/validations/intent-destinations.js.map +1 -1
- package/dist/cjs/validations/intent-tokens.js +319 -79
- package/dist/cjs/validations/intent-tokens.js.map +1 -1
- package/dist/cjs/validations/intent.js +34 -26
- package/dist/cjs/validations/intent.js.map +1 -1
- package/dist/cjs/validations/max-reserved.js +54 -0
- package/dist/cjs/validations/max-reserved.js.map +1 -0
- package/dist/cjs/validations/on-chain-intent-submission.js +70 -0
- package/dist/cjs/validations/on-chain-intent-submission.js.map +1 -0
- package/dist/cjs/validations/ptp.js +9 -6
- package/dist/cjs/validations/ptp.js.map +1 -1
- package/dist/cjs/validations/refill.js +11 -5
- package/dist/cjs/validations/refill.js.map +1 -1
- package/dist/cjs/validations/solana-hook.js +12 -64
- package/dist/cjs/validations/solana-hook.js.map +1 -1
- package/dist/cjs/validations/solana-op-budget.js +1 -1
- package/dist/cjs/validations/solana-op-budget.js.map +1 -1
- package/dist/cjs/validations/solana-op-wrap.js +29 -47
- package/dist/cjs/validations/solana-op-wrap.js.map +1 -1
- package/dist/cjs/validations/solana-required-actions.js +2 -2
- package/dist/cjs/validations/solana-required-actions.js.map +1 -1
- package/dist/cjs/validations/solana-transaction.js +4 -53
- package/dist/cjs/validations/solana-transaction.js.map +1 -1
- package/dist/cjs/validations/total-dst-amount.js +19 -3
- package/dist/cjs/validations/total-dst-amount.js.map +1 -1
- package/dist/cjs/validations/trade-grouping.js +35 -9
- package/dist/cjs/validations/trade-grouping.js.map +1 -1
- package/dist/cjs/validations/trade-matching.js +1 -1
- package/dist/cjs/validations/trade-matching.js.map +1 -1
- package/dist/cjs/validations/trades.js +29 -9
- package/dist/cjs/validations/trades.js.map +1 -1
- package/dist/cjs/validator.js +28 -17
- package/dist/cjs/validator.js.map +1 -1
- package/dist/cjs/whitelists/environment-config.js +9 -28
- package/dist/cjs/whitelists/environment-config.js.map +1 -1
- package/dist/cjs/whitelists/types.js +2 -5
- package/dist/cjs/whitelists/types.js.map +1 -1
- package/dist/esm/graylists/evm/token-permit-metadata.js +7 -1
- package/dist/esm/graylists/evm/token-permit-metadata.js.map +1 -1
- package/dist/esm/helpers/address.js +133 -61
- package/dist/esm/helpers/address.js.map +1 -1
- package/dist/esm/helpers/amount.js +5 -0
- package/dist/esm/helpers/amount.js.map +1 -0
- package/dist/esm/helpers/evm-dln-hook-pack.js +15 -4
- package/dist/esm/helpers/evm-dln-hook-pack.js.map +1 -1
- package/dist/esm/helpers/evm-gas-compensation-tx.js +12 -27
- package/dist/esm/helpers/evm-gas-compensation-tx.js.map +1 -1
- package/dist/esm/helpers/evm-intent-id-abi.js +7 -0
- package/dist/esm/helpers/evm-intent-id-abi.js.map +1 -1
- package/dist/esm/helpers/evm-trade-amounts.js +12 -4
- package/dist/esm/helpers/evm-trade-amounts.js.map +1 -1
- package/dist/esm/helpers/expected-delegate.js +2 -6
- package/dist/esm/helpers/expected-delegate.js.map +1 -1
- package/dist/esm/helpers/gas-compensation.js +9 -5
- package/dist/esm/helpers/gas-compensation.js.map +1 -1
- package/dist/esm/helpers/interactions.js +5 -21
- package/dist/esm/helpers/interactions.js.map +1 -1
- package/dist/esm/helpers/synthetic-native-wrap.js +4 -3
- package/dist/esm/helpers/synthetic-native-wrap.js.map +1 -1
- package/dist/esm/types/enums.js +1 -0
- package/dist/esm/types/enums.js.map +1 -1
- package/dist/esm/types/request.js +15 -2
- package/dist/esm/types/request.js.map +1 -1
- package/dist/esm/types/response.js +3 -2
- package/dist/esm/types/response.js.map +1 -1
- package/dist/esm/types/validation.js +21 -3
- package/dist/esm/types/validation.js.map +1 -1
- package/dist/esm/validations/compensation-hook.js +4 -5
- package/dist/esm/validations/compensation-hook.js.map +1 -1
- package/dist/esm/validations/cost-token.js +9 -1
- package/dist/esm/validations/cost-token.js.map +1 -1
- package/dist/esm/validations/echo-fields.js +18 -0
- package/dist/esm/validations/echo-fields.js.map +1 -1
- package/dist/esm/validations/evm-caveats.js +3 -0
- package/dist/esm/validations/evm-caveats.js.map +1 -1
- package/dist/esm/validations/evm-on-chain-intent.js +147 -0
- package/dist/esm/validations/evm-on-chain-intent.js.map +1 -0
- package/dist/esm/validations/evm-op-budget.js +25 -5
- package/dist/esm/validations/evm-op-budget.js.map +1 -1
- package/dist/esm/validations/evm-op-hook.js +8 -8
- package/dist/esm/validations/evm-op-hook.js.map +1 -1
- package/dist/esm/validations/evm-permit.js +18 -7
- package/dist/esm/validations/evm-permit.js.map +1 -1
- package/dist/esm/validations/evm-permit2.js +15 -7
- package/dist/esm/validations/evm-permit2.js.map +1 -1
- package/dist/esm/validations/evm-required-actions.js +28 -9
- package/dist/esm/validations/evm-required-actions.js.map +1 -1
- package/dist/esm/validations/evm-sign712-metamask.js +4 -126
- package/dist/esm/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/esm/validations/evm-sign712-shared.js +126 -1
- package/dist/esm/validations/evm-sign712-shared.js.map +1 -1
- package/dist/esm/validations/evm-sign712.js +17 -2
- package/dist/esm/validations/evm-sign712.js.map +1 -1
- package/dist/esm/validations/evm-sign7702.js +2 -0
- package/dist/esm/validations/evm-sign7702.js.map +1 -1
- package/dist/esm/validations/evm-transaction.js +7 -1
- package/dist/esm/validations/evm-transaction.js.map +1 -1
- package/dist/esm/validations/external-call.js +10 -21
- package/dist/esm/validations/external-call.js.map +1 -1
- package/dist/esm/validations/hook-version.js +31 -0
- package/dist/esm/validations/hook-version.js.map +1 -0
- package/dist/esm/validations/hooks-common.js +75 -200
- package/dist/esm/validations/hooks-common.js.map +1 -1
- package/dist/esm/validations/intent-destinations.js +53 -51
- package/dist/esm/validations/intent-destinations.js.map +1 -1
- package/dist/esm/validations/intent-tokens.js +320 -80
- package/dist/esm/validations/intent-tokens.js.map +1 -1
- package/dist/esm/validations/intent.js +34 -26
- package/dist/esm/validations/intent.js.map +1 -1
- package/dist/esm/validations/max-reserved.js +51 -0
- package/dist/esm/validations/max-reserved.js.map +1 -0
- package/dist/esm/validations/on-chain-intent-submission.js +67 -0
- package/dist/esm/validations/on-chain-intent-submission.js.map +1 -0
- package/dist/esm/validations/ptp.js +9 -6
- package/dist/esm/validations/ptp.js.map +1 -1
- package/dist/esm/validations/refill.js +11 -5
- package/dist/esm/validations/refill.js.map +1 -1
- package/dist/esm/validations/solana-hook.js +12 -64
- package/dist/esm/validations/solana-hook.js.map +1 -1
- package/dist/esm/validations/solana-op-budget.js +1 -1
- package/dist/esm/validations/solana-op-budget.js.map +1 -1
- package/dist/esm/validations/solana-op-wrap.js +30 -48
- package/dist/esm/validations/solana-op-wrap.js.map +1 -1
- package/dist/esm/validations/solana-required-actions.js +2 -2
- package/dist/esm/validations/solana-required-actions.js.map +1 -1
- package/dist/esm/validations/solana-transaction.js +4 -53
- package/dist/esm/validations/solana-transaction.js.map +1 -1
- package/dist/esm/validations/total-dst-amount.js +20 -4
- package/dist/esm/validations/total-dst-amount.js.map +1 -1
- package/dist/esm/validations/trade-grouping.js +35 -10
- package/dist/esm/validations/trade-grouping.js.map +1 -1
- package/dist/esm/validations/trade-matching.js +1 -1
- package/dist/esm/validations/trade-matching.js.map +1 -1
- package/dist/esm/validations/trades.js +29 -9
- package/dist/esm/validations/trades.js.map +1 -1
- package/dist/esm/validator.js +28 -17
- package/dist/esm/validator.js.map +1 -1
- package/dist/esm/whitelists/environment-config.js +8 -27
- package/dist/esm/whitelists/environment-config.js.map +1 -1
- package/dist/esm/whitelists/types.js +3 -6
- package/dist/esm/whitelists/types.js.map +1 -1
- package/dist/types/graylists/evm/token-permit-metadata.d.ts.map +1 -1
- package/dist/types/helpers/address.d.ts +9 -5
- package/dist/types/helpers/address.d.ts.map +1 -1
- package/dist/types/helpers/amount.d.ts +2 -0
- package/dist/types/helpers/amount.d.ts.map +1 -0
- package/dist/types/helpers/evm-dln-hook-pack.d.ts +1 -0
- package/dist/types/helpers/evm-dln-hook-pack.d.ts.map +1 -1
- package/dist/types/helpers/evm-gas-compensation-tx.d.ts +1 -3
- package/dist/types/helpers/evm-gas-compensation-tx.d.ts.map +1 -1
- package/dist/types/helpers/evm-intent-id-abi.d.ts +111 -0
- package/dist/types/helpers/evm-intent-id-abi.d.ts.map +1 -1
- package/dist/types/helpers/evm-trade-amounts.d.ts.map +1 -1
- package/dist/types/helpers/expected-delegate.d.ts.map +1 -1
- package/dist/types/helpers/gas-compensation.d.ts.map +1 -1
- package/dist/types/helpers/interactions.d.ts.map +1 -1
- package/dist/types/helpers/synthetic-native-wrap.d.ts.map +1 -1
- package/dist/types/types/enums.d.ts +1 -0
- package/dist/types/types/enums.d.ts.map +1 -1
- package/dist/types/types/request.d.ts +32 -23
- package/dist/types/types/request.d.ts.map +1 -1
- package/dist/types/types/response.d.ts +10 -42
- package/dist/types/types/response.d.ts.map +1 -1
- package/dist/types/types/validation.d.ts +19 -4
- package/dist/types/types/validation.d.ts.map +1 -1
- package/dist/types/validations/compensation-hook.d.ts +1 -2
- package/dist/types/validations/compensation-hook.d.ts.map +1 -1
- package/dist/types/validations/cost-token.d.ts.map +1 -1
- package/dist/types/validations/echo-fields.d.ts.map +1 -1
- package/dist/types/validations/evm-caveats.d.ts.map +1 -1
- package/dist/types/validations/evm-on-chain-intent.d.ts +4 -0
- package/dist/types/validations/evm-on-chain-intent.d.ts.map +1 -0
- package/dist/types/validations/evm-op-budget.d.ts.map +1 -1
- package/dist/types/validations/evm-op-hook.d.ts.map +1 -1
- package/dist/types/validations/evm-permit.d.ts.map +1 -1
- package/dist/types/validations/evm-permit2.d.ts.map +1 -1
- package/dist/types/validations/evm-required-actions.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712-metamask.d.ts +0 -11
- package/dist/types/validations/evm-sign712-metamask.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712-shared.d.ts +12 -0
- package/dist/types/validations/evm-sign712-shared.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712.d.ts +1 -0
- package/dist/types/validations/evm-sign712.d.ts.map +1 -1
- package/dist/types/validations/evm-sign7702.d.ts.map +1 -1
- package/dist/types/validations/evm-transaction.d.ts +1 -1
- package/dist/types/validations/evm-transaction.d.ts.map +1 -1
- package/dist/types/validations/external-call.d.ts.map +1 -1
- package/dist/types/validations/hook-version.d.ts +7 -0
- package/dist/types/validations/hook-version.d.ts.map +1 -0
- package/dist/types/validations/hooks-common.d.ts +1 -4
- package/dist/types/validations/hooks-common.d.ts.map +1 -1
- package/dist/types/validations/intent-destinations.d.ts.map +1 -1
- package/dist/types/validations/intent-tokens.d.ts.map +1 -1
- package/dist/types/validations/max-reserved.d.ts +3 -0
- package/dist/types/validations/max-reserved.d.ts.map +1 -0
- package/dist/types/validations/on-chain-intent-submission.d.ts +3 -0
- package/dist/types/validations/on-chain-intent-submission.d.ts.map +1 -0
- package/dist/types/validations/ptp.d.ts.map +1 -1
- package/dist/types/validations/refill.d.ts.map +1 -1
- package/dist/types/validations/solana-hook.d.ts +1 -2
- package/dist/types/validations/solana-hook.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.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/total-dst-amount.d.ts.map +1 -1
- package/dist/types/validations/trade-grouping.d.ts +1 -0
- 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 +0 -1
- package/dist/types/whitelists/environment-config.d.ts.map +1 -1
- package/dist/types/whitelists/types.d.ts +0 -1
- package/dist/types/whitelists/types.d.ts.map +1 -1
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ When a user submits a bundle request to the deBridge API, the response contains
|
|
|
8
8
|
|
|
9
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
10
|
|
|
11
|
-
This SDK runs on the client
|
|
11
|
+
This SDK runs on the client before signing. It validates the response structure and checks signable payloads against the original request, protocol invariants, and environment-specific whitelists.
|
|
12
12
|
|
|
13
13
|
### Threats mitigated
|
|
14
14
|
|
|
@@ -23,11 +23,12 @@ This SDK runs on the client and independently verifies that every signable field
|
|
|
23
23
|
npm install @debridge-finance/borderless-validation-sdk
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
Declared peer dependency ranges:
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
- `@solana/web3.js >= 1.90.0`
|
|
29
|
+
- `bs58 >= 5.0.0`
|
|
30
|
+
- `viem >= 2.0.0`
|
|
31
|
+
- `zod ^3.0.0 || ^4.0.0`
|
|
31
32
|
|
|
32
33
|
## Basic usage
|
|
33
34
|
|
|
@@ -83,8 +84,6 @@ createValidator(config: ValidatorConfig): Validator
|
|
|
83
84
|
|
|
84
85
|
type ValidatorConfig = {
|
|
85
86
|
environment: Environment;
|
|
86
|
-
allowLegacyHookV1?: boolean;
|
|
87
|
-
validateSolverExecutorAddress?: boolean;
|
|
88
87
|
};
|
|
89
88
|
|
|
90
89
|
type Validator = {
|
|
@@ -115,9 +114,9 @@ The SDK is designed to run **between** receiving the API response and presenting
|
|
|
115
114
|
### 1. Where to call
|
|
116
115
|
|
|
117
116
|
```
|
|
118
|
-
|
|
119
|
-
│ Build request│ ──▶ │ fetch() │ ──▶ │ validator.validate│ ──▶ │ Sign / submit│
|
|
120
|
-
|
|
117
|
+
┌───────────────┐ ┌─────────┐ ┌────────────────────┐ ┌───────────────┐
|
|
118
|
+
│ Build request │ ──▶ │ fetch() │ ──▶ │ validator.validate │ ──▶ │ Sign / submit │
|
|
119
|
+
└───────────────┘ └─────────┘ └────────────────────┘ └───────────────┘
|
|
121
120
|
│
|
|
122
121
|
▼
|
|
123
122
|
ok ? proceed : block
|
|
@@ -189,15 +188,125 @@ See [`src/README.md`](./src/README.md) for an overview of the source code struct
|
|
|
189
188
|
- Zod 3 E2E compatibility tests (CI mode): `npm run test:e2e:zod3:ci`
|
|
190
189
|
- Zod 3/4 full compatibility checks: `npm run test:zod-compat`
|
|
191
190
|
- Unit test coverage: `npm run coverage`
|
|
192
|
-
- E2E tests (
|
|
191
|
+
- E2E tests (use the stage API by default; override with `API_BASE_URL`): `npm run test:e2e`
|
|
192
|
+
- E2E tests with validation-case recording: `npm run test:e2e:record-validation-cases`
|
|
193
193
|
- E2E tests (CI mode, serial with longer timeout): `npm run test:e2e:ci`
|
|
194
194
|
- E2E coverage: `npm run coverage:e2e`
|
|
195
|
+
- Download the matching Java validator CLI: `npm run download:java-validator-cli`
|
|
196
|
+
- Compare TypeScript and Java E2E validation results: `npm run test:e2e:java-parity`
|
|
195
197
|
- Full build: `npm run build`
|
|
196
198
|
- Build ESM only: `npm run build:esm`
|
|
197
199
|
- Build CJS only: `npm run build:cjs`
|
|
198
200
|
- Build type declarations only: `npm run build:types`
|
|
199
201
|
- Clean build output: `npm run clean`
|
|
200
202
|
|
|
203
|
+
## Java parity E2E validation
|
|
204
|
+
|
|
205
|
+
This check runs the repository's E2E validation cases through both the TypeScript SDK and its
|
|
206
|
+
Java port, then verifies that both implementations produce equivalent validation results.
|
|
207
|
+
|
|
208
|
+
### 1. Running the check
|
|
209
|
+
|
|
210
|
+
Use the TypeScript SDK version from the root `package.json`:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
npm run test:e2e:java-parity
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
To select the Java release associated with another TypeScript SDK version, pass that version
|
|
217
|
+
explicitly:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
npm run test:e2e:java-parity [-- <typescript-sdk-version>]
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
The argument selects the Java release mapping only. It does not check out or install that version of the TypeScript SDK; TypeScript results always come from the current working tree.
|
|
224
|
+
|
|
225
|
+
The command requires Java and access to GitHub releases. For authenticated GitHub access, it uses
|
|
226
|
+
`GITHUB_TOKEN`, `GH_TOKEN`, or the token returned by `gh auth token`, in that order.
|
|
227
|
+
|
|
228
|
+
### 2. Execution flow and generated files
|
|
229
|
+
|
|
230
|
+
The command performs the following steps:
|
|
231
|
+
|
|
232
|
+
1. Determines the requested TypeScript SDK version from the command-line argument or the root
|
|
233
|
+
`package.json`.
|
|
234
|
+
2. Finds the newest published Java release whose release notes contain
|
|
235
|
+
`TypeScript SDK tag: v<version>` and expects that release to contain exactly one `cli-*.jar`
|
|
236
|
+
asset.
|
|
237
|
+
3. Downloads and verifies the Java CLI, unless the same verified release is already cached under:
|
|
238
|
+
|
|
239
|
+
```text
|
|
240
|
+
.cache/java-validation-sdk/releases/<typescript-version>/<java-release-tag>/
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
This directory contains the CLI JAR and its `metadata.json` cache metadata.
|
|
244
|
+
4. Checks that the Java CLI supports the expected CLI contract version.
|
|
245
|
+
5. Runs the regular TypeScript E2E suite with validation-case recording enabled. Every Jest worker
|
|
246
|
+
writes its validator inputs and TypeScript results to a separate JSONL file:
|
|
247
|
+
|
|
248
|
+
```text
|
|
249
|
+
.cache/recorded-validation-cases/<date>__<unix-timestamp>/
|
|
250
|
+
└── recorded-cases__pid-<pid>.jsonl
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Each JSONL line contains the test identity, validator URL, request, response, validator config,
|
|
254
|
+
and TypeScript `ValidationResult` for one validator invocation.
|
|
255
|
+
6. Sends every recorded input to the Java CLI daemon in the same order and reads one Java
|
|
256
|
+
`ValidationResult` per input.
|
|
257
|
+
7. Compares the corresponding TypeScript and Java results. Up to ten mismatches are printed to the
|
|
258
|
+
console. The complete mismatch report is written to:
|
|
259
|
+
|
|
260
|
+
```text
|
|
261
|
+
.cache/java-validation-sdk/parity-check-runs/<date>__<unix-timestamp>/mismatches.json
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
The temporary `.cache/recorded-validation-cases/latest-run.json` file connects the E2E recorder to
|
|
265
|
+
the parity runner and is removed when the command finishes. A successful parity check also removes
|
|
266
|
+
its recorded validation cases. If E2E execution or parity comparison fails, the recorded cases are
|
|
267
|
+
preserved for investigation. A parity-check run directory is created only when mismatches need to
|
|
268
|
+
be reported.
|
|
269
|
+
|
|
270
|
+
### 3. Comparison rules
|
|
271
|
+
|
|
272
|
+
The raw `ValidationResult` objects are not compared directly. Each result is reduced to this shape:
|
|
273
|
+
|
|
274
|
+
```ts
|
|
275
|
+
{
|
|
276
|
+
ok: boolean;
|
|
277
|
+
violations: Array<{
|
|
278
|
+
code: string;
|
|
279
|
+
path: string;
|
|
280
|
+
expected?: unknown;
|
|
281
|
+
actual?: unknown;
|
|
282
|
+
}>;
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
The comparison includes:
|
|
287
|
+
|
|
288
|
+
- the top-level `ok` value;
|
|
289
|
+
- the number of violations, including duplicate violations;
|
|
290
|
+
- each violation's `code` and `path`;
|
|
291
|
+
- the presence and JSON value of `expected` and `actual`;
|
|
292
|
+
- nested value types, string casing, and array element order inside `expected` and `actual`.
|
|
293
|
+
|
|
294
|
+
Before comparison:
|
|
295
|
+
|
|
296
|
+
- violations are sorted, so the order in which the two SDKs report violations does not matter;
|
|
297
|
+
- object keys are sorted recursively, so object property order does not matter;
|
|
298
|
+
- arrays are not sorted, so their element order remains significant.
|
|
299
|
+
|
|
300
|
+
The comparison intentionally ignores:
|
|
301
|
+
|
|
302
|
+
- violation `message` text;
|
|
303
|
+
- violation `details`;
|
|
304
|
+
- any other violation fields;
|
|
305
|
+
- any other top-level result fields.
|
|
306
|
+
|
|
307
|
+
After normalization, the two result objects are serialized and compared exactly. Any remaining
|
|
308
|
+
difference is reported as a parity mismatch.
|
|
309
|
+
|
|
201
310
|
## License
|
|
202
311
|
|
|
203
312
|
BUSL-1.1
|
|
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.TOKEN_PERMIT_METADATA = void 0;
|
|
8
8
|
exports.getTokenPermitMetadata = getTokenPermitMetadata;
|
|
9
9
|
const enums_1 = require("../../types/enums");
|
|
10
|
+
const address_1 = require("../../helpers/address");
|
|
10
11
|
// Note: addresses in this map MUST be lowercased.
|
|
11
12
|
exports.TOKEN_PERMIT_METADATA = {
|
|
12
13
|
// TODO: extend this verified-only graylist with additional tokens after
|
|
@@ -56,6 +57,11 @@ function getTokenPermitMetadata(realChainId, tokenAddress) {
|
|
|
56
57
|
const chain = exports.TOKEN_PERMIT_METADATA[realChainId];
|
|
57
58
|
if (!chain)
|
|
58
59
|
return undefined;
|
|
59
|
-
|
|
60
|
+
try {
|
|
61
|
+
return chain[(0, address_1.addressToHex)(realChainId, tokenAddress)];
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
60
66
|
}
|
|
61
67
|
//# sourceMappingURL=token-permit-metadata.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-permit-metadata.js","sourceRoot":"","sources":["../../../../src/graylists/evm/token-permit-metadata.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,mEAAmE;AACnE,oEAAoE;AACpE,oEAAoE;;;
|
|
1
|
+
{"version":3,"file":"token-permit-metadata.js","sourceRoot":"","sources":["../../../../src/graylists/evm/token-permit-metadata.ts"],"names":[],"mappings":";AAAA,wEAAwE;AACxE,mEAAmE;AACnE,oEAAoE;AACpE,oEAAoE;;;AAiEpE,wDAYC;AA3ED,6CAA4C;AAC5C,mDAAqD;AAgBrD,kDAAkD;AACrC,QAAA,qBAAqB,GAA2B;IACzD,wEAAwE;IACxE,2EAA2E;IAC3E,uEAAuE;IACvE,kEAAkE;IAClE,CAAC,eAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;QAChF,4CAA4C,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,EAAE;QACtF,4CAA4C,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;KACvE;IACD,CAAC,eAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;IACD,CAAC,eAAO,CAAC,OAAO,CAAC,EAAE;QACf,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;IACD,CAAC,eAAO,CAAC,KAAK,CAAC,EAAE;QACb,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,KAAK,CAAC,EAAE;QACb,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,GAAG,CAAC,EAAE;QACX,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,SAAS,CAAC,EAAE;QACjB,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,IAAI,CAAC,EAAE;QACZ,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;IACD,CAAC,eAAO,CAAC,KAAK,CAAC,EAAE;QACb,4CAA4C,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;KAC/E;IACD,CAAC,eAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;IACD,CAAC,eAAO,CAAC,SAAS,CAAC,EAAE;QACjB,4CAA4C,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACnF;CACJ,CAAC;AAEF,SAAgB,sBAAsB,CAClC,WAAoB,EACpB,YAAoB;IAEpB,MAAM,KAAK,GAAG,6BAAqB,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE7B,IAAI,CAAC;QACD,OAAO,KAAK,CAAC,IAAA,sBAAY,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC"}
|
|
@@ -7,11 +7,15 @@ exports.TRON_NATIVE_ADDRESS = void 0;
|
|
|
7
7
|
exports.getChainEngine = getChainEngine;
|
|
8
8
|
exports.isEvmHexAddress = isEvmHexAddress;
|
|
9
9
|
exports.isTronAddress = isTronAddress;
|
|
10
|
+
exports.isTronAddressOrEvmHex = isTronAddressOrEvmHex;
|
|
11
|
+
exports.isSolanaAddress = isSolanaAddress;
|
|
12
|
+
exports.isAddressRepresentationValidForChain = isAddressRepresentationValidForChain;
|
|
13
|
+
exports.isAddressRepresentationValidForEngine = isAddressRepresentationValidForEngine;
|
|
10
14
|
exports.evmHexToTronAddress = evmHexToTronAddress;
|
|
11
15
|
exports.tronAddressToEvmHex = tronAddressToEvmHex;
|
|
12
|
-
exports.
|
|
16
|
+
exports.getAddressIdentityKey = getAddressIdentityKey;
|
|
17
|
+
exports.getAddressIdentityKeyByValue = getAddressIdentityKeyByValue;
|
|
13
18
|
exports.detectChainEngine = detectChainEngine;
|
|
14
|
-
exports.normalizeAddressByValue = normalizeAddressByValue;
|
|
15
19
|
exports.addressEquals = addressEquals;
|
|
16
20
|
exports.addressToHex = addressToHex;
|
|
17
21
|
exports.addressToHexByValue = addressToHexByValue;
|
|
@@ -22,8 +26,13 @@ const enums_1 = require("../types/enums");
|
|
|
22
26
|
const solana_1 = require("../whitelists/solana");
|
|
23
27
|
// Tron-specific addresses (Base58Check format)
|
|
24
28
|
exports.TRON_NATIVE_ADDRESS = "T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb";
|
|
25
|
-
const EVM_HEX_ADDRESS_REGEX = /^0x[0-9a-
|
|
29
|
+
const EVM_HEX_ADDRESS_REGEX = /^0x[0-9a-fA-F]{40}$/u;
|
|
30
|
+
const EVM_ADDRESS_BYTE_LENGTH = 20;
|
|
31
|
+
const SOLANA_ADDRESS_BYTE_LENGTH = 32;
|
|
26
32
|
const TRON_ADDRESS_PREFIX = 0x41;
|
|
33
|
+
const TRON_PAYLOAD_BYTE_LENGTH = 1 + EVM_ADDRESS_BYTE_LENGTH;
|
|
34
|
+
const TRON_CHECKSUM_BYTE_LENGTH = 4;
|
|
35
|
+
const TRON_ADDRESS_BYTE_LENGTH = TRON_PAYLOAD_BYTE_LENGTH + TRON_CHECKSUM_BYTE_LENGTH;
|
|
27
36
|
function getChainEngine(chainId) {
|
|
28
37
|
if (chainId === enums_1.ChainId.Tron)
|
|
29
38
|
return enums_1.ChainEngine.Tron;
|
|
@@ -35,16 +44,25 @@ function isEvmHexAddress(address) {
|
|
|
35
44
|
return EVM_HEX_ADDRESS_REGEX.test(address);
|
|
36
45
|
}
|
|
37
46
|
function isTronAddress(address) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
return decodeTronAddressBytes(address) !== undefined;
|
|
48
|
+
}
|
|
49
|
+
function isTronAddressOrEvmHex(address) {
|
|
50
|
+
return isEvmHexAddress(address) || isTronAddress(address);
|
|
51
|
+
}
|
|
52
|
+
function isSolanaAddress(address) {
|
|
53
|
+
return decodeSolanaAddressBytes(address) !== undefined;
|
|
54
|
+
}
|
|
55
|
+
// Use only for standalone semantic address fields. Encoded EIP-712, ABI and
|
|
56
|
+
// interaction fields keep their own stricter wire-format validation.
|
|
57
|
+
function isAddressRepresentationValidForChain(chainId, address) {
|
|
58
|
+
return isAddressRepresentationValidForEngine(getChainEngine(chainId), address);
|
|
59
|
+
}
|
|
60
|
+
function isAddressRepresentationValidForEngine(engine, address) {
|
|
61
|
+
if (engine === enums_1.ChainEngine.EVM)
|
|
62
|
+
return isEvmHexAddress(address);
|
|
63
|
+
if (engine === enums_1.ChainEngine.Tron)
|
|
64
|
+
return isTronAddressOrEvmHex(address);
|
|
65
|
+
return isSolanaAddress(address);
|
|
48
66
|
}
|
|
49
67
|
// Converts a 20-byte EVM hex address to Tron Base58Check format.
|
|
50
68
|
function evmHexToTronAddress(evmAddress) {
|
|
@@ -55,83 +73,141 @@ function evmHexToTronAddress(evmAddress) {
|
|
|
55
73
|
Uint8Array.of(TRON_ADDRESS_PREFIX),
|
|
56
74
|
(0, viem_1.hexToBytes)(evmAddress),
|
|
57
75
|
]);
|
|
58
|
-
const
|
|
59
|
-
const secondHash = (0, viem_1.sha256)((0, viem_1.hexToBytes)(firstHash));
|
|
60
|
-
const checksum = (0, viem_1.hexToBytes)(secondHash).slice(0, 4);
|
|
76
|
+
const checksum = computeTronChecksum(payload);
|
|
61
77
|
return bs58_1.default.encode((0, viem_1.concatBytes)([payload, checksum]));
|
|
62
78
|
}
|
|
63
|
-
// Converts Tron Base58Check address to EVM hex
|
|
64
|
-
// Tron address = 0x41 (1 byte prefix) + 20 bytes address + 4 bytes checksum
|
|
65
|
-
// We extract the 20-byte address part and return as 0x-prefixed hex
|
|
79
|
+
// Converts a valid Tron Base58Check address to its 20-byte EVM hex identity.
|
|
66
80
|
function tronAddressToEvmHex(tronAddress) {
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
81
|
+
const addressBytes = decodeTronAddressBytes(tronAddress);
|
|
82
|
+
if (addressBytes === undefined) {
|
|
83
|
+
throw new Error(`Invalid Tron Base58Check address: ${tronAddress}`);
|
|
84
|
+
}
|
|
70
85
|
return (0, viem_1.bytesToHex)(addressBytes);
|
|
71
86
|
}
|
|
72
|
-
//
|
|
73
|
-
|
|
87
|
+
// Builds a canonical address-byte key using the representation rules of the
|
|
88
|
+
// given chain. Malformed values have no address identity and return undefined.
|
|
89
|
+
function getAddressIdentityKey(chainId, address) {
|
|
74
90
|
const engine = getChainEngine(chainId);
|
|
75
|
-
return
|
|
91
|
+
return toCanonicalAddressHex(address, engine);
|
|
76
92
|
}
|
|
77
|
-
//
|
|
78
|
-
|
|
93
|
+
// Builds an address identity key using only its own value — no chainId needed.
|
|
94
|
+
function getAddressIdentityKeyByValue(address) {
|
|
95
|
+
return toCanonicalAddressHexByValue(address);
|
|
96
|
+
}
|
|
97
|
+
// Detects the chain engine from a valid address value alone. Ambiguous 20-byte
|
|
98
|
+
// hex belongs to the EVM-compatible representation. Invalid values have no
|
|
99
|
+
// detectable chain engine.
|
|
79
100
|
function detectChainEngine(address) {
|
|
80
|
-
if (address
|
|
101
|
+
if (isEvmHexAddress(address))
|
|
81
102
|
return enums_1.ChainEngine.EVM;
|
|
82
103
|
if (isTronAddress(address))
|
|
83
104
|
return enums_1.ChainEngine.Tron;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
function normalizeAddressByValue(address) {
|
|
88
|
-
return applyEngineNormalization(address, detectChainEngine(address));
|
|
89
|
-
}
|
|
90
|
-
function applyEngineNormalization(address, engine) {
|
|
91
|
-
if (engine === enums_1.ChainEngine.Tron || engine === enums_1.ChainEngine.Solana) {
|
|
92
|
-
return address; // case-sensitive
|
|
93
|
-
}
|
|
94
|
-
return address.toLowerCase(); // EVM: case-insensitive
|
|
105
|
+
if (isSolanaAddress(address))
|
|
106
|
+
return enums_1.ChainEngine.Solana;
|
|
107
|
+
return undefined;
|
|
95
108
|
}
|
|
96
|
-
// Compares
|
|
97
|
-
|
|
98
|
-
|
|
109
|
+
// Compares canonical address identity. Field-specific format validation must
|
|
110
|
+
// happen separately; malformed values never compare equal and never throw.
|
|
111
|
+
function addressEquals(chainId, left, right) {
|
|
112
|
+
const engine = getChainEngine(chainId);
|
|
113
|
+
const leftCanonical = toCanonicalAddressHex(left, engine);
|
|
114
|
+
const rightCanonical = toCanonicalAddressHex(right, engine);
|
|
115
|
+
return leftCanonical !== undefined
|
|
116
|
+
&& rightCanonical !== undefined
|
|
117
|
+
&& leftCanonical === rightCanonical;
|
|
99
118
|
}
|
|
100
119
|
// Raw byte representation, used when an address flows into the intent ID
|
|
101
|
-
// keccak256 hash. EVM → 20 bytes, Tron → 20 bytes
|
|
102
|
-
// prefix and checksum), Solana → 32 bytes (base58, no checksum).
|
|
120
|
+
// keccak256 hash. EVM → 20 bytes, Tron → 20 bytes, Solana → 32 bytes.
|
|
103
121
|
function addressToHex(chainId, address) {
|
|
104
|
-
|
|
122
|
+
const engine = getChainEngine(chainId);
|
|
123
|
+
const canonical = toCanonicalAddressHex(address, engine);
|
|
124
|
+
if (canonical === undefined) {
|
|
125
|
+
throw new Error(`Invalid ${enums_1.ChainEngine[engine]} address: ${address}`);
|
|
126
|
+
}
|
|
127
|
+
return canonical;
|
|
105
128
|
}
|
|
106
129
|
// Same as addressToHex but infers the engine from the address value alone.
|
|
107
130
|
// Use when the chainId is unknown (e.g. destinationChainIds = "any").
|
|
108
131
|
function addressToHexByValue(address) {
|
|
109
|
-
|
|
132
|
+
const canonical = toCanonicalAddressHexByValue(address);
|
|
133
|
+
if (canonical === undefined)
|
|
134
|
+
throw new Error(`Invalid address: ${address}`);
|
|
135
|
+
return canonical;
|
|
110
136
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
return address.
|
|
137
|
+
// Checks if address is the native token for the given chain.
|
|
138
|
+
function isNativeToken(address, chainId) {
|
|
139
|
+
const engine = getChainEngine(chainId);
|
|
140
|
+
if (engine === enums_1.ChainEngine.Tron) {
|
|
141
|
+
// Accept strict Tron Base58Check and the equivalent 20-byte EVM hex representation.
|
|
142
|
+
return addressEquals(chainId, address, exports.TRON_NATIVE_ADDRESS);
|
|
143
|
+
}
|
|
144
|
+
if (engine === enums_1.ChainEngine.Solana) {
|
|
145
|
+
// Accept only a valid 32-byte Solana Base58 address.
|
|
146
|
+
return addressEquals(chainId, address, solana_1.SYSTEM_PROGRAM);
|
|
117
147
|
}
|
|
148
|
+
// Accept only a valid 20-byte EVM hex address.
|
|
149
|
+
return isEvmHexAddress(address) && address.toLowerCase() === viem_1.zeroAddress;
|
|
150
|
+
}
|
|
151
|
+
function toCanonicalAddressHex(address, engine) {
|
|
118
152
|
if (engine === enums_1.ChainEngine.EVM) {
|
|
119
|
-
return address.toLowerCase();
|
|
153
|
+
return isEvmHexAddress(address) ? address.toLowerCase() : undefined;
|
|
120
154
|
}
|
|
121
155
|
if (engine === enums_1.ChainEngine.Tron) {
|
|
122
|
-
|
|
156
|
+
if (isEvmHexAddress(address))
|
|
157
|
+
return address.toLowerCase();
|
|
158
|
+
const bytes = decodeTronAddressBytes(address);
|
|
159
|
+
return bytes === undefined ? undefined : (0, viem_1.bytesToHex)(bytes);
|
|
123
160
|
}
|
|
124
|
-
|
|
161
|
+
const bytes = decodeSolanaAddressBytes(address);
|
|
162
|
+
return bytes === undefined ? undefined : (0, viem_1.bytesToHex)(bytes);
|
|
125
163
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
164
|
+
function toCanonicalAddressHexByValue(address) {
|
|
165
|
+
if (isEvmHexAddress(address))
|
|
166
|
+
return address.toLowerCase();
|
|
167
|
+
const tronBytes = decodeTronAddressBytes(address);
|
|
168
|
+
if (tronBytes !== undefined)
|
|
169
|
+
return (0, viem_1.bytesToHex)(tronBytes);
|
|
170
|
+
const solanaBytes = decodeSolanaAddressBytes(address);
|
|
171
|
+
return solanaBytes === undefined ? undefined : (0, viem_1.bytesToHex)(solanaBytes);
|
|
172
|
+
}
|
|
173
|
+
function decodeTronAddressBytes(address) {
|
|
174
|
+
const decoded = decodeBase58(address);
|
|
175
|
+
if (decoded === undefined || decoded.length !== TRON_ADDRESS_BYTE_LENGTH)
|
|
176
|
+
return undefined;
|
|
177
|
+
if (decoded[0] !== TRON_ADDRESS_PREFIX)
|
|
178
|
+
return undefined;
|
|
179
|
+
const payload = decoded.slice(0, TRON_PAYLOAD_BYTE_LENGTH);
|
|
180
|
+
const checksum = decoded.slice(TRON_PAYLOAD_BYTE_LENGTH);
|
|
181
|
+
if (!bytesEqual(checksum, computeTronChecksum(payload)))
|
|
182
|
+
return undefined;
|
|
183
|
+
return payload.slice(1);
|
|
184
|
+
}
|
|
185
|
+
function decodeSolanaAddressBytes(address) {
|
|
186
|
+
const decoded = decodeBase58(address);
|
|
187
|
+
return decoded?.length === SOLANA_ADDRESS_BYTE_LENGTH ? decoded : undefined;
|
|
188
|
+
}
|
|
189
|
+
function decodeBase58(value) {
|
|
190
|
+
if (value.length === 0)
|
|
191
|
+
return undefined;
|
|
192
|
+
try {
|
|
193
|
+
return bs58_1.default.decode(value);
|
|
131
194
|
}
|
|
132
|
-
|
|
133
|
-
return
|
|
195
|
+
catch {
|
|
196
|
+
return undefined;
|
|
134
197
|
}
|
|
135
|
-
|
|
198
|
+
}
|
|
199
|
+
function computeTronChecksum(payload) {
|
|
200
|
+
const firstHash = (0, viem_1.sha256)(payload);
|
|
201
|
+
const secondHash = (0, viem_1.sha256)((0, viem_1.hexToBytes)(firstHash));
|
|
202
|
+
return (0, viem_1.hexToBytes)(secondHash).slice(0, TRON_CHECKSUM_BYTE_LENGTH);
|
|
203
|
+
}
|
|
204
|
+
function bytesEqual(left, right) {
|
|
205
|
+
if (left.length !== right.length)
|
|
206
|
+
return false;
|
|
207
|
+
for (let i = 0; i < left.length; i++) {
|
|
208
|
+
if (left[i] !== right[i])
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
return true;
|
|
136
212
|
}
|
|
137
213
|
//# sourceMappingURL=address.js.map
|
|
@@ -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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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isMaxAmountMode = isMaxAmountMode;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
function isMaxAmountMode(amount) {
|
|
6
|
+
return amount === types_1.SpecialAmount.Max || amount === types_1.SpecialAmount.MaxReserved;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=amount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amount.js","sourceRoot":"","sources":["../../../src/helpers/amount.ts"],"names":[],"mappings":";;AAEA,0CAEC;AAJD,oCAAyC;AAEzC,SAAgB,eAAe,CAAC,MAAc;IAC1C,OAAO,MAAM,KAAK,qBAAa,CAAC,GAAG,IAAI,MAAM,KAAK,qBAAa,CAAC,WAAW,CAAC;AAChF,CAAC"}
|
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.packEvmHookV1 = packEvmHookV1;
|
|
4
4
|
exports.packEvmTransactionCall = packEvmTransactionCall;
|
|
5
|
+
exports.packEvmTransactionCallForTrade = packEvmTransactionCallForTrade;
|
|
5
6
|
exports.serializeDlnHook = serializeDlnHook;
|
|
6
7
|
const viem_1 = require("viem");
|
|
7
8
|
const enums_1 = require("../types/enums");
|
|
9
|
+
const subscription_to_chain_id_1 = require("../whitelists/subscription-to-chain-id");
|
|
10
|
+
const address_1 = require("./address");
|
|
8
11
|
const hex_1 = require("./hex");
|
|
9
12
|
// Hook envelope: ABI-encoded tuple prefixed with a `uint8 version=1` byte.
|
|
10
13
|
// keccak256 of these bytes is what ends up in `intent.externalCallHash`.
|
|
@@ -60,6 +63,18 @@ function packEvmTransactionCall(data, dstChainAuthorityAddress) {
|
|
|
60
63
|
targetPayload: inner,
|
|
61
64
|
});
|
|
62
65
|
}
|
|
66
|
+
function packEvmTransactionCallForTrade(data, trade) {
|
|
67
|
+
if (trade.dstChainAuthorityAddress === undefined) {
|
|
68
|
+
throw new Error("evm_transaction_call hook requires dstChainAuthorityAddress on the trade");
|
|
69
|
+
}
|
|
70
|
+
const realDestinationChainId = (0, subscription_to_chain_id_1.resolveChainId)(trade.dstChainId);
|
|
71
|
+
// The API converts a chain-native destination authority, including Tron
|
|
72
|
+
// Base58Check, to its raw address before ABI-encoding the EVM hook envelope.
|
|
73
|
+
const fallbackAddress = realDestinationChainId === undefined
|
|
74
|
+
? trade.dstChainAuthorityAddress
|
|
75
|
+
: (0, address_1.addressToHex)(realDestinationChainId, trade.dstChainAuthorityAddress);
|
|
76
|
+
return packEvmTransactionCall(data, fallbackAddress);
|
|
77
|
+
}
|
|
63
78
|
// Parses an EVM request trade's `dlnHook` JSON and returns the serialized
|
|
64
79
|
// external-call bytes used for hashing. Returns `undefined` when the trade has
|
|
65
80
|
// no hook. Throws on unknown / Solana hook types; Solana hooks are verified
|
|
@@ -73,10 +88,7 @@ function serializeDlnHook(trade) {
|
|
|
73
88
|
case enums_1.DlnHookType.EvmHookV1:
|
|
74
89
|
return packEvmHookV1(hook.data);
|
|
75
90
|
case enums_1.DlnHookType.EvmTransactionCall: {
|
|
76
|
-
|
|
77
|
-
throw new Error("evm_transaction_call hook requires dstChainAuthorityAddress on the trade");
|
|
78
|
-
}
|
|
79
|
-
return packEvmTransactionCall(hook.data, trade.dstChainAuthorityAddress);
|
|
91
|
+
return packEvmTransactionCallForTrade(hook.data, trade);
|
|
80
92
|
}
|
|
81
93
|
case enums_1.DlnHookType.SolanaSerializedInstructions:
|
|
82
94
|
throw new Error("Solana hook types are not folded into externalCallHash");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-dln-hook-pack.js","sourceRoot":"","sources":["../../../src/helpers/evm-dln-hook-pack.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"evm-dln-hook-pack.js","sourceRoot":"","sources":["../../../src/helpers/evm-dln-hook-pack.ts"],"names":[],"mappings":";;AA2CA,sCAaC;AASD,wDA4BC;AAED,wEAgBC;AAOD,4CAkBC;AAxID,+BAAmE;AACnE,0CAA6C;AAE7C,qFAAwE;AACxE,uCAAyC;AACzC,+BAA+C;AAE/C,2EAA2E;AAC3E,yEAAyE;AACzE,MAAM,cAAc,GAAG;IACnB,IAAI,EAAE,OAAO;IACb,UAAU,EAAE;QACR,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE;QAC5C,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE;QAC5C,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE;QACzC,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,EAAE;QAC/C,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,MAAM,EAAE;QACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;KACrC;CACK,CAAC;AAEX,MAAM,uBAAuB,GAAkB,MAAM,CAAC;AAsBtD,SAAgB,aAAa,CAAC,IAAmB;IAC7C,MAAM,KAAK,GAAG,IAAA,0BAAmB,EAC7B,CAAC,cAAc,CAAC,EAChB,CAAC;YACG,eAAe,EAAE,IAAI,CAAC,eAAgC;YACtD,eAAe,EAAE,IAAI,CAAC,MAAuB;YAC7C,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACjC,qBAAqB,EAAE,IAAI,CAAC,WAAW;YACvC,2BAA2B,EAAE,IAAI,CAAC,iBAAiB;YACnD,OAAO,EAAE,IAAA,4BAAsB,EAAC,IAAI,CAAC,aAAa,CAAC;SACtD,CAAC,CACL,CAAC;IACF,OAAO,IAAA,gBAAS,EAAC,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,8EAA8E;AAC9E,8CAA8C;AAC9C,qBAAqB;AACrB,kCAAkC;AAClC,uCAAuC;AACvC,+CAA+C;AAC/C,0BAA0B;AAC1B,SAAgB,sBAAsB,CAClC,IAA4B,EAC5B,wBAAgC;IAEhC,MAAM,KAAK,GAAG,IAAA,0BAAmB,EAC7B,CAAC;YACG,IAAI,EAAE,OAAO;YACb,UAAU,EAAE;gBACR,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC/B,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACjC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;aACtC;SACJ,CAAC,EACF,CAAC;YACG,EAAE,EAAE,IAAI,CAAC,EAAmB;YAC5B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAC5B,QAAQ,EAAE,IAAA,4BAAsB,EAAC,IAAI,CAAC,QAAQ,CAAC;SAClD,CAAC,CACL,CAAC;IAEF,OAAO,aAAa,CAAC;QACjB,eAAe,EAAE,wBAAwB;QACzC,MAAM,EAAE,kBAAW;QACnB,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,KAAK;QAClB,iBAAiB,EAAE,IAAI;QACvB,aAAa,EAAE,KAAK;KACvB,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,8BAA8B,CAC1C,IAA4B,EAC5B,KAAmB;IAEnB,IAAI,KAAK,CAAC,wBAAwB,KAAK,SAAS,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,sBAAsB,GAAG,IAAA,yCAAc,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChE,wEAAwE;IACxE,6EAA6E;IAC7E,MAAM,eAAe,GAAG,sBAAsB,KAAK,SAAS;QACxD,CAAC,CAAC,KAAK,CAAC,wBAAwB;QAChC,CAAC,CAAC,IAAA,sBAAY,EAAC,sBAAsB,EAAE,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAE3E,OAAO,sBAAsB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AACzD,CAAC;AAED,0EAA0E;AAC1E,+EAA+E;AAC/E,4EAA4E;AAC5E,gFAAgF;AAChF,kDAAkD;AAClD,SAAgB,gBAAgB,CAAC,KAAmB;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAErC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;IAEtD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,mBAAW,CAAC,SAAS;YACtB,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,KAAK,mBAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAClC,OAAO,8BAA8B,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,mBAAW,CAAC,4BAA4B;YACzC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC9E,OAAO,CAAC,CAAC,CAAC;YACN,MAAM,UAAU,GAAU,IAAI,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACL,CAAC;AACL,CAAC"}
|