@synthra-swap/smart-order-router 3.16.0 → 3.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/build/main/providers/token-provider.js +2 -2
  2. package/build/main/providers/v3/pool-provider.js +10 -2
  3. package/build/main/routers/index.d.ts +1 -0
  4. package/build/main/routers/index.js +2 -1
  5. package/build/main/routers/synthra-router/config.d.ts +5 -0
  6. package/build/main/routers/synthra-router/config.js +30 -0
  7. package/build/main/routers/synthra-router/index.d.ts +3 -0
  8. package/build/main/routers/synthra-router/index.js +20 -0
  9. package/build/main/routers/synthra-router/synthra-router.d.ts +31 -0
  10. package/build/main/routers/synthra-router/synthra-router.js +437 -0
  11. package/build/main/routers/synthra-router/types.d.ts +158 -0
  12. package/build/main/routers/synthra-router/types.js +3 -0
  13. package/build/main/tsconfig.tsbuildinfo +1 -1
  14. package/build/main/util/gas-factory-helpers.js +8 -2
  15. package/build/module/providers/token-provider.js +2 -2
  16. package/build/module/providers/v3/pool-provider.js +10 -2
  17. package/build/module/routers/index.d.ts +1 -0
  18. package/build/module/routers/index.js +2 -1
  19. package/build/module/routers/synthra-router/config.d.ts +5 -0
  20. package/build/module/routers/synthra-router/config.js +27 -0
  21. package/build/module/routers/synthra-router/index.d.ts +3 -0
  22. package/build/module/routers/synthra-router/index.js +4 -0
  23. package/build/module/routers/synthra-router/synthra-router.d.ts +31 -0
  24. package/build/module/routers/synthra-router/synthra-router.js +447 -0
  25. package/build/module/routers/synthra-router/types.d.ts +158 -0
  26. package/build/module/routers/synthra-router/types.js +2 -0
  27. package/build/module/tsconfig.module.tsbuildinfo +1 -1
  28. package/build/module/util/gas-factory-helpers.js +9 -3
  29. package/package.json +3 -2
@@ -1,3 +1,4 @@
1
+ import { ChainId } from '@synthra-swap/sdk/core';
1
2
  import { computePoolAddress, Pool } from '@synthra-swap/sdk/v3';
2
3
  import retry from 'async-retry';
3
4
  import _ from 'lodash';
@@ -5,6 +6,13 @@ import { ISynthraV3PoolState__factory } from '../../types/v3/factories/ISynthraV
5
6
  import { V3_CORE_FACTORY_ADDRESSES } from '../../util/addresses';
6
7
  import { log } from '../../util/log';
7
8
  import { poolToString } from '../../util/routes';
9
+ const UNISWAP_V3_POOL_INIT_CODE_HASH = '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54';
10
+ function getPoolInitCodeHashManualOverride(chainId) {
11
+ if (chainId === ChainId.SEPOLIA) {
12
+ return UNISWAP_V3_POOL_INIT_CODE_HASH;
13
+ }
14
+ return undefined;
15
+ }
8
16
  export class V3PoolProvider {
9
17
  /**
10
18
  * Creates an instance of V3PoolProvider.
@@ -96,7 +104,7 @@ export class V3PoolProvider {
96
104
  tokenA: token0,
97
105
  tokenB: token1,
98
106
  fee: feeAmount,
99
- initCodeHashManualOverride: '0x499aba1e2f07d97749c4eabd822eca2efa521b1d6e34a67285e4a3cb773905dd',
107
+ initCodeHashManualOverride: getPoolInitCodeHashManualOverride(this.chainId),
100
108
  });
101
109
  this.POOL_ADDRESS_CACHE[cacheKey] = poolAddress;
102
110
  return { poolAddress, token0, token1 };
@@ -114,4 +122,4 @@ export class V3PoolProvider {
114
122
  return results;
115
123
  }
116
124
  }
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvdjMvcG9vbC1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsa0JBQWtCLEVBQWEsSUFBSSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0UsT0FBTyxLQUFrQyxNQUFNLGFBQWEsQ0FBQztBQUM3RCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFdkIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDckcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQThEakQsTUFBTSxPQUFPLGNBQWM7SUFLekI7Ozs7O09BS0c7SUFDSCxZQUNZLE9BQWdCLEVBQ2hCLGtCQUFzQyxFQUN0QyxlQUFtQztRQUMzQyxPQUFPLEVBQUUsQ0FBQztRQUNWLFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEdBQUc7S0FDaEI7UUFOUyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsaUJBQVksR0FBWixZQUFZLENBSXJCO1FBakJILHlFQUF5RTtRQUN6RSxrREFBa0Q7UUFDMUMsdUJBQWtCLEdBQThCLEVBQUUsQ0FBQztJQWdCeEQsQ0FBQztJQUVHLEtBQUssQ0FBQyxRQUFRLENBQ25CLFVBQXVDLEVBQ3ZDLGNBQStCO1FBRS9CLE1BQU0sY0FBYyxHQUFnQixJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3RELE1BQU0sZ0JBQWdCLEdBQXFDLEVBQUUsQ0FBQztRQUM5RCxNQUFNLG1CQUFtQixHQUFhLEVBQUUsQ0FBQztRQUV6QyxLQUFLLE1BQU0sU0FB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
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvdjMvcG9vbC1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsT0FBTyxFQUFTLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGtCQUFrQixFQUFhLElBQUksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sS0FBa0MsTUFBTSxhQUFhLENBQUM7QUFDN0QsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRXZCLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3JHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJakQsTUFBTSw4QkFBOEIsR0FDbEMsb0VBQW9FLENBQUM7QUFFdkUsU0FBUyxpQ0FBaUMsQ0FBQyxPQUFnQjtJQUN6RCxJQUFJLE9BQU8sS0FBSyxPQUFPLENBQUMsT0FBTyxFQUFFO1FBQy9CLE9BQU8sOEJBQThCLENBQUM7S0FDdkM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBNERELE1BQU0sT0FBTyxjQUFjO0lBS3pCOzs7OztPQUtHO0lBQ0gsWUFDWSxPQUFnQixFQUNoQixrQkFBc0MsRUFDdEMsZUFBbUM7UUFDM0MsT0FBTyxFQUFFLENBQUM7UUFDVixVQUFVLEVBQUUsRUFBRTtRQUNkLFVBQVUsRUFBRSxHQUFHO0tBQ2hCO1FBTlMsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGlCQUFZLEdBQVosWUFBWSxDQUlyQjtRQWpCSCx5RUFBeUU7UUFDekUsa0RBQWtEO1FBQzFD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
@@ -1,3 +1,4 @@
1
1
  export * from '../util/metric';
2
2
  export * from './alpha-router';
3
3
  export * from './router';
4
+ export * from './synthra-router';
@@ -1,4 +1,5 @@
1
1
  export * from '../util/metric';
2
2
  export * from './alpha-router';
3
3
  export * from './router';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxVQUFVLENBQUMifQ==
4
+ export * from './synthra-router';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxrQkFBa0IsQ0FBQyJ9
@@ -0,0 +1,5 @@
1
+ import { Token } from '@synthra-swap/sdk/core';
2
+ import { CCTPRouterConfig } from './types';
3
+ export declare const ARC_TESTNET_USDC: Token;
4
+ export declare const SEPOLIA_USDC: Token;
5
+ export declare const DEFAULT_CCTP_ROUTER_CONFIG: CCTPRouterConfig;
@@ -0,0 +1,27 @@
1
+ import { ChainId, Token } from '@synthra-swap/sdk/core';
2
+ export const ARC_TESTNET_USDC = new Token(ChainId.ARC, '0x3600000000000000000000000000000000000000', 6, 'USDC', 'USDC');
3
+ export const SEPOLIA_USDC = new Token(ChainId.SEPOLIA, '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238', 6, 'USDC', 'USDC');
4
+ export const DEFAULT_CCTP_ROUTER_CONFIG = {
5
+ chains: {
6
+ [ChainId.ARC]: {
7
+ chainId: ChainId.ARC,
8
+ cctpDomain: 26,
9
+ cctpRouter: '0x195ee789dE3d3edde5Bcd830d9eF2C9e4f39715F',
10
+ bridgeToken: ARC_TESTNET_USDC,
11
+ universalRouter: '0xbf4479C07Dc6fdc6dAa764A0ccA06969e894275F',
12
+ },
13
+ [ChainId.SEPOLIA]: {
14
+ chainId: ChainId.SEPOLIA,
15
+ cctpDomain: 0,
16
+ cctpRouter: '0xD97D43631741e20811ebd8A3aD6265759909f0Ff',
17
+ bridgeToken: SEPOLIA_USDC,
18
+ universalRouter: '0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD',
19
+ },
20
+ },
21
+ defaultDestinationChainCandidates: [ChainId.ARC, ChainId.SEPOLIA],
22
+ defaultMaxFee: '10000',
23
+ defaultMinFinalityThreshold: 1000,
24
+ defaultQuoteTtlSeconds: 300,
25
+ feeAmount: '0',
26
+ };
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3JvdXRlcnMvc3ludGhyYS1yb3V0ZXIvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJeEQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLENBQ3ZDLE9BQU8sQ0FBQyxHQUFHLEVBQ1gsNENBQTRDLEVBQzVDLENBQUMsRUFDRCxNQUFNLEVBQ04sTUFBTSxDQUNQLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxLQUFLLENBQ25DLE9BQU8sQ0FBQyxPQUFPLEVBQ2YsNENBQTRDLEVBQzVDLENBQUMsRUFDRCxNQUFNLEVBQ04sTUFBTSxDQUNQLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBcUI7SUFDMUQsTUFBTSxFQUFFO1FBQ04sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDYixPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDcEIsVUFBVSxFQUFFLEVBQUU7WUFDZCxVQUFVLEVBQUUsNENBQTRDO1lBQ3hELFdBQVcsRUFBRSxnQkFBZ0I7WUFDN0IsZUFBZSxFQUFFLDRDQUE0QztTQUM5RDtRQUNELENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixVQUFVLEVBQUUsQ0FBQztZQUNiLFVBQVUsRUFBRSw0Q0FBNEM7WUFDeEQsV0FBVyxFQUFFLFlBQVk7WUFDekIsZUFBZSxFQUFFLDRDQUE0QztTQUM5RDtLQUNGO0lBQ0QsaUNBQWlDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDakUsYUFBYSxFQUFFLE9BQU87SUFDdEIsMkJBQTJCLEVBQUUsSUFBSTtJQUNqQyxzQkFBc0IsRUFBRSxHQUFHO0lBQzNCLFNBQVMsRUFBRSxHQUFHO0NBQ2YsQ0FBQyJ9
@@ -0,0 +1,3 @@
1
+ export * from './config';
2
+ export * from './synthra-router';
3
+ export * from './types';
@@ -0,0 +1,4 @@
1
+ export * from './config';
2
+ export * from './synthra-router';
3
+ export * from './types';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcm91dGVycy9zeW50aHJhLXJvdXRlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsU0FBUyxDQUFDIn0=
@@ -0,0 +1,31 @@
1
+ import { BestVenueResult, SynthraRoute, SynthraRouteRequest, SynthraRouterParams } from './types';
2
+ export declare class SynthraRouter {
3
+ private readonly params;
4
+ private readonly alphaRouters;
5
+ private readonly cctp;
6
+ constructor(params: SynthraRouterParams);
7
+ route(request: SynthraRouteRequest): Promise<SynthraRoute | null>;
8
+ routeBestVenue(request: SynthraRouteRequest, sourceChainId?: number): Promise<BestVenueResult>;
9
+ private routeBestVenueCandidate;
10
+ private routeSameChain;
11
+ private routeCCTP;
12
+ private routeLocalOrNoOp;
13
+ private buildCCTPExecutionPlan;
14
+ private resolveDestinationChainId;
15
+ private resolveTokenOut;
16
+ private isTokenByChainId;
17
+ private getAlphaRouter;
18
+ private getCCTPChainConfig;
19
+ private defaultUniversalRouterSwapOptions;
20
+ private decodeUniversalRouterCall;
21
+ private rewriteSourceBridgeSwapForNativeSweep;
22
+ private sourceBridgeMinAmount;
23
+ private destinationMinTokenOut;
24
+ private shouldSweepSourceBridgeOutput;
25
+ private hexToCommandBytes;
26
+ private commandBytesToHex;
27
+ private compareQuotes;
28
+ private sumGas;
29
+ private legGas;
30
+ private addressToBytes32;
31
+ }
@@ -0,0 +1,447 @@
1
+ import { defaultAbiCoder, Interface } from '@ethersproject/abi';
2
+ import { getAddress } from '@ethersproject/address';
3
+ import { BigNumber } from '@ethersproject/bignumber';
4
+ import { hexZeroPad } from '@ethersproject/bytes';
5
+ import { ChainId, Percent, TradeType, } from '@synthra-swap/sdk/core';
6
+ import { UNIVERSAL_ROUTER_ADDRESS } from '@synthra-swap/sdk/universal-router';
7
+ import JSBI from 'jsbi';
8
+ import { CurrencyAmount } from '../../util/amounts';
9
+ import { AlphaRouter } from '../alpha-router';
10
+ import { SwapType } from '../router';
11
+ import { DEFAULT_CCTP_ROUTER_CONFIG } from './config';
12
+ const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
13
+ const UNIVERSAL_ROUTER_MSG_SENDER = '0x0000000000000000000000000000000000000001';
14
+ const UNIVERSAL_ROUTER_ADDRESS_THIS = '0x0000000000000000000000000000000000000002';
15
+ const UNIVERSAL_ROUTER_COMMAND_TYPE_MASK = 0x1f;
16
+ const UNIVERSAL_ROUTER_COMMAND_V3_SWAP_EXACT_IN = 0x00;
17
+ const UNIVERSAL_ROUTER_COMMAND_SWEEP = 0x04;
18
+ const DEFAULT_SLIPPAGE = new Percent(50, 10000);
19
+ const UNIVERSAL_ROUTER_INTERFACE = new Interface([
20
+ 'function execute(bytes commands, bytes[] inputs, uint256 deadline)',
21
+ ]);
22
+ export class SynthraRouter {
23
+ constructor(params) {
24
+ var _a, _b;
25
+ this.params = params;
26
+ this.alphaRouters = new Map();
27
+ this.cctp = {
28
+ ...DEFAULT_CCTP_ROUTER_CONFIG,
29
+ ...params.cctp,
30
+ chains: {
31
+ ...DEFAULT_CCTP_ROUTER_CONFIG.chains,
32
+ ...((_b = (_a = params.cctp) === null || _a === void 0 ? void 0 : _a.chains) !== null && _b !== void 0 ? _b : {}),
33
+ },
34
+ };
35
+ }
36
+ async route(request) {
37
+ var _a, _b;
38
+ const sourceChainId = (_a = request.sourceChainId) !== null && _a !== void 0 ? _a : request.amount.currency.wrapped.chainId;
39
+ const destinationChainId = this.resolveDestinationChainId(request);
40
+ const mode = (_b = request.mode) !== null && _b !== void 0 ? _b : 'auto';
41
+ if (mode !== 'cctp' && destinationChainId === sourceChainId) {
42
+ return this.routeSameChain(request, sourceChainId);
43
+ }
44
+ if (mode === 'same-chain') {
45
+ return null;
46
+ }
47
+ if (destinationChainId !== undefined) {
48
+ return this.routeCCTP(request, sourceChainId, destinationChainId);
49
+ }
50
+ return (await this.routeBestVenue(request, sourceChainId)).selected;
51
+ }
52
+ async routeBestVenue(request, sourceChainId) {
53
+ var _a, _b, _c, _d, _e;
54
+ if (sourceChainId === void 0) { sourceChainId = (_a = request.sourceChainId) !== null && _a !== void 0 ? _a : request.amount.currency.wrapped.chainId; }
55
+ const destinationChainCandidates = (_c = (_b = request.destinationChainCandidates) !== null && _b !== void 0 ? _b : this.cctp.defaultDestinationChainCandidates) !== null && _c !== void 0 ? _c : [];
56
+ const candidates = await Promise.all(destinationChainCandidates.map(async (destinationChainId) => this.routeBestVenueCandidate(request, sourceChainId, destinationChainId)));
57
+ const routable = candidates.filter((candidate) => candidate.route !== null);
58
+ routable.sort((a, b) => this.compareQuotes(b.route, a.route));
59
+ return {
60
+ selected: (_e = (_d = routable[0]) === null || _d === void 0 ? void 0 : _d.route) !== null && _e !== void 0 ? _e : null,
61
+ candidates,
62
+ };
63
+ }
64
+ async routeBestVenueCandidate(request, sourceChainId, destinationChainId) {
65
+ const tokenOut = this.resolveTokenOut(request.tokenOut, destinationChainId);
66
+ if (!tokenOut) {
67
+ return {
68
+ destinationChainId,
69
+ route: null,
70
+ rejectionReason: 'token-out-not-configured-for-chain',
71
+ };
72
+ }
73
+ try {
74
+ return {
75
+ destinationChainId,
76
+ tokenOut,
77
+ route: await this.routeCCTP({ ...request, tokenOut }, sourceChainId, destinationChainId),
78
+ };
79
+ }
80
+ catch (error) {
81
+ return {
82
+ destinationChainId,
83
+ tokenOut,
84
+ route: null,
85
+ rejectionReason: error instanceof Error ? error.message : 'unknown-error',
86
+ };
87
+ }
88
+ }
89
+ async routeSameChain(request, chainId) {
90
+ var _a;
91
+ const tokenOut = this.resolveTokenOut(request.tokenOut, chainId);
92
+ if (!tokenOut)
93
+ return null;
94
+ const route = await this.getAlphaRouter(chainId).route(request.amount, tokenOut, request.tradeType, request.swapOptions, (_a = request.routingConfigByChainId) === null || _a === void 0 ? void 0 : _a[chainId]);
95
+ if (!route)
96
+ return null;
97
+ return {
98
+ kind: 'same-chain',
99
+ sourceChainId: chainId,
100
+ destinationChainId: chainId,
101
+ tokenIn: request.amount.currency,
102
+ tokenOut,
103
+ amountIn: request.amount,
104
+ amountOut: route.quote,
105
+ route,
106
+ methodParameters: route.methodParameters,
107
+ };
108
+ }
109
+ async routeCCTP(request, sourceChainId, destinationChainId) {
110
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
111
+ if (request.tradeType !== TradeType.EXACT_INPUT) {
112
+ throw new Error('CCTP routing currently supports EXACT_INPUT only');
113
+ }
114
+ if (!request.recipient) {
115
+ throw new Error('recipient is required for CCTP routing');
116
+ }
117
+ const sourceConfig = this.getCCTPChainConfig(sourceChainId);
118
+ const destinationConfig = this.getCCTPChainConfig(destinationChainId);
119
+ const tokenOut = this.resolveTokenOut(request.tokenOut, destinationChainId);
120
+ if (!tokenOut)
121
+ return null;
122
+ const sourceLeg = await this.routeLocalOrNoOp(sourceChainId, request.amount, sourceConfig.bridgeToken, (_a = request.sourceSwapOptions) !== null && _a !== void 0 ? _a : this.defaultUniversalRouterSwapOptions(sourceConfig.cctpRouter, request.slippageTolerance, request.deadline), (_b = request.routingConfigByChainId) === null || _b === void 0 ? void 0 : _b[sourceChainId]);
123
+ if (!sourceLeg)
124
+ return null;
125
+ const feeAmount = BigNumber.from((_d = (_c = request.feeAmount) !== null && _c !== void 0 ? _c : this.cctp.feeAmount) !== null && _d !== void 0 ? _d : 0);
126
+ const cctpMaxFee = BigNumber.from((_f = (_e = request.maxFee) !== null && _e !== void 0 ? _e : this.cctp.defaultMaxFee) !== null && _f !== void 0 ? _f : 0);
127
+ const bridgeAmountRaw = BigNumber.from(sourceLeg.amountOut.quotient.toString());
128
+ const totalFeeReserve = feeAmount.add(cctpMaxFee);
129
+ if (totalFeeReserve.gte(bridgeAmountRaw)) {
130
+ throw new Error('CCTP fee reserve is greater than or equal to bridge amount');
131
+ }
132
+ const destinationInputAmount = CurrencyAmount.fromRawAmount(destinationConfig.bridgeToken, bridgeAmountRaw.sub(totalFeeReserve).toString());
133
+ const destinationLeg = await this.routeLocalOrNoOp(destinationChainId, destinationInputAmount, tokenOut, (_g = request.destinationSwapOptions) !== null && _g !== void 0 ? _g : this.defaultUniversalRouterSwapOptions(request.recipient, request.slippageTolerance, request.deadline, true), (_h = request.routingConfigByChainId) === null || _h === void 0 ? void 0 : _h[destinationChainId]);
134
+ if (!destinationLeg)
135
+ return null;
136
+ const bridgeLeg = {
137
+ kind: 'cctp',
138
+ sourceChainId,
139
+ destinationChainId,
140
+ sourceDomain: sourceConfig.cctpDomain,
141
+ destinationDomain: destinationConfig.cctpDomain,
142
+ sourceBridgeToken: sourceConfig.bridgeToken,
143
+ destinationBridgeToken: destinationConfig.bridgeToken,
144
+ bridgeAmount: sourceLeg.amountOut,
145
+ destinationInputAmount,
146
+ maxFee: cctpMaxFee.toString(),
147
+ minFinalityThreshold: (_k = (_j = request.minFinalityThreshold) !== null && _j !== void 0 ? _j : this.cctp.defaultMinFinalityThreshold) !== null && _k !== void 0 ? _k : 1000,
148
+ feeRecipient: (_l = request.feeRecipient) !== null && _l !== void 0 ? _l : this.cctp.feeRecipient,
149
+ feeAmount: feeAmount.toString(),
150
+ };
151
+ return {
152
+ kind: 'cctp-cross-chain',
153
+ sourceChainId,
154
+ destinationChainId,
155
+ tokenIn: request.amount.currency,
156
+ tokenOut,
157
+ amountIn: request.amount,
158
+ amountOut: destinationLeg.amountOut,
159
+ quoteGasAdjusted: destinationLeg.amountOut,
160
+ estimatedGasUsed: this.sumGas(sourceLeg, destinationLeg),
161
+ sourceLeg,
162
+ bridgeLeg,
163
+ destinationLeg,
164
+ execution: this.buildCCTPExecutionPlan({
165
+ sourceConfig,
166
+ destinationConfig,
167
+ sourceLeg,
168
+ destinationLeg,
169
+ bridgeLeg,
170
+ request,
171
+ tokenOut,
172
+ }),
173
+ };
174
+ }
175
+ async routeLocalOrNoOp(chainId, amount, tokenOut, swapOptions, routingConfig) {
176
+ const tokenIn = amount.currency.wrapped;
177
+ if (tokenIn.equals(tokenOut)) {
178
+ const amountOut = CurrencyAmount.fromRawAmount(tokenOut, amount.quotient.toString());
179
+ return {
180
+ kind: 'no-op',
181
+ chainId,
182
+ tokenIn,
183
+ tokenOut,
184
+ amountIn: amount,
185
+ amountOut,
186
+ };
187
+ }
188
+ const route = await this.getAlphaRouter(chainId).route(amount, tokenOut, TradeType.EXACT_INPUT, swapOptions, routingConfig);
189
+ if (!route)
190
+ return null;
191
+ return {
192
+ kind: 'local-swap',
193
+ chainId,
194
+ route,
195
+ amountIn: amount,
196
+ amountOut: route.quote,
197
+ methodParameters: route.methodParameters,
198
+ };
199
+ }
200
+ buildCCTPExecutionPlan({ sourceConfig, destinationConfig, sourceLeg, destinationLeg, bridgeLeg, request, tokenOut, }) {
201
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
202
+ if (!request.recipient) {
203
+ throw new Error('recipient is required for CCTP execution');
204
+ }
205
+ const sourceUniversalRouter = (_a = sourceConfig.universalRouter) !== null && _a !== void 0 ? _a : UNIVERSAL_ROUTER_ADDRESS(sourceConfig.chainId);
206
+ const destinationUniversalRouter = (_b = destinationConfig.universalRouter) !== null && _b !== void 0 ? _b : UNIVERSAL_ROUTER_ADDRESS(destinationConfig.chainId);
207
+ const feeRecipient = (_d = (_c = request.feeRecipient) !== null && _c !== void 0 ? _c : this.cctp.feeRecipient) !== null && _d !== void 0 ? _d : ZERO_ADDRESS;
208
+ const quoteDeadline = String((_e = request.quoteDeadline) !== null && _e !== void 0 ? _e : Math.floor(Date.now() / 1000) +
209
+ ((_f = this.cctp.defaultQuoteTtlSeconds) !== null && _f !== void 0 ? _f : 300));
210
+ const sourceSwap = sourceLeg.kind === 'local-swap' ? sourceLeg.methodParameters : undefined;
211
+ const destinationSwap = destinationLeg.kind === 'local-swap'
212
+ ? destinationLeg.methodParameters
213
+ : undefined;
214
+ const decodedSourceSwap = this.decodeUniversalRouterCall(sourceSwap);
215
+ const decodedDestinationSwap = this.decodeUniversalRouterCall(destinationSwap);
216
+ const sourceBridgeCall = this.rewriteSourceBridgeSwapForNativeSweep(decodedSourceSwap, sourceConfig, bridgeLeg);
217
+ const destinationMinTokenOut = this.destinationMinTokenOut(decodedDestinationSwap, sourceBridgeCall.minBridgeAmount, destinationLeg, bridgeLeg, tokenOut, destinationConfig);
218
+ const sourceQuote = {
219
+ tokenIn: request.amount.currency.wrapped.address,
220
+ amountIn: request.amount.quotient.toString(),
221
+ sourceUsdc: sourceConfig.bridgeToken.address,
222
+ minBridgeAmount: sourceBridgeCall.minBridgeAmount,
223
+ destinationDomain: destinationConfig.cctpDomain,
224
+ mintRecipient: this.addressToBytes32(destinationConfig.cctpRouter),
225
+ destinationCaller: this.addressToBytes32(destinationConfig.cctpRouter),
226
+ maxFee: bridgeLeg.maxFee,
227
+ minFinalityThreshold: bridgeLeg.minFinalityThreshold,
228
+ recipient: request.recipient,
229
+ destinationBridgeToken: destinationConfig.bridgeToken.address,
230
+ tokenOut: tokenOut.address,
231
+ minTokenOut: destinationMinTokenOut,
232
+ feeRecipient,
233
+ feeAmount: bridgeLeg.feeAmount,
234
+ universalRouter: sourceUniversalRouter,
235
+ quoteDeadline,
236
+ };
237
+ return {
238
+ sourceRouter: sourceConfig.cctpRouter,
239
+ destinationRouter: destinationConfig.cctpRouter,
240
+ sourceUniversalRouter,
241
+ destinationUniversalRouter,
242
+ sourceSwap,
243
+ destinationSwap,
244
+ sourceRouterCommands: (_g = sourceBridgeCall.call) === null || _g === void 0 ? void 0 : _g.commands,
245
+ sourceRouterInputs: (_h = sourceBridgeCall.call) === null || _h === void 0 ? void 0 : _h.inputs,
246
+ sourceRouterDeadline: (_j = sourceBridgeCall.call) === null || _j === void 0 ? void 0 : _j.deadline,
247
+ destinationRouterCommands: decodedDestinationSwap === null || decodedDestinationSwap === void 0 ? void 0 : decodedDestinationSwap.commands,
248
+ destinationRouterInputs: decodedDestinationSwap === null || decodedDestinationSwap === void 0 ? void 0 : decodedDestinationSwap.inputs,
249
+ destinationRouterDeadline: decodedDestinationSwap === null || decodedDestinationSwap === void 0 ? void 0 : decodedDestinationSwap.deadline,
250
+ sourceQuote,
251
+ };
252
+ }
253
+ resolveDestinationChainId(request) {
254
+ if (request.destinationChainId !== undefined)
255
+ return request.destinationChainId;
256
+ if (this.isTokenByChainId(request.tokenOut))
257
+ return undefined;
258
+ return request.tokenOut.wrapped.chainId;
259
+ }
260
+ resolveTokenOut(tokenOut, chainId) {
261
+ if (this.isTokenByChainId(tokenOut))
262
+ return tokenOut[chainId];
263
+ const wrapped = tokenOut.wrapped;
264
+ return wrapped.chainId === chainId ? wrapped : undefined;
265
+ }
266
+ isTokenByChainId(tokenOut) {
267
+ return tokenOut.wrapped === undefined;
268
+ }
269
+ getAlphaRouter(chainId) {
270
+ var _a, _b, _c, _d, _e;
271
+ const cached = this.alphaRouters.get(chainId);
272
+ if (cached)
273
+ return cached;
274
+ const provider = this.params.providersByChainId[chainId];
275
+ if (!provider) {
276
+ throw new Error(`No provider configured for chain ${chainId}`);
277
+ }
278
+ const alphaRouterParams = (_b = (_a = this.params.alphaRouterParamsByChainId) === null || _a === void 0 ? void 0 : _a[chainId]) !== null && _b !== void 0 ? _b : {};
279
+ const router = (_e = (_d = (_c = this.params).alphaRouterFactory) === null || _d === void 0 ? void 0 : _d.call(_c, {
280
+ ...alphaRouterParams,
281
+ chainId,
282
+ provider,
283
+ })) !== null && _e !== void 0 ? _e : new AlphaRouter({
284
+ ...alphaRouterParams,
285
+ chainId,
286
+ provider,
287
+ });
288
+ this.alphaRouters.set(chainId, router);
289
+ return router;
290
+ }
291
+ getCCTPChainConfig(chainId) {
292
+ const config = this.cctp.chains[chainId];
293
+ if (!config) {
294
+ throw new Error(`No CCTP router config for chain ${chainId}`);
295
+ }
296
+ return config;
297
+ }
298
+ defaultUniversalRouterSwapOptions(recipient, slippageTolerance = DEFAULT_SLIPPAGE, deadline, useRouterBalance = false) {
299
+ return {
300
+ type: SwapType.UNIVERSAL_ROUTER,
301
+ recipient,
302
+ slippageTolerance,
303
+ deadlineOrPreviousBlockhash: deadline !== null && deadline !== void 0 ? deadline : Math.floor(Date.now() / 1000) + 1200,
304
+ useRouterBalance,
305
+ };
306
+ }
307
+ decodeUniversalRouterCall(methodParameters) {
308
+ if (!methodParameters)
309
+ return undefined;
310
+ const decoded = UNIVERSAL_ROUTER_INTERFACE.decodeFunctionData('execute', methodParameters.calldata);
311
+ return {
312
+ commands: decoded.commands,
313
+ inputs: decoded.inputs,
314
+ deadline: decoded.deadline.toString(),
315
+ };
316
+ }
317
+ rewriteSourceBridgeSwapForNativeSweep(call, sourceConfig, bridgeLeg) {
318
+ var _a;
319
+ const quotedBridgeAmount = bridgeLeg.bridgeAmount.quotient.toString();
320
+ if (!call || !this.shouldSweepSourceBridgeOutput(sourceConfig)) {
321
+ return {
322
+ call,
323
+ minBridgeAmount: (_a = this.sourceBridgeMinAmount(call)) !== null && _a !== void 0 ? _a : quotedBridgeAmount,
324
+ };
325
+ }
326
+ const commandBytes = this.hexToCommandBytes(call.commands);
327
+ const inputs = [...call.inputs];
328
+ let rewroteV3ExactIn = false;
329
+ let minBridgeAmount = quotedBridgeAmount;
330
+ for (let i = 0; i < commandBytes.length; i++) {
331
+ const commandByte = commandBytes[i];
332
+ if (commandByte === undefined) {
333
+ throw new Error('Universal Router command byte is missing');
334
+ }
335
+ const command = commandByte & UNIVERSAL_ROUTER_COMMAND_TYPE_MASK;
336
+ if (command !== UNIVERSAL_ROUTER_COMMAND_V3_SWAP_EXACT_IN)
337
+ continue;
338
+ const input = inputs[i];
339
+ if (input === undefined) {
340
+ throw new Error('Universal Router input is missing');
341
+ }
342
+ const decoded = defaultAbiCoder.decode(['address', 'uint256', 'uint256', 'bytes', 'bool'], input);
343
+ inputs[i] = defaultAbiCoder.encode(['address', 'uint256', 'uint256', 'bytes', 'bool'], [
344
+ UNIVERSAL_ROUTER_ADDRESS_THIS,
345
+ decoded[1],
346
+ decoded[2],
347
+ decoded[3],
348
+ decoded[4],
349
+ ]);
350
+ minBridgeAmount = decoded[2].toString();
351
+ rewroteV3ExactIn = true;
352
+ }
353
+ if (!rewroteV3ExactIn) {
354
+ return {
355
+ call,
356
+ minBridgeAmount,
357
+ };
358
+ }
359
+ commandBytes.push(UNIVERSAL_ROUTER_COMMAND_SWEEP);
360
+ inputs.push(defaultAbiCoder.encode(['address', 'address', 'uint256'], [
361
+ sourceConfig.bridgeToken.address,
362
+ UNIVERSAL_ROUTER_MSG_SENDER,
363
+ minBridgeAmount,
364
+ ]));
365
+ return {
366
+ call: {
367
+ ...call,
368
+ commands: this.commandBytesToHex(commandBytes),
369
+ inputs,
370
+ },
371
+ minBridgeAmount,
372
+ };
373
+ }
374
+ sourceBridgeMinAmount(call) {
375
+ if (!call)
376
+ return undefined;
377
+ const commandBytes = this.hexToCommandBytes(call.commands);
378
+ for (let i = commandBytes.length - 1; i >= 0; i--) {
379
+ const commandByte = commandBytes[i];
380
+ if (commandByte === undefined)
381
+ continue;
382
+ const command = commandByte & UNIVERSAL_ROUTER_COMMAND_TYPE_MASK;
383
+ if (command !== UNIVERSAL_ROUTER_COMMAND_V3_SWAP_EXACT_IN)
384
+ continue;
385
+ const input = call.inputs[i];
386
+ if (input === undefined)
387
+ continue;
388
+ const decoded = defaultAbiCoder.decode(['address', 'uint256', 'uint256', 'bytes', 'bool'], input);
389
+ return decoded[2].toString();
390
+ }
391
+ return undefined;
392
+ }
393
+ destinationMinTokenOut(destinationCall, sourceMinBridgeAmount, destinationLeg, bridgeLeg, tokenOut, destinationConfig) {
394
+ var _a;
395
+ if (destinationLeg.kind === 'no-op' &&
396
+ tokenOut.equals(destinationConfig.bridgeToken)) {
397
+ const minBridgeAfterFee = BigNumber.from(sourceMinBridgeAmount).sub(bridgeLeg.feeAmount);
398
+ if (minBridgeAfterFee.lt(0)) {
399
+ throw new Error('CCTP fee amount is greater than source bridge minimum');
400
+ }
401
+ return minBridgeAfterFee.toString();
402
+ }
403
+ return ((_a = this.sourceBridgeMinAmount(destinationCall)) !== null && _a !== void 0 ? _a : destinationLeg.amountOut.quotient.toString());
404
+ }
405
+ shouldSweepSourceBridgeOutput(sourceConfig) {
406
+ return (sourceConfig.chainId === ChainId.ARC &&
407
+ sourceConfig.bridgeToken.address.toLowerCase() ===
408
+ '0x3600000000000000000000000000000000000000');
409
+ }
410
+ hexToCommandBytes(commands) {
411
+ const hex = commands.startsWith('0x') ? commands.slice(2) : commands;
412
+ if (hex.length % 2 !== 0) {
413
+ throw new Error('Universal Router commands must be valid bytes');
414
+ }
415
+ const bytes = [];
416
+ for (let i = 0; i < hex.length; i += 2) {
417
+ bytes.push(parseInt(hex.slice(i, i + 2), 16));
418
+ }
419
+ return bytes;
420
+ }
421
+ commandBytesToHex(bytes) {
422
+ return `0x${bytes
423
+ .map((byte) => byte.toString(16).padStart(2, '0'))
424
+ .join('')}`;
425
+ }
426
+ compareQuotes(a, b) {
427
+ if (JSBI.greaterThan(a.quoteGasAdjusted.quotient, b.quoteGasAdjusted.quotient)) {
428
+ return 1;
429
+ }
430
+ if (JSBI.lessThan(a.quoteGasAdjusted.quotient, b.quoteGasAdjusted.quotient)) {
431
+ return -1;
432
+ }
433
+ return 0;
434
+ }
435
+ sumGas(sourceLeg, destinationLeg) {
436
+ return this.legGas(sourceLeg).add(this.legGas(destinationLeg));
437
+ }
438
+ legGas(leg) {
439
+ return leg.kind === 'local-swap'
440
+ ? leg.route.estimatedGasUsed
441
+ : BigNumber.from(0);
442
+ }
443
+ addressToBytes32(address) {
444
+ return hexZeroPad(getAddress(address), 32);
445
+ }
446
+ }
447
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGhyYS1yb3V0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcm91dGVycy9zeW50aHJhLXJvdXRlci9zeW50aHJhLXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFDTCxPQUFPLEVBRVAsT0FBTyxFQUVQLFNBQVMsR0FDVixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUV4QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFdBQVcsRUFBcUIsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXJDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQWtCdEQsTUFBTSxZQUFZLEdBQUcsNENBQTRDLENBQUM7QUFDbEUsTUFBTSwyQkFBMkIsR0FDL0IsNENBQTRDLENBQUM7QUFDL0MsTUFBTSw2QkFBNkIsR0FDakMsNENBQTRDLENBQUM7QUFDL0MsTUFBTSxrQ0FBa0MsR0FBRyxJQUFJLENBQUM7QUFDaEQsTUFBTSx5Q0FBeUMsR0FBRyxJQUFJLENBQUM7QUFDdkQsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLENBQUM7QUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxFQUFFLEVBQUUsS0FBTSxD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