@wormhole-foundation/sdk-evm-portico 0.5.0-beta.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.
Files changed (75) hide show
  1. package/dist/cjs/abis.d.ts +5 -0
  2. package/dist/cjs/abis.d.ts.map +1 -0
  3. package/dist/cjs/abis.js +13 -0
  4. package/dist/cjs/abis.js.map +1 -0
  5. package/dist/cjs/api.d.ts +43 -0
  6. package/dist/cjs/api.d.ts.map +1 -0
  7. package/dist/cjs/api.js +152 -0
  8. package/dist/cjs/api.js.map +1 -0
  9. package/dist/cjs/bridge.d.ts +27 -0
  10. package/dist/cjs/bridge.d.ts.map +1 -0
  11. package/dist/cjs/bridge.js +150 -0
  12. package/dist/cjs/bridge.js.map +1 -0
  13. package/dist/cjs/consts.d.ts +4 -0
  14. package/dist/cjs/consts.d.ts.map +1 -0
  15. package/dist/cjs/consts.js +13 -0
  16. package/dist/cjs/consts.js.map +1 -0
  17. package/dist/cjs/index.d.ts +2 -0
  18. package/dist/cjs/index.d.ts.map +1 -0
  19. package/dist/cjs/index.js +22 -0
  20. package/dist/cjs/index.js.map +1 -0
  21. package/dist/cjs/porticoApi.d.ts +42 -0
  22. package/dist/cjs/porticoApi.d.ts.map +1 -0
  23. package/dist/cjs/porticoApi.js +121 -0
  24. package/dist/cjs/porticoApi.js.map +1 -0
  25. package/dist/cjs/porticoBridge.d.ts +30 -0
  26. package/dist/cjs/porticoBridge.d.ts.map +1 -0
  27. package/dist/cjs/porticoBridge.js +124 -0
  28. package/dist/cjs/porticoBridge.js.map +1 -0
  29. package/dist/cjs/types.d.ts +1 -0
  30. package/dist/cjs/types.d.ts.map +1 -0
  31. package/dist/cjs/types.js +2 -0
  32. package/dist/cjs/types.js.map +1 -0
  33. package/dist/cjs/utils.d.ts +4 -0
  34. package/dist/cjs/utils.d.ts.map +1 -0
  35. package/dist/cjs/utils.js +26 -0
  36. package/dist/cjs/utils.js.map +1 -0
  37. package/dist/esm/abis.d.ts +5 -0
  38. package/dist/esm/abis.d.ts.map +1 -0
  39. package/dist/esm/abis.js +10 -0
  40. package/dist/esm/abis.js.map +1 -0
  41. package/dist/esm/api.d.ts +43 -0
  42. package/dist/esm/api.d.ts.map +1 -0
  43. package/dist/esm/api.js +145 -0
  44. package/dist/esm/api.js.map +1 -0
  45. package/dist/esm/bridge.d.ts +27 -0
  46. package/dist/esm/bridge.d.ts.map +1 -0
  47. package/dist/esm/bridge.js +146 -0
  48. package/dist/esm/bridge.js.map +1 -0
  49. package/dist/esm/consts.d.ts +4 -0
  50. package/dist/esm/consts.d.ts.map +1 -0
  51. package/dist/esm/consts.js +10 -0
  52. package/dist/esm/consts.js.map +1 -0
  53. package/dist/esm/index.d.ts +2 -0
  54. package/dist/esm/index.d.ts.map +1 -0
  55. package/dist/esm/index.js +6 -0
  56. package/dist/esm/index.js.map +1 -0
  57. package/dist/esm/porticoApi.d.ts +42 -0
  58. package/dist/esm/porticoApi.d.ts.map +1 -0
  59. package/dist/esm/porticoApi.js +114 -0
  60. package/dist/esm/porticoApi.js.map +1 -0
  61. package/dist/esm/porticoBridge.d.ts +30 -0
  62. package/dist/esm/porticoBridge.d.ts.map +1 -0
  63. package/dist/esm/porticoBridge.js +120 -0
  64. package/dist/esm/porticoBridge.js.map +1 -0
  65. package/dist/esm/types.d.ts +1 -0
  66. package/dist/esm/types.d.ts.map +1 -0
  67. package/dist/esm/types.js +2 -0
  68. package/dist/esm/types.js.map +1 -0
  69. package/dist/esm/utils.d.ts +4 -0
  70. package/dist/esm/utils.d.ts.map +1 -0
  71. package/dist/esm/utils.js +21 -0
  72. package/dist/esm/utils.js.map +1 -0
  73. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  74. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  75. package/package.json +60 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,OAAO,EASR,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAEL,SAAS,EAET,sBAAsB,EAGvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAsB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAK9D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,OAAO,0CAA0C,CAAC;AAElD,qBAAa,gBAAgB,CAC3B,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,SAAS,GAAG,SAAS,CAC/B,YAAW,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;IAU5B,QAAQ,CAAC,OAAO,EAAE,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;IAZtC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IAEvB,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC;gBAGtB,OAAO,EAAE,CAAC,EACV,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;WA6BzB,OAAO,CAAC,CAAC,SAAS,OAAO,EACpC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,GAChC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAkBnC,QAAQ,CACb,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EACtB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE,aAAa,CAAC,KAAK;IAqFrB,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG;IAazD,SAAS,CACb,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EACtB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC;IA0BZ,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAMvE,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;YAoBhC,OAAO;IAuBtB,OAAO,CAAC,yBAAyB;CAYlC"}
@@ -0,0 +1,146 @@
1
+ import { PorticoBridge, Wormhole, canonicalAddress, contracts, nativeChainIds, resolveWrappedToken, serialize, toChainId, tokens, } from '@wormhole-foundation/sdk-connect';
2
+ import { EvmAddress, EvmPlatform, EvmUnsignedTransaction, addChainId, addFrom, } from '@wormhole-foundation/sdk-evm';
3
+ import { ethers } from 'ethers';
4
+ import { porticoAbi, uniswapQuoterV2Abi } from './abis';
5
+ import { PorticoApi } from './api';
6
+ import { FEE_TIER } from './consts';
7
+ import { EvmWormholeCore } from '@wormhole-foundation/sdk-evm-core';
8
+ import '@wormhole-foundation/sdk-evm-tokenbridge';
9
+ export class EvmPorticoBridge {
10
+ network;
11
+ chain;
12
+ provider;
13
+ contracts;
14
+ core;
15
+ chainId;
16
+ porticoAddress;
17
+ uniswapAddress;
18
+ porticoContract;
19
+ uniswapContract;
20
+ constructor(network, chain, provider, contracts, core) {
21
+ this.network = network;
22
+ this.chain = chain;
23
+ this.provider = provider;
24
+ this.contracts = contracts;
25
+ this.core = core;
26
+ if (!contracts.portico)
27
+ throw new Error('Unsupported chain, no contract addresses for: ' + chain);
28
+ const { portico: porticoAddress, uniswapQuoterV2: uniswapAddress } = contracts.portico;
29
+ this.porticoAddress = porticoAddress;
30
+ this.uniswapAddress = uniswapAddress;
31
+ this.chainId = nativeChainIds.networkChainToNativeChainId.get(network, chain);
32
+ this.porticoContract = new ethers.Contract(this.porticoAddress, porticoAbi.fragments, this.provider);
33
+ this.uniswapContract = new ethers.Contract(this.uniswapAddress, uniswapQuoterV2Abi.fragments, this.provider);
34
+ }
35
+ static async fromRpc(provider, config) {
36
+ const [network, chain] = await EvmPlatform.chainFromRpc(provider);
37
+ const core = await EvmWormholeCore.fromRpc(provider, config);
38
+ const conf = config[chain];
39
+ if (conf.network !== network)
40
+ throw new Error(`Network mismatch: ${conf.network} != ${network}`);
41
+ return new EvmPorticoBridge(network, chain, provider, conf.contracts, core);
42
+ }
43
+ async *transfer(sender, receiver, token, amount, destToken, quote) {
44
+ const { minAmountStart, minAmountFinish } = quote.swapAmounts;
45
+ if (minAmountStart === 0n)
46
+ throw new Error('Invalid min swap amount');
47
+ if (minAmountFinish === 0n)
48
+ throw new Error('Invalid min swap amount');
49
+ const senderAddress = new EvmAddress(sender).toString();
50
+ const [isStartTokenNative, startToken] = resolveWrappedToken(this.network, this.chain, token);
51
+ const [isFinalTokenNative, finalToken] = resolveWrappedToken(this.network, receiver.chain, destToken);
52
+ const startTokenAddress = canonicalAddress(startToken);
53
+ const cannonTokenAddress = canonicalAddress(this.getTransferrableToken(startTokenAddress));
54
+ const receiverAddress = canonicalAddress(receiver);
55
+ const finalTokenAddress = canonicalAddress(finalToken);
56
+ const destinationPorticoAddress = contracts.portico.get(this.network, receiver.chain).portico;
57
+ const nonce = new Date().valueOf() % 2 ** 4;
58
+ const flags = PorticoBridge.serializeFlagSet({
59
+ flags: {
60
+ shouldWrapNative: isStartTokenNative,
61
+ shouldUnwrapNative: isFinalTokenNative,
62
+ },
63
+ recipientChain: toChainId(receiver.chain),
64
+ bridgeNonce: nonce,
65
+ feeTierStart: FEE_TIER,
66
+ feeTierFinish: FEE_TIER,
67
+ padding: new Uint8Array(19),
68
+ });
69
+ const transactionData = porticoAbi.encodeFunctionData('start', [
70
+ [
71
+ flags,
72
+ startTokenAddress.toLowerCase(),
73
+ cannonTokenAddress,
74
+ finalTokenAddress.toLowerCase(),
75
+ receiverAddress,
76
+ destinationPorticoAddress,
77
+ amount.toString(),
78
+ minAmountStart.toString(),
79
+ minAmountFinish.toString(),
80
+ quote.relayerFee.toString(),
81
+ ],
82
+ ]);
83
+ // Approve the token if necessary
84
+ if (!isStartTokenNative)
85
+ yield* this.approve(startTokenAddress, senderAddress, amount, this.porticoAddress);
86
+ const messageFee = await this.core.getMessageFee();
87
+ const tx = {
88
+ to: this.porticoAddress,
89
+ data: transactionData,
90
+ value: messageFee + (isStartTokenNative ? amount : 0n),
91
+ };
92
+ yield this.createUnsignedTransaction(addFrom(tx, senderAddress), 'PorticoBridge.Transfer');
93
+ }
94
+ async *redeem(sender, vaa) {
95
+ const txReq = await this.porticoContract
96
+ .getFunction('receiveMessageAndSwap')
97
+ .populateTransaction(serialize(vaa));
98
+ const address = new EvmAddress(sender).toString();
99
+ yield this.createUnsignedTransaction(addFrom(txReq, address), 'PorticoBridge.Redeem');
100
+ }
101
+ async quoteSwap(input, output, amount) {
102
+ const [, inputTokenId] = resolveWrappedToken(this.network, this.chain, input);
103
+ const [, outputTokenId] = resolveWrappedToken(this.network, this.chain, output);
104
+ const inputAddress = canonicalAddress(inputTokenId);
105
+ const outputAddress = canonicalAddress(outputTokenId);
106
+ if (tokens.isEqualCaseInsensitive(inputAddress, outputAddress))
107
+ return amount;
108
+ const result = await this.uniswapContract
109
+ .getFunction('quoteExactInputSingle')
110
+ .staticCall([inputAddress, outputAddress, amount, FEE_TIER, 0]);
111
+ return result[0];
112
+ }
113
+ async quoteRelay(startToken, endToken) {
114
+ return await PorticoApi.quoteRelayer(this.chain, startToken, endToken);
115
+ }
116
+ // For a given token, return the corresponding
117
+ // Wormhole wrapped token that originated on Ethereum
118
+ getTransferrableToken(address) {
119
+ if (this.chain === 'Ethereum')
120
+ return Wormhole.tokenId('Ethereum', address);
121
+ // get the nativeTokenDetails
122
+ const nToken = tokens.getTokenByAddress(this.network, this.chain, address);
123
+ if (!nToken)
124
+ throw new Error('Unsupported source token: ' + address);
125
+ const xToken = tokens
126
+ .getTokensBySymbol(this.network, this.chain, nToken.symbol)
127
+ ?.find((orig) => {
128
+ return orig.original === 'Ethereum';
129
+ });
130
+ if (!xToken)
131
+ throw new Error(`Unsupported symbol for chain ${nToken.symbol}: ${this.chain} `);
132
+ return Wormhole.tokenId(xToken.chain, xToken.address);
133
+ }
134
+ async *approve(token, senderAddr, amount, contract) {
135
+ const tokenContract = EvmPlatform.getTokenImplementation(this.provider, token);
136
+ const allowance = await tokenContract.allowance(senderAddr, contract);
137
+ if (allowance < amount) {
138
+ const txReq = await tokenContract.approve.populateTransaction(contract, amount);
139
+ yield this.createUnsignedTransaction(addFrom(txReq, senderAddr), 'PorticoBridge.Approve');
140
+ }
141
+ }
142
+ createUnsignedTransaction(txReq, description) {
143
+ return new EvmUnsignedTransaction(addChainId(txReq, this.chainId), this.network, this.chain, description, false);
144
+ }
145
+ }
146
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const FEE_TIER = 100;
2
+ export declare const SWAP_ERROR = "This transaction will not succeed due to price movement.";
3
+ export declare const swapErrors: string[];
4
+ //# sourceMappingURL=consts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../../src/consts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,MAAM,CAAC;AAC5B,eAAO,MAAM,UAAU,6DACqC,CAAC;AAC7D,eAAO,MAAM,UAAU,UAMtB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export const FEE_TIER = 100;
2
+ export const SWAP_ERROR = 'This transaction will not succeed due to price movement.';
3
+ export const swapErrors = [
4
+ 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT',
5
+ 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT',
6
+ 'Too little received',
7
+ 'Too much requested',
8
+ 'STF',
9
+ ];
10
+ //# sourceMappingURL=consts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.js","sourceRoot":"","sources":["../../src/consts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAC5B,MAAM,CAAC,MAAM,UAAU,GACrB,0DAA0D,CAAC;AAC7D,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,6CAA6C;IAC7C,yCAAyC;IACzC,qBAAqB;IACrB,oBAAoB;IACpB,KAAK;CACN,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './bridge';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,UAAU,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { registerProtocol } from '@wormhole-foundation/sdk-connect';
2
+ import { _platform } from '@wormhole-foundation/sdk-evm';
3
+ import { EvmPorticoBridge } from './bridge';
4
+ registerProtocol(_platform, 'PorticoBridge', EvmPorticoBridge);
5
+ export * from './bridge';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,gBAAgB,CAAC,SAAS,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC;AAE/D,cAAc,UAAU,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { TokenId } from '@wormhole-foundation/connect-sdk';
2
+ export declare const RELAYER_FEE_API_URL = "https://gfx.relayers.xlabs.xyz/api/v1/swap/quote";
3
+ export declare const OKU_TRADE_BASE_URL = "https://oku.trade/app";
4
+ export interface CreateOrderRequest {
5
+ startingChainId: number;
6
+ destinationChainId: number;
7
+ startingToken: string;
8
+ startingTokenAmount: string;
9
+ destinationToken: string;
10
+ destinationAddress: string;
11
+ relayerFee: string;
12
+ feeTierStart: number;
13
+ feeTierEnd: number;
14
+ minAmountStart: string;
15
+ minAmountEnd: string;
16
+ bridgeNonce: number;
17
+ shouldWrapNative: boolean;
18
+ shouldUnwrapNative: boolean;
19
+ porticoAddress: string;
20
+ destinationPorticoAddress: string;
21
+ }
22
+ export interface CreateOrderResponse {
23
+ transactionData: string;
24
+ transactionTarget: string;
25
+ transactionValue: string;
26
+ startParameters: string[];
27
+ estimatedAmountOut: string;
28
+ }
29
+ export interface RelayerQuoteResponse {
30
+ fee: string;
31
+ validUntil: string;
32
+ }
33
+ export declare class PorticoApi {
34
+ static createOrder(request: CreateOrderRequest): Promise<CreateOrderResponse>;
35
+ /**
36
+ * Validates that the response from the order creation API matches the request
37
+ * throws an error if there is a mismatch
38
+ */
39
+ static validateCreateOrderResponse: (response: CreateOrderResponse, request: CreateOrderRequest) => void;
40
+ static quoteRelayer(from: TokenId, to: TokenId): Promise<bigint>;
41
+ }
42
+ //# sourceMappingURL=porticoApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"porticoApi.d.ts","sourceRoot":"","sources":["../../src/porticoApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,MAAM,kCAAkC,CAAC;AAKhF,eAAO,MAAM,mBAAmB,qDACoB,CAAC;AACrD,eAAO,MAAM,kBAAkB,0BAA0B,CAAC;AAI1D,MAAM,WAAW,kBAAkB;IAEjC,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAE3B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,yBAAyB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,UAAU;WAER,WAAW,CACtB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;IAkB/B;;;OAGG;IACH,MAAM,CAAC,2BAA2B,aACtB,mBAAmB,WACpB,kBAAkB,KAC1B,IAAI,CAqGL;WAEW,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;CAyBvE"}
@@ -0,0 +1,114 @@
1
+ import { encoding, toChainId } from '@wormhole-foundation/connect-sdk';
2
+ import axios from 'axios';
3
+ import { porticoAbi } from './abis';
4
+ import { isEqualCaseInsensitive } from './utils';
5
+ export const RELAYER_FEE_API_URL = 'https://gfx.relayers.xlabs.xyz/api/v1/swap/quote';
6
+ export const OKU_TRADE_BASE_URL = 'https://oku.trade/app';
7
+ const CREATE_ORDER_API_URL = 'https://thermae.fly.dev/api/order/create';
8
+ export class PorticoApi {
9
+ // Post the order to the portico API
10
+ static async createOrder(request) {
11
+ try {
12
+ const response = await axios.post(CREATE_ORDER_API_URL, request);
13
+ // Validate the response, not strictly necessary but if some details are wrong we want to know
14
+ this.validateCreateOrderResponse(response.data, request);
15
+ return response.data;
16
+ }
17
+ catch (e) {
18
+ if (axios.isAxiosError(e)) {
19
+ const message = `${e.response?.statusText}: ${e.response?.data.message}`;
20
+ throw new Error(`Could not create order: ${message},`);
21
+ }
22
+ throw e;
23
+ }
24
+ }
25
+ /**
26
+ * Validates that the response from the order creation API matches the request
27
+ * throws an error if there is a mismatch
28
+ */
29
+ static validateCreateOrderResponse = (response, request) => {
30
+ if (!isEqualCaseInsensitive(request.porticoAddress || '', response.transactionTarget)) {
31
+ throw new Error('portico address mismatch');
32
+ }
33
+ const decoded = porticoAbi.decodeFunctionData('start', response.transactionData);
34
+ if (decoded.length !== 1 || decoded[0].length !== 10) {
35
+ throw new Error('decoded length mismatch');
36
+ }
37
+ const flagSetBuffer = Buffer.from(decoded[0][0].slice(2), 'hex');
38
+ if (flagSetBuffer.length !== 32) {
39
+ throw new Error('flag set length mismatch');
40
+ }
41
+ const { recipientChain, feeTierStart, feeTierFinish, shouldWrapNative, shouldUnwrapNative,
42
+ //@ts-ignore
43
+ } = parseFlagSet(flagSetBuffer);
44
+ if (recipientChain !== request.destinationChainId) {
45
+ throw new Error('recipient chain mismatch');
46
+ }
47
+ if (feeTierStart !== request.feeTierStart) {
48
+ throw new Error('fee tier start mismatch');
49
+ }
50
+ if (feeTierFinish !== request.feeTierEnd) {
51
+ throw new Error('fee tier end mismatch');
52
+ }
53
+ if (shouldWrapNative !== request.shouldWrapNative) {
54
+ throw new Error('should wrap native mismatch');
55
+ }
56
+ if (shouldUnwrapNative !== request.shouldUnwrapNative) {
57
+ throw new Error('should unwrap native mismatch');
58
+ }
59
+ const startTokenAddress = decoded[0][1];
60
+ if (!isEqualCaseInsensitive(startTokenAddress, request.startingToken)) {
61
+ throw new Error('start token address mismatch');
62
+ }
63
+ // const startTokenId = Wormhole.chainAddress(toChain(request.startingChainId), startTokenAddress);
64
+ // const canonicalTokenAddress: string = decoded[0][2];
65
+ // if (!isEqualCaseInsensitive(canonicalTokenAddress, getOriginalAddress("Mainnet", startTokenId))) {
66
+ // throw new Error("canonical token address mismatch");
67
+ // }
68
+ const finalTokenAddress = decoded[0][3];
69
+ if (!isEqualCaseInsensitive(finalTokenAddress, request.destinationToken)) {
70
+ throw new Error('final token address mismatch');
71
+ }
72
+ const recipientAddress = decoded[0][4];
73
+ if (!isEqualCaseInsensitive(recipientAddress, request.destinationAddress)) {
74
+ throw new Error('recipient address mismatch');
75
+ }
76
+ const destinationPorticoAddress = decoded[0][5];
77
+ if (!isEqualCaseInsensitive(destinationPorticoAddress, request.destinationPorticoAddress || '')) {
78
+ throw new Error('destination portico address mismatch');
79
+ }
80
+ const amountSpecified = decoded[0][6];
81
+ if (amountSpecified.toString() !== request.startingTokenAmount) {
82
+ throw new Error('amount mismatch');
83
+ }
84
+ const minAmountStart = decoded[0][7];
85
+ if (minAmountStart.toString() !== request.minAmountStart) {
86
+ throw new Error('min amount start mismatch');
87
+ }
88
+ const minAmountFinish = decoded[0][8];
89
+ if (minAmountFinish.toString() !== request.minAmountEnd) {
90
+ throw new Error('min amount finish mismatch');
91
+ }
92
+ const relayerFee = decoded[0][9];
93
+ if (relayerFee.toString() !== request.relayerFee) {
94
+ throw new Error('relayer fee mismatch');
95
+ }
96
+ };
97
+ static async quoteRelayer(from, to) {
98
+ const targetChain = toChainId(to.chain);
99
+ const sourceToken = encoding.hex.encode(from.address.toUniversalAddress().toUint8Array(), false);
100
+ const targetToken = encoding.hex.encode(to.address.toUniversalAddress().toUint8Array(), false);
101
+ const request = { targetChain, sourceToken, targetToken };
102
+ try {
103
+ const response = await axios.post(RELAYER_FEE_API_URL, request);
104
+ return BigInt(response.data.fee);
105
+ }
106
+ catch (e) {
107
+ if (axios.isAxiosError(e)) {
108
+ throw new Error(`Error getting relayer fee: ${e.response?.statusText}`);
109
+ }
110
+ throw e;
111
+ }
112
+ }
113
+ }
114
+ //# sourceMappingURL=porticoApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"porticoApi.js","sourceRoot":"","sources":["../../src/porticoApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { AccountAddress, ChainAddress, ChainsConfig, Contracts, Network, Platform, Signer, TokenAddress, TokenId, VAA } from '@wormhole-foundation/connect-sdk';
2
+ import { EvmChains, EvmUnsignedTransaction } from '@wormhole-foundation/connect-sdk-evm';
3
+ import { Provider, ethers } from 'ethers';
4
+ import { EvmWormholeCore } from '@wormhole-foundation/connect-sdk-evm-core';
5
+ import '@wormhole-foundation/connect-sdk-evm-tokenbridge';
6
+ export declare class EvmPorticoBridge<N extends Network, C extends EvmChains = EvmChains> {
7
+ readonly network: N;
8
+ readonly chain: C;
9
+ readonly provider: Provider;
10
+ readonly contracts: Contracts;
11
+ readonly core: EvmWormholeCore<N, C>;
12
+ chainId: bigint;
13
+ porticoAddress: string;
14
+ uniswapAddress: string;
15
+ porticoContract: ethers.Contract;
16
+ uniswapContract: ethers.Contract;
17
+ constructor(network: N, chain: C, provider: Provider, contracts: Contracts, core: EvmWormholeCore<N, C>);
18
+ static fromRpc<N extends Network>(provider: Provider, config: ChainsConfig<N, Platform>): Promise<EvmPorticoBridge<N, EvmChains>>;
19
+ transfer(sender: AccountAddress<C>, receiver: ChainAddress, token: TokenAddress<C>, amount: bigint, destToken: TokenId | 'native', swapAmounts: {
20
+ minAmountStart: bigint;
21
+ minAmountFinish: bigint;
22
+ amountFinish: bigint;
23
+ }, relayerFee: bigint): AsyncGenerator<EvmUnsignedTransaction<N, "Acala" | "Arbitrum" | "Aurora" | "Avalanche" | "Base" | "Bsc" | "Celo" | "Ethereum" | "Fantom" | "Gnosis" | "Karura" | "Klaytn" | "Moonbeam" | "Neon" | "Oasis" | "Optimism" | "Polygon" | "Rootstock" | "Sepolia" | "ArbitrumSepolia" | "BaseSepolia" | "OptimismSepolia" | "Holesky">, void, unknown>;
24
+ redeem(vaa: VAA, signer: Signer<N>): AsyncGenerator<EvmUnsignedTransaction<N, "Acala" | "Arbitrum" | "Aurora" | "Avalanche" | "Base" | "Bsc" | "Celo" | "Ethereum" | "Fantom" | "Gnosis" | "Karura" | "Klaytn" | "Moonbeam" | "Neon" | "Oasis" | "Optimism" | "Polygon" | "Rootstock" | "Sepolia" | "ArbitrumSepolia" | "BaseSepolia" | "OptimismSepolia" | "Holesky">, void, unknown>;
25
+ quoteSwap(input: TokenAddress<C>, output: TokenAddress<C>, amount: bigint): Promise<bigint>;
26
+ quoteRelay(token: TokenAddress<C>, destination: TokenId): Promise<bigint>;
27
+ private approve;
28
+ private createUnsignedTransaction;
29
+ }
30
+ //# sourceMappingURL=porticoBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"porticoBridge.d.ts","sourceRoot":"","sources":["../../src/porticoBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACP,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,OAAO,EACP,GAAG,EAKJ,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAEL,SAAS,EAET,sBAAsB,EAGvB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAsB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAK9D,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAC5E,OAAO,kDAAkD,CAAC;AAG1D,qBAAa,gBAAgB,CAC3B,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,SAAS,GAAG,SAAS;IAU7B,QAAQ,CAAC,OAAO,EAAE,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;IAZtC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IAEvB,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC;gBAGtB,OAAO,EAAE,CAAC,EACV,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;WAwBzB,OAAO,CAAC,CAAC,SAAS,OAAO,EACpC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,GAChC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAkBnC,QAAQ,CACb,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EACtB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,OAAO,GAAG,QAAQ,EAC7B,WAAW,EAAE;QACX,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;KACtB,EACD,UAAU,EAAE,MAAM;IAyEb,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAWnC,SAAS,CACb,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EACtB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC;IAyBZ,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO;YAK9C,OAAO;IAuBtB,OAAO,CAAC,yBAAyB;CAYlC"}
@@ -0,0 +1,120 @@
1
+ import { canonicalAddress, nativeChainIds, resolveWrappedToken, serialize, } from '@wormhole-foundation/connect-sdk';
2
+ import { EvmAddress, EvmPlatform, EvmUnsignedTransaction, addChainId, addFrom, } from '@wormhole-foundation/connect-sdk-evm';
3
+ import { ethers } from 'ethers';
4
+ import { porticoAbi, uniswapQuoterV2Abi } from './abis';
5
+ import { FEE_TIER, getContracts } from './consts';
6
+ import { isEqualCaseInsensitive } from './utils';
7
+ import { EvmWormholeCore } from '@wormhole-foundation/connect-sdk-evm-core';
8
+ import '@wormhole-foundation/connect-sdk-evm-tokenbridge';
9
+ import { PorticoApi } from './porticoApi';
10
+ export class EvmPorticoBridge {
11
+ network;
12
+ chain;
13
+ provider;
14
+ contracts;
15
+ core;
16
+ chainId;
17
+ porticoAddress;
18
+ uniswapAddress;
19
+ porticoContract;
20
+ uniswapContract;
21
+ constructor(network, chain, provider, contracts, core) {
22
+ this.network = network;
23
+ this.chain = chain;
24
+ this.provider = provider;
25
+ this.contracts = contracts;
26
+ this.core = core;
27
+ const { portico, uniswapQuoterV2 } = getContracts(chain);
28
+ this.porticoAddress = portico;
29
+ this.uniswapAddress = uniswapQuoterV2;
30
+ this.chainId = nativeChainIds.networkChainToNativeChainId.get(network, chain);
31
+ this.porticoContract = new ethers.Contract(this.porticoAddress, porticoAbi.fragments, this.provider);
32
+ this.uniswapContract = new ethers.Contract(this.uniswapAddress, uniswapQuoterV2Abi.fragments, this.provider);
33
+ }
34
+ static async fromRpc(provider, config) {
35
+ const [network, chain] = await EvmPlatform.chainFromRpc(provider);
36
+ const core = await EvmWormholeCore.fromRpc(provider, config);
37
+ const conf = config[chain];
38
+ if (conf.network !== network)
39
+ throw new Error(`Network mismatch: ${conf.network} != ${network}`);
40
+ return new EvmPorticoBridge(network, chain, provider, conf.contracts, core);
41
+ }
42
+ async *transfer(sender, receiver, token, amount, destToken, swapAmounts, relayerFee) {
43
+ const { minAmountStart, minAmountFinish } = swapAmounts;
44
+ if (minAmountStart === 0n)
45
+ throw new Error('Invalid min swap amount');
46
+ if (minAmountFinish === 0n)
47
+ throw new Error('Invalid min swap amount');
48
+ const senderAddress = new EvmAddress(sender).toString();
49
+ const receiverAddress = canonicalAddress(receiver);
50
+ const [isStartTokenNative, startToken] = resolveWrappedToken(this.network, this.chain, token);
51
+ const [isFinalTokenNative, finalToken] = resolveWrappedToken(this.network, receiver.chain, destToken);
52
+ const startTokenAddress = canonicalAddress(startToken);
53
+ const finalTokenAddress = canonicalAddress(finalToken);
54
+ const destinationPorticoAddress = getContracts(receiver.chain).portico;
55
+ const receiverChainId = nativeChainIds.networkChainToNativeChainId.get(this.network, receiver.chain);
56
+ // Create the order
57
+ const createOrderResult = await PorticoApi.createOrder({
58
+ startingChainId: Number(this.chainId),
59
+ startingToken: startTokenAddress,
60
+ startingTokenAmount: amount.toString(),
61
+ destinationToken: finalTokenAddress,
62
+ destinationAddress: receiverAddress,
63
+ destinationChainId: Number(receiverChainId),
64
+ feeTierStart: FEE_TIER,
65
+ feeTierEnd: FEE_TIER,
66
+ minAmountStart: minAmountStart.toString(),
67
+ minAmountEnd: minAmountFinish.toString(),
68
+ bridgeNonce: new Date().valueOf(),
69
+ shouldWrapNative: isStartTokenNative,
70
+ shouldUnwrapNative: isFinalTokenNative,
71
+ porticoAddress: this.porticoAddress,
72
+ relayerFee: relayerFee.toString(),
73
+ destinationPorticoAddress,
74
+ });
75
+ // Approve the token if necessary
76
+ if (!isStartTokenNative)
77
+ yield* this.approve(startTokenAddress, senderAddress, amount, this.porticoAddress);
78
+ const messageFee = await this.core.getMessageFee();
79
+ const tx = {
80
+ to: this.porticoAddress,
81
+ data: createOrderResult.transactionData,
82
+ value: messageFee + (isStartTokenNative ? amount : 0n),
83
+ };
84
+ yield this.createUnsignedTransaction(addFrom(tx, senderAddress), 'PorticoBridge.Transfer');
85
+ }
86
+ async *redeem(vaa, signer) {
87
+ const txReq = await this.porticoContract
88
+ .getFunction('receiveMessageAndSwap')
89
+ .populateTransaction(serialize(vaa));
90
+ yield this.createUnsignedTransaction(addFrom(txReq, signer.address()), 'PorticoBridge.Redeem');
91
+ }
92
+ async quoteSwap(input, output, amount) {
93
+ const [, inputTokenId] = resolveWrappedToken(this.network, this.chain, input);
94
+ const [, outputTokenId] = resolveWrappedToken(this.network, this.chain, output);
95
+ const inputAddress = canonicalAddress(inputTokenId);
96
+ const outputAddress = canonicalAddress(outputTokenId);
97
+ if (isEqualCaseInsensitive(inputAddress, outputAddress))
98
+ return amount;
99
+ const result = await this.uniswapContract
100
+ .getFunction('quoteExactInputSingle')
101
+ .staticCall([inputAddress, outputAddress, amount, FEE_TIER, 0]);
102
+ return result[0];
103
+ }
104
+ async quoteRelay(token, destination) {
105
+ const [, startToken] = resolveWrappedToken(this.network, this.chain, token);
106
+ return await PorticoApi.quoteRelayer(startToken, destination);
107
+ }
108
+ async *approve(token, senderAddr, amount, contract) {
109
+ const tokenContract = EvmPlatform.getTokenImplementation(this.provider, token);
110
+ const allowance = await tokenContract.allowance(senderAddr, contract);
111
+ if (allowance < amount) {
112
+ const txReq = await tokenContract.approve.populateTransaction(contract, amount);
113
+ yield this.createUnsignedTransaction(addFrom(txReq, senderAddr), 'PorticoBridge.Approve');
114
+ }
115
+ }
116
+ createUnsignedTransaction(txReq, description) {
117
+ return new EvmUnsignedTransaction(addChainId(txReq, this.chainId), this.network, this.chain, description, false);
118
+ }
119
+ }
120
+ //# sourceMappingURL=porticoBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"porticoBridge.js","sourceRoot":"","sources":["../../src/porticoBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import { TokenId } from '@wormhole-foundation/connect-sdk';
2
+ export declare const isEqualCaseInsensitive: (a: string, b: string) => boolean;
3
+ export declare const getOriginalEthereumAddress: <N extends "Mainnet" | "Testnet" | "Devnet">(network: N, token: TokenId) => TokenId;
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,OAAO,EAIR,MAAM,kCAAkC,CAAC;AAE1C,eAAO,MAAM,sBAAsB,MAAO,MAAM,KAAK,MAAM,KAAG,OAE7D,CAAC;AAIF,eAAO,MAAM,0BAA0B,kEAE9B,OAAO,KACb,OAwBF,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { Wormhole, canonicalAddress, tokens, } from '@wormhole-foundation/connect-sdk';
2
+ export const isEqualCaseInsensitive = (a, b) => {
3
+ return a.toLowerCase() === b.toLowerCase();
4
+ };
5
+ // For a given token, return the corresponding address native to Ethereum
6
+ // Only considers local cache
7
+ export const getOriginalEthereumAddress = (network, token) => {
8
+ if (token.chain === 'Ethereum')
9
+ return token;
10
+ const tokenAddress = canonicalAddress(token);
11
+ const tokenData = tokens.getTokenByAddress(network, token.chain, tokenAddress);
12
+ if (!tokenData)
13
+ throw new Error('Could not find token symbol for ' + tokenAddress);
14
+ const originalToken = tokens.getCanonicalToken(network, token.chain, tokenData.symbol);
15
+ if (!originalToken)
16
+ throw new Error('Could not find original token for ' + tokenAddress);
17
+ if (originalToken.chain !== 'Ethereum')
18
+ throw new Error('Original token does not come from Ethereum');
19
+ return Wormhole.chainAddress(originalToken.chain, originalToken.address);
20
+ };
21
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,QAAQ,EACR,gBAAgB,EAChB,MAAM,GACP,MAAM,kCAAkC,CAAC;AAE1C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAS,EAAE,CAAS,EAAW,EAAE;IACtE,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7C,CAAC,CAAC;AAEF,yEAAyE;AACzE,6BAA6B;AAC7B,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,OAAU,EACV,KAAc,EACL,EAAE;IACX,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IAE7C,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,iBAAiB,CACxC,OAAO,EACP,KAAK,CAAC,KAAK,EACX,YAAY,CACb,CAAC;IACF,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,YAAY,CAAC,CAAC;IAErE,MAAM,aAAa,GAAG,MAAM,CAAC,iBAAiB,CAC5C,OAAO,EACP,KAAK,CAAC,KAAK,EACX,SAAS,CAAC,MAAM,CACjB,CAAC;IACF,IAAI,CAAC,aAAa;QAChB,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,YAAY,CAAC,CAAC;IAEvE,IAAI,aAAa,CAAC,KAAK,KAAK,UAAU;QACpC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAEhE,OAAO,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;AAC3E,CAAC,CAAC"}