@debridge-finance/borderless-validation-sdk 0.0.0-dev-dee2389
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/dist/cjs/graylists/evm/token-permit-metadata.js +28 -0
- package/dist/cjs/graylists/evm/token-permit-metadata.js.map +1 -0
- package/dist/cjs/helpers/address.js +75 -0
- package/dist/cjs/helpers/address.js.map +1 -0
- package/dist/cjs/helpers/caveat-decoder.js +60 -0
- package/dist/cjs/helpers/caveat-decoder.js.map +1 -0
- package/dist/cjs/helpers/constants.js +6 -0
- package/dist/cjs/helpers/constants.js.map +1 -0
- package/dist/cjs/helpers/evm-action.js +20 -0
- package/dist/cjs/helpers/evm-action.js.map +1 -0
- package/dist/cjs/helpers/evm-calldata.js +45 -0
- package/dist/cjs/helpers/evm-calldata.js.map +1 -0
- package/dist/cjs/helpers/evm-intent-id-abi.js +67 -0
- package/dist/cjs/helpers/evm-intent-id-abi.js.map +1 -0
- package/dist/cjs/helpers/evm-intent-id.js +70 -0
- package/dist/cjs/helpers/evm-intent-id.js.map +1 -0
- package/dist/cjs/helpers/evm-token.js +30 -0
- package/dist/cjs/helpers/evm-token.js.map +1 -0
- package/dist/cjs/helpers/evm-trade-amounts.js +42 -0
- package/dist/cjs/helpers/evm-trade-amounts.js.map +1 -0
- package/dist/cjs/helpers/solana-instruction.js +160 -0
- package/dist/cjs/helpers/solana-instruction.js.map +1 -0
- package/dist/cjs/helpers/solana-intent-id.js +460 -0
- package/dist/cjs/helpers/solana-intent-id.js.map +1 -0
- package/dist/cjs/helpers/solana-transaction-decode.js +58 -0
- package/dist/cjs/helpers/solana-transaction-decode.js.map +1 -0
- package/dist/cjs/helpers/zod.js +12 -0
- package/dist/cjs/helpers/zod.js.map +1 -0
- package/dist/cjs/index.js +9 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/types/enums.js +137 -0
- package/dist/cjs/types/enums.js.map +1 -0
- package/dist/cjs/types/index.js +21 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/request.js +65 -0
- package/dist/cjs/types/request.js.map +1 -0
- package/dist/cjs/types/response.js +252 -0
- package/dist/cjs/types/response.js.map +1 -0
- package/dist/cjs/types/validation.js +242 -0
- package/dist/cjs/types/validation.js.map +1 -0
- package/dist/cjs/validations/echo-fields.js +67 -0
- package/dist/cjs/validations/echo-fields.js.map +1 -0
- package/dist/cjs/validations/evm-caveats.js +235 -0
- package/dist/cjs/validations/evm-caveats.js.map +1 -0
- package/dist/cjs/validations/evm-op-budget.js +261 -0
- package/dist/cjs/validations/evm-op-budget.js.map +1 -0
- package/dist/cjs/validations/evm-op-gas-compensation.js +152 -0
- package/dist/cjs/validations/evm-op-gas-compensation.js.map +1 -0
- package/dist/cjs/validations/evm-op-hook.js +8 -0
- package/dist/cjs/validations/evm-op-hook.js.map +1 -0
- package/dist/cjs/validations/evm-op-wrap.js +112 -0
- package/dist/cjs/validations/evm-op-wrap.js.map +1 -0
- package/dist/cjs/validations/evm-permit.js +224 -0
- package/dist/cjs/validations/evm-permit.js.map +1 -0
- package/dist/cjs/validations/evm-permit2.js +361 -0
- package/dist/cjs/validations/evm-permit2.js.map +1 -0
- package/dist/cjs/validations/evm-required-actions.js +184 -0
- package/dist/cjs/validations/evm-required-actions.js.map +1 -0
- package/dist/cjs/validations/evm-sign712-metamask.js +147 -0
- package/dist/cjs/validations/evm-sign712-metamask.js.map +1 -0
- package/dist/cjs/validations/evm-sign712.js +203 -0
- package/dist/cjs/validations/evm-sign712.js.map +1 -0
- package/dist/cjs/validations/evm-sign7702.js +59 -0
- package/dist/cjs/validations/evm-sign7702.js.map +1 -0
- package/dist/cjs/validations/evm-transaction.js +38 -0
- package/dist/cjs/validations/evm-transaction.js.map +1 -0
- package/dist/cjs/validations/hooks-common.js +207 -0
- package/dist/cjs/validations/hooks-common.js.map +1 -0
- package/dist/cjs/validations/required-actions.js +69 -0
- package/dist/cjs/validations/required-actions.js.map +1 -0
- package/dist/cjs/validations/solana-hook.js +225 -0
- package/dist/cjs/validations/solana-hook.js.map +1 -0
- package/dist/cjs/validations/solana-op-budget.js +293 -0
- package/dist/cjs/validations/solana-op-budget.js.map +1 -0
- package/dist/cjs/validations/solana-op-wrap.js +191 -0
- package/dist/cjs/validations/solana-op-wrap.js.map +1 -0
- package/dist/cjs/validations/solana-required-actions.js +122 -0
- package/dist/cjs/validations/solana-required-actions.js.map +1 -0
- package/dist/cjs/validations/solana-sign.js +171 -0
- package/dist/cjs/validations/solana-sign.js.map +1 -0
- package/dist/cjs/validations/solana-transaction.js +238 -0
- package/dist/cjs/validations/solana-transaction.js.map +1 -0
- package/dist/cjs/validations/trade-grouping.js +165 -0
- package/dist/cjs/validations/trade-grouping.js.map +1 -0
- package/dist/cjs/validations/trade-intent-consistency.js +104 -0
- package/dist/cjs/validations/trade-intent-consistency.js.map +1 -0
- package/dist/cjs/validations/trades.js +517 -0
- package/dist/cjs/validations/trades.js.map +1 -0
- package/dist/cjs/validator.js +75 -0
- package/dist/cjs/validator.js.map +1 -0
- package/dist/cjs/whitelists/environment-config.js +118 -0
- package/dist/cjs/whitelists/environment-config.js.map +1 -0
- package/dist/cjs/whitelists/evm/caveat-enforcers.js +18 -0
- package/dist/cjs/whitelists/evm/caveat-enforcers.js.map +1 -0
- package/dist/cjs/whitelists/evm/delegation-manager.js +9 -0
- package/dist/cjs/whitelists/evm/delegation-manager.js.map +1 -0
- package/dist/cjs/whitelists/evm/eip7702-delegation.js +8 -0
- package/dist/cjs/whitelists/evm/eip7702-delegation.js.map +1 -0
- package/dist/cjs/whitelists/evm/index.js +17 -0
- package/dist/cjs/whitelists/evm/index.js.map +1 -0
- package/dist/cjs/whitelists/evm/permit2.js +18 -0
- package/dist/cjs/whitelists/evm/permit2.js.map +1 -0
- package/dist/cjs/whitelists/evm/weth.js +19 -0
- package/dist/cjs/whitelists/evm/weth.js.map +1 -0
- package/dist/cjs/whitelists/solana/index.js +19 -0
- package/dist/cjs/whitelists/solana/index.js.map +1 -0
- package/dist/cjs/whitelists/solana/intent-signature.js +25 -0
- package/dist/cjs/whitelists/solana/intent-signature.js.map +1 -0
- package/dist/cjs/whitelists/solana/programs.js +19 -0
- package/dist/cjs/whitelists/solana/programs.js.map +1 -0
- package/dist/cjs/whitelists/subscription-to-chain-id.js +36 -0
- package/dist/cjs/whitelists/subscription-to-chain-id.js.map +1 -0
- package/dist/cjs/whitelists/types.js +29 -0
- package/dist/cjs/whitelists/types.js.map +1 -0
- package/dist/esm/graylists/evm/token-permit-metadata.js +24 -0
- package/dist/esm/graylists/evm/token-permit-metadata.js.map +1 -0
- package/dist/esm/helpers/address.js +63 -0
- package/dist/esm/helpers/address.js.map +1 -0
- package/dist/esm/helpers/caveat-decoder.js +55 -0
- package/dist/esm/helpers/caveat-decoder.js.map +1 -0
- package/dist/esm/helpers/constants.js +3 -0
- package/dist/esm/helpers/constants.js.map +1 -0
- package/dist/esm/helpers/evm-action.js +16 -0
- package/dist/esm/helpers/evm-action.js.map +1 -0
- package/dist/esm/helpers/evm-calldata.js +39 -0
- package/dist/esm/helpers/evm-calldata.js.map +1 -0
- package/dist/esm/helpers/evm-intent-id-abi.js +64 -0
- package/dist/esm/helpers/evm-intent-id-abi.js.map +1 -0
- package/dist/esm/helpers/evm-intent-id.js +67 -0
- package/dist/esm/helpers/evm-intent-id.js.map +1 -0
- package/dist/esm/helpers/evm-token.js +25 -0
- package/dist/esm/helpers/evm-token.js.map +1 -0
- package/dist/esm/helpers/evm-trade-amounts.js +39 -0
- package/dist/esm/helpers/evm-trade-amounts.js.map +1 -0
- package/dist/esm/helpers/solana-instruction.js +146 -0
- package/dist/esm/helpers/solana-instruction.js.map +1 -0
- package/dist/esm/helpers/solana-intent-id.js +457 -0
- package/dist/esm/helpers/solana-intent-id.js.map +1 -0
- package/dist/esm/helpers/solana-transaction-decode.js +55 -0
- package/dist/esm/helpers/solana-transaction-decode.js.map +1 -0
- package/dist/esm/helpers/zod.js +9 -0
- package/dist/esm/helpers/zod.js.map +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/types/enums.js +134 -0
- package/dist/esm/types/enums.js.map +1 -0
- package/dist/esm/types/index.js +5 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/request.js +62 -0
- package/dist/esm/types/request.js.map +1 -0
- package/dist/esm/types/response.js +249 -0
- package/dist/esm/types/response.js.map +1 -0
- package/dist/esm/types/validation.js +239 -0
- package/dist/esm/types/validation.js.map +1 -0
- package/dist/esm/validations/echo-fields.js +64 -0
- package/dist/esm/validations/echo-fields.js.map +1 -0
- package/dist/esm/validations/evm-caveats.js +228 -0
- package/dist/esm/validations/evm-caveats.js.map +1 -0
- package/dist/esm/validations/evm-op-budget.js +258 -0
- package/dist/esm/validations/evm-op-budget.js.map +1 -0
- package/dist/esm/validations/evm-op-gas-compensation.js +149 -0
- package/dist/esm/validations/evm-op-gas-compensation.js.map +1 -0
- package/dist/esm/validations/evm-op-hook.js +5 -0
- package/dist/esm/validations/evm-op-hook.js.map +1 -0
- package/dist/esm/validations/evm-op-wrap.js +109 -0
- package/dist/esm/validations/evm-op-wrap.js.map +1 -0
- package/dist/esm/validations/evm-permit.js +221 -0
- package/dist/esm/validations/evm-permit.js.map +1 -0
- package/dist/esm/validations/evm-permit2.js +358 -0
- package/dist/esm/validations/evm-permit2.js.map +1 -0
- package/dist/esm/validations/evm-required-actions.js +181 -0
- package/dist/esm/validations/evm-required-actions.js.map +1 -0
- package/dist/esm/validations/evm-sign712-metamask.js +144 -0
- package/dist/esm/validations/evm-sign712-metamask.js.map +1 -0
- package/dist/esm/validations/evm-sign712.js +200 -0
- package/dist/esm/validations/evm-sign712.js.map +1 -0
- package/dist/esm/validations/evm-sign7702.js +56 -0
- package/dist/esm/validations/evm-sign7702.js.map +1 -0
- package/dist/esm/validations/evm-transaction.js +35 -0
- package/dist/esm/validations/evm-transaction.js.map +1 -0
- package/dist/esm/validations/hooks-common.js +204 -0
- package/dist/esm/validations/hooks-common.js.map +1 -0
- package/dist/esm/validations/required-actions.js +66 -0
- package/dist/esm/validations/required-actions.js.map +1 -0
- package/dist/esm/validations/solana-hook.js +222 -0
- package/dist/esm/validations/solana-hook.js.map +1 -0
- package/dist/esm/validations/solana-op-budget.js +290 -0
- package/dist/esm/validations/solana-op-budget.js.map +1 -0
- package/dist/esm/validations/solana-op-wrap.js +188 -0
- package/dist/esm/validations/solana-op-wrap.js.map +1 -0
- package/dist/esm/validations/solana-required-actions.js +119 -0
- package/dist/esm/validations/solana-required-actions.js.map +1 -0
- package/dist/esm/validations/solana-sign.js +168 -0
- package/dist/esm/validations/solana-sign.js.map +1 -0
- package/dist/esm/validations/solana-transaction.js +234 -0
- package/dist/esm/validations/solana-transaction.js.map +1 -0
- package/dist/esm/validations/trade-grouping.js +161 -0
- package/dist/esm/validations/trade-grouping.js.map +1 -0
- package/dist/esm/validations/trade-intent-consistency.js +101 -0
- package/dist/esm/validations/trade-intent-consistency.js.map +1 -0
- package/dist/esm/validations/trades.js +514 -0
- package/dist/esm/validations/trades.js.map +1 -0
- package/dist/esm/validator.js +72 -0
- package/dist/esm/validator.js.map +1 -0
- package/dist/esm/whitelists/environment-config.js +115 -0
- package/dist/esm/whitelists/environment-config.js.map +1 -0
- package/dist/esm/whitelists/evm/caveat-enforcers.js +15 -0
- package/dist/esm/whitelists/evm/caveat-enforcers.js.map +1 -0
- package/dist/esm/whitelists/evm/delegation-manager.js +6 -0
- package/dist/esm/whitelists/evm/delegation-manager.js.map +1 -0
- package/dist/esm/whitelists/evm/eip7702-delegation.js +5 -0
- package/dist/esm/whitelists/evm/eip7702-delegation.js.map +1 -0
- package/dist/esm/whitelists/evm/index.js +6 -0
- package/dist/esm/whitelists/evm/index.js.map +1 -0
- package/dist/esm/whitelists/evm/permit2.js +15 -0
- package/dist/esm/whitelists/evm/permit2.js.map +1 -0
- package/dist/esm/whitelists/evm/weth.js +16 -0
- package/dist/esm/whitelists/evm/weth.js.map +1 -0
- package/dist/esm/whitelists/solana/index.js +3 -0
- package/dist/esm/whitelists/solana/index.js.map +1 -0
- package/dist/esm/whitelists/solana/intent-signature.js +22 -0
- package/dist/esm/whitelists/solana/intent-signature.js.map +1 -0
- package/dist/esm/whitelists/solana/programs.js +16 -0
- package/dist/esm/whitelists/solana/programs.js.map +1 -0
- package/dist/esm/whitelists/subscription-to-chain-id.js +32 -0
- package/dist/esm/whitelists/subscription-to-chain-id.js.map +1 -0
- package/dist/esm/whitelists/types.js +26 -0
- package/dist/esm/whitelists/types.js.map +1 -0
- package/dist/types/graylists/evm/token-permit-metadata.d.ts +11 -0
- package/dist/types/graylists/evm/token-permit-metadata.d.ts.map +1 -0
- package/dist/types/helpers/address.d.ts +13 -0
- package/dist/types/helpers/address.d.ts.map +1 -0
- package/dist/types/helpers/caveat-decoder.d.ts +13 -0
- package/dist/types/helpers/caveat-decoder.d.ts.map +1 -0
- package/dist/types/helpers/constants.d.ts +2 -0
- package/dist/types/helpers/constants.d.ts.map +1 -0
- package/dist/types/helpers/evm-action.d.ts +4 -0
- package/dist/types/helpers/evm-action.d.ts.map +1 -0
- package/dist/types/helpers/evm-calldata.d.ts +15 -0
- package/dist/types/helpers/evm-calldata.d.ts.map +1 -0
- package/dist/types/helpers/evm-intent-id-abi.d.ts +106 -0
- package/dist/types/helpers/evm-intent-id-abi.d.ts.map +1 -0
- package/dist/types/helpers/evm-intent-id.d.ts +3 -0
- package/dist/types/helpers/evm-intent-id.d.ts.map +1 -0
- package/dist/types/helpers/evm-token.d.ts +4 -0
- package/dist/types/helpers/evm-token.d.ts.map +1 -0
- package/dist/types/helpers/evm-trade-amounts.d.ts +16 -0
- package/dist/types/helpers/evm-trade-amounts.d.ts.map +1 -0
- package/dist/types/helpers/solana-instruction.d.ts +44 -0
- package/dist/types/helpers/solana-instruction.d.ts.map +1 -0
- package/dist/types/helpers/solana-intent-id.d.ts +3 -0
- package/dist/types/helpers/solana-intent-id.d.ts.map +1 -0
- package/dist/types/helpers/solana-transaction-decode.d.ts +18 -0
- package/dist/types/helpers/solana-transaction-decode.d.ts.map +1 -0
- package/dist/types/helpers/zod.d.ts +2 -0
- package/dist/types/helpers/zod.d.ts.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/types/enums.d.ts +112 -0
- package/dist/types/types/enums.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +5 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/types/request.d.ts +134 -0
- package/dist/types/types/request.d.ts.map +1 -0
- package/dist/types/types/response.d.ts +1140 -0
- package/dist/types/types/response.d.ts.map +1 -0
- package/dist/types/types/validation.d.ts +216 -0
- package/dist/types/types/validation.d.ts.map +1 -0
- package/dist/types/validations/echo-fields.d.ts +3 -0
- package/dist/types/validations/echo-fields.d.ts.map +1 -0
- package/dist/types/validations/evm-caveats.d.ts +33 -0
- package/dist/types/validations/evm-caveats.d.ts.map +1 -0
- package/dist/types/validations/evm-op-budget.d.ts +4 -0
- package/dist/types/validations/evm-op-budget.d.ts.map +1 -0
- package/dist/types/validations/evm-op-gas-compensation.d.ts +3 -0
- package/dist/types/validations/evm-op-gas-compensation.d.ts.map +1 -0
- package/dist/types/validations/evm-op-hook.d.ts +3 -0
- package/dist/types/validations/evm-op-hook.d.ts.map +1 -0
- package/dist/types/validations/evm-op-wrap.d.ts +3 -0
- package/dist/types/validations/evm-op-wrap.d.ts.map +1 -0
- package/dist/types/validations/evm-permit.d.ts +4 -0
- package/dist/types/validations/evm-permit.d.ts.map +1 -0
- package/dist/types/validations/evm-permit2.d.ts +4 -0
- package/dist/types/validations/evm-permit2.d.ts.map +1 -0
- package/dist/types/validations/evm-required-actions.d.ts +4 -0
- package/dist/types/validations/evm-required-actions.d.ts.map +1 -0
- package/dist/types/validations/evm-sign712-metamask.d.ts +3 -0
- package/dist/types/validations/evm-sign712-metamask.d.ts.map +1 -0
- package/dist/types/validations/evm-sign712.d.ts +4 -0
- package/dist/types/validations/evm-sign712.d.ts.map +1 -0
- package/dist/types/validations/evm-sign7702.d.ts +3 -0
- package/dist/types/validations/evm-sign7702.d.ts.map +1 -0
- package/dist/types/validations/evm-transaction.d.ts +3 -0
- package/dist/types/validations/evm-transaction.d.ts.map +1 -0
- package/dist/types/validations/hooks-common.d.ts +3 -0
- package/dist/types/validations/hooks-common.d.ts.map +1 -0
- package/dist/types/validations/required-actions.d.ts +4 -0
- package/dist/types/validations/required-actions.d.ts.map +1 -0
- package/dist/types/validations/solana-hook.d.ts +4 -0
- package/dist/types/validations/solana-hook.d.ts.map +1 -0
- package/dist/types/validations/solana-op-budget.d.ts +5 -0
- package/dist/types/validations/solana-op-budget.d.ts.map +1 -0
- package/dist/types/validations/solana-op-wrap.d.ts +4 -0
- package/dist/types/validations/solana-op-wrap.d.ts.map +1 -0
- package/dist/types/validations/solana-required-actions.d.ts +4 -0
- package/dist/types/validations/solana-required-actions.d.ts.map +1 -0
- package/dist/types/validations/solana-sign.d.ts +4 -0
- package/dist/types/validations/solana-sign.d.ts.map +1 -0
- package/dist/types/validations/solana-transaction.d.ts +5 -0
- package/dist/types/validations/solana-transaction.d.ts.map +1 -0
- package/dist/types/validations/trade-grouping.d.ts +22 -0
- package/dist/types/validations/trade-grouping.d.ts.map +1 -0
- package/dist/types/validations/trade-intent-consistency.d.ts +3 -0
- package/dist/types/validations/trade-intent-consistency.d.ts.map +1 -0
- package/dist/types/validations/trades.d.ts +3 -0
- package/dist/types/validations/trades.d.ts.map +1 -0
- package/dist/types/validator.d.ts +3 -0
- package/dist/types/validator.d.ts.map +1 -0
- package/dist/types/whitelists/environment-config.d.ts +4 -0
- package/dist/types/whitelists/environment-config.d.ts.map +1 -0
- package/dist/types/whitelists/evm/caveat-enforcers.d.ts +6 -0
- package/dist/types/whitelists/evm/caveat-enforcers.d.ts.map +1 -0
- package/dist/types/whitelists/evm/delegation-manager.d.ts +3 -0
- package/dist/types/whitelists/evm/delegation-manager.d.ts.map +1 -0
- package/dist/types/whitelists/evm/eip7702-delegation.d.ts +3 -0
- package/dist/types/whitelists/evm/eip7702-delegation.d.ts.map +1 -0
- package/dist/types/whitelists/evm/index.d.ts +6 -0
- package/dist/types/whitelists/evm/index.d.ts.map +1 -0
- package/dist/types/whitelists/evm/permit2.d.ts +3 -0
- package/dist/types/whitelists/evm/permit2.d.ts.map +1 -0
- package/dist/types/whitelists/evm/weth.d.ts +3 -0
- package/dist/types/whitelists/evm/weth.d.ts.map +1 -0
- package/dist/types/whitelists/solana/index.d.ts +3 -0
- package/dist/types/whitelists/solana/index.d.ts.map +1 -0
- package/dist/types/whitelists/solana/intent-signature.d.ts +9 -0
- package/dist/types/whitelists/solana/intent-signature.d.ts.map +1 -0
- package/dist/types/whitelists/solana/programs.d.ts +9 -0
- package/dist/types/whitelists/solana/programs.d.ts.map +1 -0
- package/dist/types/whitelists/subscription-to-chain-id.d.ts +4 -0
- package/dist/types/whitelists/subscription-to-chain-id.d.ts.map +1 -0
- package/dist/types/whitelists/types.d.ts +18 -0
- package/dist/types/whitelists/types.d.ts.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateSolanaBudgetInstructions = validateSolanaBudgetInstructions;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
const address_1 = require("../helpers/address");
|
|
6
|
+
const constants_1 = require("../helpers/constants");
|
|
7
|
+
const solana_instruction_1 = require("../helpers/solana-instruction");
|
|
8
|
+
const programs_1 = require("../whitelists/solana/programs");
|
|
9
|
+
const TOKEN_PROGRAMS = new Set([programs_1.SPL_TOKEN_PROGRAM, programs_1.SPL_TOKEN_2022_PROGRAM]);
|
|
10
|
+
// =============================================
|
|
11
|
+
// Entry point
|
|
12
|
+
// =============================================
|
|
13
|
+
// Validates Budget (approve) instructions within a decoded Solana transaction.
|
|
14
|
+
// Called for both Transaction (AA=false) and SignTransaction (AA=true) actions.
|
|
15
|
+
function validateSolanaBudgetInstructions(action, resolvedInstructions, actionPath, request, trades, realChainId, quoteMode, srcChainAuthorityAddress, envConfig) {
|
|
16
|
+
const hasBudgetAction = action.actions.includes(types_1.SolanaActionOperation.Budget);
|
|
17
|
+
// CRITICAL: Budget forbidden when approveAmountFlag === "none"
|
|
18
|
+
if (hasBudgetAction && request.approveAmountFlag === types_1.ApproveAmountFlag.None) {
|
|
19
|
+
return [{
|
|
20
|
+
code: types_1.ViolationCode.SolanaBudgetForbiddenWithApproveNone,
|
|
21
|
+
message: "Budget action is forbidden when approveAmountFlag=\"none\"",
|
|
22
|
+
path: `${actionPath}.actions`,
|
|
23
|
+
}];
|
|
24
|
+
}
|
|
25
|
+
// Find all approve instructions in the transaction
|
|
26
|
+
const approveInstructions = collectApproveInstructions(resolvedInstructions, envConfig.solanaIntentProgram);
|
|
27
|
+
// HIGH: if actions[] contains "Budget" at least one approve instruction must be present
|
|
28
|
+
if (hasBudgetAction && approveInstructions.length === 0) {
|
|
29
|
+
return [{
|
|
30
|
+
code: types_1.ViolationCode.SolanaBudgetNoApproveInstruction,
|
|
31
|
+
message: "actions[] contains \"Budget\" but no approve instruction found in transaction",
|
|
32
|
+
path: `${actionPath}.data.data`,
|
|
33
|
+
}];
|
|
34
|
+
}
|
|
35
|
+
// If no budget action declared and no approve instructions — nothing to validate
|
|
36
|
+
if (!hasBudgetAction)
|
|
37
|
+
return [];
|
|
38
|
+
const violations = [];
|
|
39
|
+
for (let i = 0; i < approveInstructions.length; i++) {
|
|
40
|
+
const approve = approveInstructions[i];
|
|
41
|
+
const ixLabel = `approve instruction #${i}`;
|
|
42
|
+
if (approve.kind === solana_instruction_1.ApproveKind.Classic) {
|
|
43
|
+
violations.push(...validateClassicApprove(approve, actionPath, ixLabel, request, trades, realChainId, quoteMode, srcChainAuthorityAddress, envConfig));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
violations.push(...validateCustomApprove(approve, actionPath, ixLabel, request, trades, realChainId, quoteMode, srcChainAuthorityAddress, envConfig));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return violations;
|
|
50
|
+
}
|
|
51
|
+
// =============================================
|
|
52
|
+
// Collect approve instructions
|
|
53
|
+
// =============================================
|
|
54
|
+
function collectApproveInstructions(instructions, intentProgram) {
|
|
55
|
+
const result = [];
|
|
56
|
+
for (const ix of instructions) {
|
|
57
|
+
if ((0, solana_instruction_1.isClassicApprove)(ix)) {
|
|
58
|
+
result.push((0, solana_instruction_1.decodeClassicApprove)(ix));
|
|
59
|
+
}
|
|
60
|
+
else if ((0, solana_instruction_1.isCustomApprove)(ix, intentProgram)) {
|
|
61
|
+
result.push((0, solana_instruction_1.decodeCustomApprove)(ix));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
// =============================================
|
|
67
|
+
// Classic SPL Token Approve validation
|
|
68
|
+
// =============================================
|
|
69
|
+
function validateClassicApprove(approve, actionPath, ixLabel, request, trades, realChainId, quoteMode, srcChainAuthorityAddress, envConfig) {
|
|
70
|
+
const violations = [];
|
|
71
|
+
// CRITICAL: programId (SPL Token or Token-2022) and discriminator (4 = Approve)
|
|
72
|
+
// are already verified by isClassicApprove() before this function is called.
|
|
73
|
+
// CRITICAL: delegate must be whitelisted AllowanceHolder
|
|
74
|
+
if (approve.delegate !== envConfig.solanaAllowanceHolder) {
|
|
75
|
+
violations.push({
|
|
76
|
+
code: types_1.ViolationCode.SolanaBudgetClassicDelegateNotWhitelisted,
|
|
77
|
+
message: `${ixLabel}: delegate is not a whitelisted AllowanceHolder`,
|
|
78
|
+
path: `${actionPath}.data.data`,
|
|
79
|
+
actual: approve.delegate,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// HIGH: owner must equal srcChainAuthorityAddress (execution mode only)
|
|
83
|
+
if (!quoteMode && srcChainAuthorityAddress) {
|
|
84
|
+
if (!(0, address_1.addressEquals)(realChainId, approve.owner, srcChainAuthorityAddress)) {
|
|
85
|
+
violations.push({
|
|
86
|
+
code: types_1.ViolationCode.SolanaBudgetClassicOwnerMismatch,
|
|
87
|
+
message: `${ixLabel}: owner must equal srcChainAuthorityAddress`,
|
|
88
|
+
path: `${actionPath}.data.data`,
|
|
89
|
+
expected: srcChainAuthorityAddress,
|
|
90
|
+
actual: approve.owner,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// CRITICAL: ATA must correspond to the trade token (execution mode only)
|
|
95
|
+
if (!quoteMode && srcChainAuthorityAddress) {
|
|
96
|
+
violations.push(...validateClassicAta(approve, actionPath, ixLabel, trades, realChainId, srcChainAuthorityAddress));
|
|
97
|
+
}
|
|
98
|
+
// CRITICAL: approve amount must match approveAmountFlag
|
|
99
|
+
violations.push(...validateApproveAmount(approve.amount, actionPath, ixLabel, request, trades, realChainId, types_1.ViolationCode.SolanaBudgetClassicAmountMismatch, false));
|
|
100
|
+
return violations;
|
|
101
|
+
}
|
|
102
|
+
// CRITICAL: Verify ATA matches expected (mint, owner, tokenProgram)
|
|
103
|
+
function validateClassicAta(approve, actionPath, ixLabel, trades, realChainId, srcChainAuthorityAddress) {
|
|
104
|
+
// Try each trade's srcChainTokenIn as mint — if any matches, the ATA is valid
|
|
105
|
+
const expectedAtas = [];
|
|
106
|
+
for (const trade of trades) {
|
|
107
|
+
try {
|
|
108
|
+
const expectedAta = (0, solana_instruction_1.deriveAta)(srcChainAuthorityAddress, trade.srcChainTokenIn, approve.tokenProgramId);
|
|
109
|
+
if ((0, address_1.addressEquals)(realChainId, approve.ataAddress, expectedAta)) {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
expectedAtas.push({ mint: trade.srcChainTokenIn, ata: expectedAta });
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Invalid PublicKey — skip this trade, continue checking others
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return [{
|
|
120
|
+
code: types_1.ViolationCode.SolanaBudgetClassicAtaMismatch,
|
|
121
|
+
message: `${ixLabel}: ATA does not match any trade token`
|
|
122
|
+
+ " (derived from srcChainTokenIn, srcChainAuthorityAddress, tokenProgram)",
|
|
123
|
+
path: `${actionPath}.data.data`,
|
|
124
|
+
expected: expectedAtas,
|
|
125
|
+
actual: approve.ataAddress,
|
|
126
|
+
}];
|
|
127
|
+
}
|
|
128
|
+
// =============================================
|
|
129
|
+
// Custom approve (approveProtocolTransfers) validation
|
|
130
|
+
// =============================================
|
|
131
|
+
function validateCustomApprove(approve, actionPath, ixLabel, request, trades, realChainId, quoteMode, srcChainAuthorityAddress, envConfig) {
|
|
132
|
+
const violations = [];
|
|
133
|
+
// CRITICAL: programId (DEBRIDGE_INTENT_PROGRAM) and discriminator (8-byte Anchor hash)
|
|
134
|
+
// are already verified by isCustomApprove() before this function is called.
|
|
135
|
+
// HIGH: maker must equal srcChainAuthorityAddress (execution mode only)
|
|
136
|
+
if (!quoteMode && srcChainAuthorityAddress) {
|
|
137
|
+
if (!(0, address_1.addressEquals)(realChainId, approve.maker, srcChainAuthorityAddress)) {
|
|
138
|
+
violations.push({
|
|
139
|
+
code: types_1.ViolationCode.SolanaBudgetCustomMakerMismatch,
|
|
140
|
+
message: `${ixLabel}: maker must equal srcChainAuthorityAddress`,
|
|
141
|
+
path: `${actionPath}.data.data`,
|
|
142
|
+
expected: srcChainAuthorityAddress,
|
|
143
|
+
actual: approve.maker,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// MEDIUM: state PDA must match expected derivation
|
|
148
|
+
if (!(0, address_1.addressEquals)(realChainId, approve.statePda, envConfig.solanaExpectedStatePdaBase58)) {
|
|
149
|
+
violations.push({
|
|
150
|
+
code: types_1.ViolationCode.SolanaBudgetCustomStatePdaMismatch,
|
|
151
|
+
message: `${ixLabel}: state PDA does not match expected derivation`,
|
|
152
|
+
path: `${actionPath}.data.data`,
|
|
153
|
+
expected: envConfig.solanaExpectedStatePdaBase58,
|
|
154
|
+
actual: approve.statePda,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// CRITICAL: tokenProgram must be SPL Token or Token-2022
|
|
158
|
+
if (!TOKEN_PROGRAMS.has(approve.tokenProgramId)) {
|
|
159
|
+
violations.push({
|
|
160
|
+
code: types_1.ViolationCode.SolanaBudgetCustomTokenProgramInvalid,
|
|
161
|
+
message: `${ixLabel}: tokenProgram must be SPL Token or Token-2022`,
|
|
162
|
+
path: `${actionPath}.data.data`,
|
|
163
|
+
expected: [...TOKEN_PROGRAMS],
|
|
164
|
+
actual: approve.tokenProgramId,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
// MEDIUM: vec_length must equal number of remaining accounts
|
|
168
|
+
if (approve.vecLength !== approve.ataAddresses.length) {
|
|
169
|
+
violations.push({
|
|
170
|
+
code: types_1.ViolationCode.SolanaBudgetCustomVecLengthMismatch,
|
|
171
|
+
message: `${ixLabel}: vec_length (${approve.vecLength})`
|
|
172
|
+
+ ` does not match remaining accounts count (${approve.ataAddresses.length})`,
|
|
173
|
+
path: `${actionPath}.data.data`,
|
|
174
|
+
expected: approve.ataAddresses.length,
|
|
175
|
+
actual: approve.vecLength,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
// CRITICAL: each ATA must correspond to a trade token (execution mode only)
|
|
179
|
+
if (!quoteMode && srcChainAuthorityAddress) {
|
|
180
|
+
violations.push(...validateCustomAtas(approve, actionPath, ixLabel, trades, realChainId, srcChainAuthorityAddress));
|
|
181
|
+
}
|
|
182
|
+
// CRITICAL: each amount must match approveAmountFlag
|
|
183
|
+
for (let i = 0; i < approve.amounts.length; i++) {
|
|
184
|
+
violations.push(...validateApproveAmount(approve.amounts[i], actionPath, `${ixLabel} amounts[${i}]`, request, trades, realChainId, types_1.ViolationCode.SolanaBudgetCustomAmountMismatch, true));
|
|
185
|
+
}
|
|
186
|
+
return violations;
|
|
187
|
+
}
|
|
188
|
+
// CRITICAL: Verify each ATA in custom approve matches expected (mint, owner, tokenProgram)
|
|
189
|
+
function validateCustomAtas(approve, actionPath, ixLabel, trades, realChainId, srcChainAuthorityAddress) {
|
|
190
|
+
const violations = [];
|
|
191
|
+
for (let i = 0; i < approve.ataAddresses.length; i++) {
|
|
192
|
+
const ata = approve.ataAddresses[i];
|
|
193
|
+
let matched = false;
|
|
194
|
+
const expectedAtas = [];
|
|
195
|
+
for (const trade of trades) {
|
|
196
|
+
try {
|
|
197
|
+
const expectedAta = (0, solana_instruction_1.deriveAta)(srcChainAuthorityAddress, trade.srcChainTokenIn, approve.tokenProgramId);
|
|
198
|
+
if ((0, address_1.addressEquals)(realChainId, ata, expectedAta)) {
|
|
199
|
+
matched = true;
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
expectedAtas.push({ mint: trade.srcChainTokenIn, ata: expectedAta });
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (!matched) {
|
|
209
|
+
violations.push({
|
|
210
|
+
code: types_1.ViolationCode.SolanaBudgetCustomAtaMismatch,
|
|
211
|
+
message: `${ixLabel} accounts[${i + solana_instruction_1.CUSTOM_APPROVE_FIRST_ATA_INDEX}]:`
|
|
212
|
+
+ " ATA does not match any trade token"
|
|
213
|
+
+ " (derived from srcChainTokenIn, srcChainAuthorityAddress, tokenProgram)",
|
|
214
|
+
path: `${actionPath}.data.data`,
|
|
215
|
+
expected: expectedAtas,
|
|
216
|
+
actual: ata,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return violations;
|
|
221
|
+
}
|
|
222
|
+
// =============================================
|
|
223
|
+
// Approve amount validation (shared by classic and custom)
|
|
224
|
+
// =============================================
|
|
225
|
+
// allowDelta: when true, amount <= sum is accepted (not just ===).
|
|
226
|
+
// Custom approve (approveProtocolTransfers) works as a delta on-chain: the program
|
|
227
|
+
// adds the instruction amount to the existing allowance. The API may send a smaller
|
|
228
|
+
// amount if the user already has partial allowance. Classic SPL approve sets an
|
|
229
|
+
// absolute value, so it must match exactly.
|
|
230
|
+
function validateApproveAmount(amount, actionPath, ixLabel, request, trades, realChainId, violationCode, allowDelta) {
|
|
231
|
+
const flag = request.approveAmountFlag;
|
|
232
|
+
// unlimited: must be max u64
|
|
233
|
+
if (flag === types_1.ApproveAmountFlag.Unlimited) {
|
|
234
|
+
if (amount !== constants_1.MAX_U64) {
|
|
235
|
+
return [{
|
|
236
|
+
code: violationCode,
|
|
237
|
+
message: `${ixLabel}: approve amount must be max u64`
|
|
238
|
+
+ " when approveAmountFlag=\"unlimited\"",
|
|
239
|
+
path: `${actionPath}.data.data`,
|
|
240
|
+
expected: constants_1.MAX_U64.toString(),
|
|
241
|
+
actual: amount.toString(),
|
|
242
|
+
}];
|
|
243
|
+
}
|
|
244
|
+
return [];
|
|
245
|
+
}
|
|
246
|
+
// exactApproveAmount (or undefined): check against trade amounts
|
|
247
|
+
const sumResult = sumSolanaTradeAmounts(trades, realChainId);
|
|
248
|
+
if (sumResult.skip)
|
|
249
|
+
return [];
|
|
250
|
+
if (sumResult.violations)
|
|
251
|
+
return sumResult.violations;
|
|
252
|
+
const mismatch = allowDelta
|
|
253
|
+
? (amount > sumResult.sum)
|
|
254
|
+
: (amount !== sumResult.sum);
|
|
255
|
+
if (mismatch) {
|
|
256
|
+
return [{
|
|
257
|
+
code: violationCode,
|
|
258
|
+
message: allowDelta
|
|
259
|
+
? `${ixLabel}: approve amount must be <= sum of trade amounts`
|
|
260
|
+
: `${ixLabel}: approve amount does not match sum of trade amounts`,
|
|
261
|
+
path: `${actionPath}.data.data`,
|
|
262
|
+
expected: sumResult.sum.toString(),
|
|
263
|
+
actual: amount.toString(),
|
|
264
|
+
}];
|
|
265
|
+
}
|
|
266
|
+
return [];
|
|
267
|
+
}
|
|
268
|
+
// Sums srcChainTokenInAmount across all matching trades.
|
|
269
|
+
// For Solana, no native→wrapped resolution is needed (unlike EVM).
|
|
270
|
+
function sumSolanaTradeAmounts(trades, _realChainId) {
|
|
271
|
+
let sum = 0n;
|
|
272
|
+
for (let i = 0; i < trades.length; i++) {
|
|
273
|
+
const amount = trades[i].srcChainTokenInAmount;
|
|
274
|
+
if (amount === types_1.SpecialAmount.Max || amount === types_1.SpecialAmount.Auto) {
|
|
275
|
+
return { skip: true };
|
|
276
|
+
}
|
|
277
|
+
try {
|
|
278
|
+
sum += BigInt(amount);
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return {
|
|
282
|
+
violations: [{
|
|
283
|
+
code: types_1.ViolationCode.TradeAmountInvalid,
|
|
284
|
+
message: "trade srcChainTokenInAmount is not a valid number",
|
|
285
|
+
path: `request.trades[${i}].srcChainTokenInAmount`,
|
|
286
|
+
actual: amount,
|
|
287
|
+
}],
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return { sum };
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=solana-op-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana-op-budget.js","sourceRoot":"","sources":["../../../src/validations/solana-op-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateSolanaWrapInstructions = validateSolanaWrapInstructions;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
const address_1 = require("../helpers/address");
|
|
6
|
+
const solana_instruction_1 = require("../helpers/solana-instruction");
|
|
7
|
+
const programs_1 = require("../whitelists/solana/programs");
|
|
8
|
+
// =============================================
|
|
9
|
+
// Entry point
|
|
10
|
+
// =============================================
|
|
11
|
+
// Validates Wrap (SOL → wSOL) instructions within a decoded Solana transaction.
|
|
12
|
+
// Called for both Transaction (AA=false) and SignTransaction (AA=true) actions.
|
|
13
|
+
function validateSolanaWrapInstructions(action, resolvedInstructions, actionPath, trades, realChainId, quoteMode, srcChainAuthorityAddress) {
|
|
14
|
+
if (!action.actions.includes(types_1.SolanaActionOperation.Wrap))
|
|
15
|
+
return [];
|
|
16
|
+
const violations = [];
|
|
17
|
+
const createAtaIxs = findCreateAtaInstructions(resolvedInstructions);
|
|
18
|
+
const transferIxs = findSystemTransferInstructions(resolvedInstructions);
|
|
19
|
+
const syncNativeIxs = findSyncNativeInstructions(resolvedInstructions);
|
|
20
|
+
// CRITICAL: SystemProgram.Transfer is mandatory
|
|
21
|
+
if (transferIxs.length === 0) {
|
|
22
|
+
violations.push({
|
|
23
|
+
code: types_1.ViolationCode.SolanaWrapNoTransferInstruction,
|
|
24
|
+
message: "Wrap declared but no SystemProgram.Transfer instruction found",
|
|
25
|
+
path: `${actionPath}.data.data`,
|
|
26
|
+
});
|
|
27
|
+
return violations;
|
|
28
|
+
}
|
|
29
|
+
// CRITICAL: SyncNative is mandatory
|
|
30
|
+
if (syncNativeIxs.length === 0) {
|
|
31
|
+
violations.push({
|
|
32
|
+
code: types_1.ViolationCode.SolanaWrapNoSyncNativeInstruction,
|
|
33
|
+
message: "Wrap declared but no SyncNative instruction found",
|
|
34
|
+
path: `${actionPath}.data.data`,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
// Compute expected wSOL ATA (only in execution mode)
|
|
38
|
+
const expectedWsolAta = computeExpectedWsolAta(quoteMode, srcChainAuthorityAddress);
|
|
39
|
+
// Validate CreateAssociatedTokenAccountIdempotent (optional)
|
|
40
|
+
for (const ix of createAtaIxs) {
|
|
41
|
+
violations.push(...validateCreateAtaInstruction(ix, actionPath, realChainId, quoteMode, srcChainAuthorityAddress, expectedWsolAta));
|
|
42
|
+
}
|
|
43
|
+
// Validate SystemProgram.Transfer
|
|
44
|
+
for (const ix of transferIxs) {
|
|
45
|
+
violations.push(...validateTransferInstruction(ix, actionPath, realChainId, trades, expectedWsolAta));
|
|
46
|
+
}
|
|
47
|
+
// Validate SyncNative
|
|
48
|
+
for (const ix of syncNativeIxs) {
|
|
49
|
+
violations.push(...validateSyncNativeInstruction(ix, actionPath, expectedWsolAta));
|
|
50
|
+
}
|
|
51
|
+
return violations;
|
|
52
|
+
}
|
|
53
|
+
function findSystemTransferInstructions(ixs) {
|
|
54
|
+
return ixs.filter(solana_instruction_1.isSystemTransfer);
|
|
55
|
+
}
|
|
56
|
+
function findSyncNativeInstructions(ixs) {
|
|
57
|
+
return ixs.filter(solana_instruction_1.isSyncNative);
|
|
58
|
+
}
|
|
59
|
+
function findCreateAtaInstructions(ixs) {
|
|
60
|
+
return ixs.filter(solana_instruction_1.isCreateAtaIdempotent);
|
|
61
|
+
}
|
|
62
|
+
// =============================================
|
|
63
|
+
// CreateAssociatedTokenAccountIdempotent validation
|
|
64
|
+
// =============================================
|
|
65
|
+
// Accounts layout for createAssociatedTokenAccountIdempotent:
|
|
66
|
+
// [0] = payer, [1] = associatedToken, [2] = owner, [3] = mint,
|
|
67
|
+
// [4] = systemProgram, [5] = tokenProgram
|
|
68
|
+
function validateCreateAtaInstruction(ix, actionPath, realChainId, quoteMode, srcChainAuthorityAddress, expectedWsolAta) {
|
|
69
|
+
const violations = [];
|
|
70
|
+
// accounts[2] = owner
|
|
71
|
+
const owner = ix.accountKeys[2];
|
|
72
|
+
// accounts[3] = mint
|
|
73
|
+
const mint = ix.accountKeys[3];
|
|
74
|
+
// accounts[1] = associatedToken (the ATA being created)
|
|
75
|
+
const associatedToken = ix.accountKeys[1];
|
|
76
|
+
// CRITICAL (execution): owner must equal srcChainAuthorityAddress
|
|
77
|
+
if (!quoteMode && srcChainAuthorityAddress) {
|
|
78
|
+
if (!(0, address_1.addressEquals)(realChainId, owner, srcChainAuthorityAddress)) {
|
|
79
|
+
violations.push({
|
|
80
|
+
code: types_1.ViolationCode.SolanaWrapCreateAtaOwnerMismatch,
|
|
81
|
+
message: "CreateATA owner must equal srcChainAuthorityAddress",
|
|
82
|
+
path: `${actionPath}.data.data`,
|
|
83
|
+
expected: srcChainAuthorityAddress,
|
|
84
|
+
actual: owner,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// CRITICAL: CreateATA mint must be wSOL
|
|
89
|
+
if (!(0, address_1.addressEquals)(realChainId, mint, programs_1.SPL_NATIVE_MINT)) {
|
|
90
|
+
violations.push({
|
|
91
|
+
code: types_1.ViolationCode.SolanaWrapCreateAtaMintMismatch,
|
|
92
|
+
message: `CreateATA mint must be wSOL (${programs_1.SPL_NATIVE_MINT})`,
|
|
93
|
+
path: `${actionPath}.data.data`,
|
|
94
|
+
expected: programs_1.SPL_NATIVE_MINT,
|
|
95
|
+
actual: mint,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// CRITICAL (execution): associatedToken must match derived wSOL ATA
|
|
99
|
+
// Skipped in quote mode: expectedWsolAta is undefined because srcChainAuthorityAddress is a placeholder.
|
|
100
|
+
if (expectedWsolAta && !(0, address_1.addressEquals)(realChainId, associatedToken, expectedWsolAta)) {
|
|
101
|
+
violations.push({
|
|
102
|
+
code: types_1.ViolationCode.SolanaWrapCreateAtaAddressMismatch,
|
|
103
|
+
message: "CreateATA associatedToken must match derived wSOL ATA",
|
|
104
|
+
path: `${actionPath}.data.data`,
|
|
105
|
+
expected: expectedWsolAta,
|
|
106
|
+
actual: associatedToken,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return violations;
|
|
110
|
+
}
|
|
111
|
+
// =============================================
|
|
112
|
+
// SystemProgram.Transfer validation
|
|
113
|
+
// =============================================
|
|
114
|
+
function validateTransferInstruction(ix, actionPath, realChainId, trades, expectedWsolAta) {
|
|
115
|
+
const violations = [];
|
|
116
|
+
// CRITICAL (execution): transfer.to (accounts[1]) must be wSOL ATA.
|
|
117
|
+
// Skipped in quote mode: expectedWsolAta is undefined because srcChainAuthorityAddress is a placeholder.
|
|
118
|
+
const toAddress = ix.accountKeys[1];
|
|
119
|
+
if (expectedWsolAta && !(0, address_1.addressEquals)(realChainId, toAddress, expectedWsolAta)) {
|
|
120
|
+
violations.push({
|
|
121
|
+
code: types_1.ViolationCode.SolanaWrapTransferToMismatch,
|
|
122
|
+
message: "SystemProgram.Transfer destination must be wSOL ATA for wrap operation",
|
|
123
|
+
path: `${actionPath}.data.data`,
|
|
124
|
+
expected: expectedWsolAta,
|
|
125
|
+
actual: toAddress,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// CRITICAL: transfer amount must match sum of native SOL trades
|
|
129
|
+
const lamports = readU64LE(ix.data, 4);
|
|
130
|
+
const expectedAmount = sumNativeSolTradeAmounts(trades, realChainId);
|
|
131
|
+
// Skip amount validation if any trade has special amount (max/auto)
|
|
132
|
+
if (expectedAmount !== undefined && lamports !== expectedAmount) {
|
|
133
|
+
violations.push({
|
|
134
|
+
code: types_1.ViolationCode.SolanaWrapTransferAmountMismatch,
|
|
135
|
+
message: "SystemProgram.Transfer lamports does not match sum of native SOL trades",
|
|
136
|
+
path: `${actionPath}.data.data`,
|
|
137
|
+
expected: expectedAmount.toString(),
|
|
138
|
+
actual: lamports.toString(),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return violations;
|
|
142
|
+
}
|
|
143
|
+
// =============================================
|
|
144
|
+
// SyncNative validation
|
|
145
|
+
// =============================================
|
|
146
|
+
function validateSyncNativeInstruction(ix, actionPath, expectedWsolAta) {
|
|
147
|
+
// CRITICAL (execution): SyncNative account (accounts[0]) must be wSOL ATA.
|
|
148
|
+
// Skipped in quote mode: expectedWsolAta is undefined because srcChainAuthorityAddress is a placeholder.
|
|
149
|
+
const account = ix.accountKeys[0];
|
|
150
|
+
if (expectedWsolAta && account !== expectedWsolAta) {
|
|
151
|
+
return [{
|
|
152
|
+
code: types_1.ViolationCode.SolanaWrapSyncNativeAccountMismatch,
|
|
153
|
+
message: "SyncNative account must be wSOL ATA",
|
|
154
|
+
path: `${actionPath}.data.data`,
|
|
155
|
+
expected: expectedWsolAta,
|
|
156
|
+
actual: account,
|
|
157
|
+
}];
|
|
158
|
+
}
|
|
159
|
+
return [];
|
|
160
|
+
}
|
|
161
|
+
// =============================================
|
|
162
|
+
// Helpers
|
|
163
|
+
// =============================================
|
|
164
|
+
function computeExpectedWsolAta(quoteMode, srcChainAuthorityAddress) {
|
|
165
|
+
if (quoteMode || !srcChainAuthorityAddress)
|
|
166
|
+
return undefined;
|
|
167
|
+
// wSOL uses standard SPL Token program
|
|
168
|
+
return (0, solana_instruction_1.deriveAta)(srcChainAuthorityAddress, programs_1.SPL_NATIVE_MINT, programs_1.SPL_TOKEN_PROGRAM);
|
|
169
|
+
}
|
|
170
|
+
// Sums srcChainTokenInAmount for all trades that use native SOL.
|
|
171
|
+
// Returns undefined if any matching trade has a special amount (max/auto).
|
|
172
|
+
function sumNativeSolTradeAmounts(trades, realChainId) {
|
|
173
|
+
let total = 0n;
|
|
174
|
+
for (const trade of trades) {
|
|
175
|
+
if (!(0, address_1.addressEquals)(realChainId, trade.srcChainTokenIn, programs_1.SPL_NATIVE_MINT))
|
|
176
|
+
continue;
|
|
177
|
+
const raw = trade.srcChainTokenInAmount;
|
|
178
|
+
if (raw === types_1.SpecialAmount.Max || raw === types_1.SpecialAmount.Auto)
|
|
179
|
+
return undefined;
|
|
180
|
+
total += BigInt(raw);
|
|
181
|
+
}
|
|
182
|
+
return total;
|
|
183
|
+
}
|
|
184
|
+
function readU64LE(data, offset) {
|
|
185
|
+
let value = 0n;
|
|
186
|
+
for (let i = 0; i < 8; i++) {
|
|
187
|
+
value |= BigInt(data[offset + i]) << BigInt(i * 8);
|
|
188
|
+
}
|
|
189
|
+
return value;
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=solana-op-wrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana-op-wrap.js","sourceRoot":"","sources":["../../../src/validations/solana-op-wrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateSolanaRequiredActions = validateSolanaRequiredActions;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
const solana_transaction_1 = require("./solana-transaction");
|
|
6
|
+
const solana_sign_1 = require("./solana-sign");
|
|
7
|
+
function validateSolanaRequiredActions(request, actions, basePath, realChainId, quoteMode, trades, srcChainAuthorityAddress, intent, envConfig) {
|
|
8
|
+
return [
|
|
9
|
+
...validateUniqueActionIds(actions, basePath),
|
|
10
|
+
...validateRequiredActionsOrder(actions, basePath, quoteMode),
|
|
11
|
+
...validateAAConstraints(request, actions, basePath),
|
|
12
|
+
...validateNoOperationActions(actions, basePath),
|
|
13
|
+
...validateNoCompensationActions(actions, basePath),
|
|
14
|
+
...(0, solana_transaction_1.validateSolanaTransactionActions)(actions, basePath, realChainId, quoteMode, srcChainAuthorityAddress, request, trades, envConfig),
|
|
15
|
+
...(0, solana_transaction_1.validateSolanaSignTransactionActions)(actions, basePath, realChainId, quoteMode, srcChainAuthorityAddress, request, trades, envConfig),
|
|
16
|
+
...(0, solana_sign_1.validateSolanaSignActions)(actions, basePath, realChainId, quoteMode, intent, envConfig),
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
// HIGH: Each actionId must be unique (no duplicates in the list)
|
|
20
|
+
function validateUniqueActionIds(actions, basePath) {
|
|
21
|
+
const seen = new Map();
|
|
22
|
+
const violations = [];
|
|
23
|
+
for (let i = 0; i < actions.length; i++) {
|
|
24
|
+
const actionId = actions[i].actionId;
|
|
25
|
+
const firstIndex = seen.get(actionId);
|
|
26
|
+
if (firstIndex !== undefined) {
|
|
27
|
+
violations.push({
|
|
28
|
+
code: types_1.ViolationCode.SolanaDuplicateActionId,
|
|
29
|
+
message: `duplicate actionId "${actionId}" at indices ${firstIndex} and ${i}`,
|
|
30
|
+
path: `${basePath}.requiredActions[${i}].actionId`,
|
|
31
|
+
actual: actionId,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
seen.set(actionId, i);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return violations;
|
|
39
|
+
}
|
|
40
|
+
// MEDIUM: `Sign (Intent)` must be the last action.
|
|
41
|
+
// In quote mode, `Sign (Intent)` might be absent.
|
|
42
|
+
function validateRequiredActionsOrder(actions, basePath, quoteMode) {
|
|
43
|
+
const violations = [];
|
|
44
|
+
for (let i = 0; i < actions.length; i++) {
|
|
45
|
+
const action = actions[i];
|
|
46
|
+
const isSignIntent = action.type === types_1.SolanaActionKind.Sign
|
|
47
|
+
&& action.actions.includes(types_1.SolanaActionOperation.Intent);
|
|
48
|
+
if (!isSignIntent)
|
|
49
|
+
continue;
|
|
50
|
+
if (!quoteMode && i !== actions.length - 1) {
|
|
51
|
+
violations.push({
|
|
52
|
+
code: types_1.ViolationCode.SolanaRequiredActionsOrder,
|
|
53
|
+
message: "Sign (Intent) action must be the last required action",
|
|
54
|
+
path: `${basePath}.requiredActions[${i}].type`,
|
|
55
|
+
expected: actions.length - 1,
|
|
56
|
+
actual: i,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return violations;
|
|
61
|
+
}
|
|
62
|
+
// CRITICAL: AA constraints
|
|
63
|
+
function validateAAConstraints(request, actions, basePath) {
|
|
64
|
+
const violations = [];
|
|
65
|
+
for (let i = 0; i < actions.length; i++) {
|
|
66
|
+
const action = actions[i];
|
|
67
|
+
if (request.enableAccountAbstraction) {
|
|
68
|
+
// CRITICAL: AA=true → no Transaction type actions
|
|
69
|
+
if (action.type === types_1.SolanaActionKind.Transaction) {
|
|
70
|
+
violations.push({
|
|
71
|
+
code: types_1.ViolationCode.SolanaForbiddenTransactionWithAA,
|
|
72
|
+
message: "Transaction action is forbidden when enableAccountAbstraction=true",
|
|
73
|
+
path: `${basePath}.requiredActions[${i}].type`,
|
|
74
|
+
actual: action.type,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// CRITICAL: AA=false → no SignTransaction type actions
|
|
80
|
+
if (action.type === types_1.SolanaActionKind.SignTransaction) {
|
|
81
|
+
violations.push({
|
|
82
|
+
code: types_1.ViolationCode.SolanaForbiddenSignTransactionWithoutAA,
|
|
83
|
+
message: "SignTransaction action is forbidden when enableAccountAbstraction=false",
|
|
84
|
+
path: `${basePath}.requiredActions[${i}].type`,
|
|
85
|
+
actual: action.type,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return violations;
|
|
91
|
+
}
|
|
92
|
+
// HIGH: Operation actions must be absent
|
|
93
|
+
function validateNoOperationActions(actions, basePath) {
|
|
94
|
+
const violations = [];
|
|
95
|
+
for (let i = 0; i < actions.length; i++) {
|
|
96
|
+
if (actions[i].actions.includes(types_1.SolanaActionOperation.Operation)) {
|
|
97
|
+
violations.push({
|
|
98
|
+
code: types_1.ViolationCode.SolanaForbiddenOperationAction,
|
|
99
|
+
message: "Operation action is not expected in current API version",
|
|
100
|
+
path: `${basePath}.requiredActions[${i}].actions`,
|
|
101
|
+
actual: actions[i].actions,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return violations;
|
|
106
|
+
}
|
|
107
|
+
// HIGH: Compensation actions must be absent (disabled in current API version)
|
|
108
|
+
function validateNoCompensationActions(actions, basePath) {
|
|
109
|
+
const violations = [];
|
|
110
|
+
for (let i = 0; i < actions.length; i++) {
|
|
111
|
+
if (actions[i].actions.includes(types_1.SolanaActionOperation.Compensation)) {
|
|
112
|
+
violations.push({
|
|
113
|
+
code: types_1.ViolationCode.SolanaForbiddenCompensationAction,
|
|
114
|
+
message: "Compensation action is not expected in current API version",
|
|
115
|
+
path: `${basePath}.requiredActions[${i}].actions`,
|
|
116
|
+
actual: actions[i].actions,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return violations;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=solana-required-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana-required-actions.js","sourceRoot":"","sources":["../../../src/validations/solana-required-actions.ts"],"names":[],"mappings":"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"}
|