@wormhole-foundation/sdk-evm-portico 0.5.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/abis.d.ts +5 -0
- package/dist/cjs/abis.d.ts.map +1 -0
- package/dist/cjs/abis.js +13 -0
- package/dist/cjs/abis.js.map +1 -0
- package/dist/cjs/api.d.ts +43 -0
- package/dist/cjs/api.d.ts.map +1 -0
- package/dist/cjs/api.js +152 -0
- package/dist/cjs/api.js.map +1 -0
- package/dist/cjs/bridge.d.ts +27 -0
- package/dist/cjs/bridge.d.ts.map +1 -0
- package/dist/cjs/bridge.js +150 -0
- package/dist/cjs/bridge.js.map +1 -0
- package/dist/cjs/consts.d.ts +4 -0
- package/dist/cjs/consts.d.ts.map +1 -0
- package/dist/cjs/consts.js +13 -0
- package/dist/cjs/consts.js.map +1 -0
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +22 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/abis.d.ts +5 -0
- package/dist/esm/abis.d.ts.map +1 -0
- package/dist/esm/abis.js +10 -0
- package/dist/esm/abis.js.map +1 -0
- package/dist/esm/api.d.ts +43 -0
- package/dist/esm/api.d.ts.map +1 -0
- package/dist/esm/api.js +145 -0
- package/dist/esm/api.js.map +1 -0
- package/dist/esm/bridge.d.ts +27 -0
- package/dist/esm/bridge.d.ts.map +1 -0
- package/dist/esm/bridge.js +146 -0
- package/dist/esm/bridge.js.map +1 -0
- package/dist/esm/consts.d.ts +4 -0
- package/dist/esm/consts.d.ts.map +1 -0
- package/dist/esm/consts.js +10 -0
- package/dist/esm/consts.js.map +1 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ethers } from 'ethers';
|
|
2
|
+
export declare const porticoAbi: ethers.Interface;
|
|
3
|
+
export declare const porticoSwapFinishedEvent = "0xc2addcb063016f6dc1647fc8cd7206c3436cc4293c4acffe4feac288459ca7fc";
|
|
4
|
+
export declare const uniswapQuoterV2Abi: ethers.Interface;
|
|
5
|
+
//# sourceMappingURL=abis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abis.d.ts","sourceRoot":"","sources":["../../src/abis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,eAAO,MAAM,UAAU,kBAGrB,CAAC;AAEH,eAAO,MAAM,wBAAwB,uEACiC,CAAC;AAEvE,eAAO,MAAM,kBAAkB,kBAE7B,CAAC"}
|
package/dist/cjs/abis.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.uniswapQuoterV2Abi = exports.porticoSwapFinishedEvent = exports.porticoAbi = void 0;
|
|
4
|
+
const ethers_1 = require("ethers");
|
|
5
|
+
exports.porticoAbi = new ethers_1.ethers.Interface([
|
|
6
|
+
'function start((bytes32,address,address,address,address,address,uint256,uint256,uint256,uint256)) returns (address,uint16,uint64)',
|
|
7
|
+
'function receiveMessageAndSwap(bytes)',
|
|
8
|
+
]);
|
|
9
|
+
exports.porticoSwapFinishedEvent = '0xc2addcb063016f6dc1647fc8cd7206c3436cc4293c4acffe4feac288459ca7fc';
|
|
10
|
+
exports.uniswapQuoterV2Abi = new ethers_1.ethers.Interface([
|
|
11
|
+
'function quoteExactInputSingle((address,address,uint256,uint24,uint160)) public view returns (uint256,uint160,uint32,uint256)',
|
|
12
|
+
]);
|
|
13
|
+
//# sourceMappingURL=abis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abis.js","sourceRoot":"","sources":["../../src/abis.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAEnB,QAAA,UAAU,GAAG,IAAI,eAAM,CAAC,SAAS,CAAC;IAC7C,mIAAmI;IACnI,uCAAuC;CACxC,CAAC,CAAC;AAEU,QAAA,wBAAwB,GACnC,oEAAoE,CAAC;AAE1D,QAAA,kBAAkB,GAAG,IAAI,eAAM,CAAC,SAAS,CAAC;IACrD,+HAA+H;CAChI,CAAC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Chain, ChainAddress, Network, PorticoBridge, TokenAddress, TokenId } from '@wormhole-foundation/sdk-connect';
|
|
2
|
+
import { EvmChains } from '@wormhole-foundation/sdk-evm';
|
|
3
|
+
export declare const RELAYER_FEE_API_URL = "https://gfx.relayers.xlabs.xyz/api/v1/swap/quote";
|
|
4
|
+
export declare const OKU_TRADE_BASE_URL = "https://oku.trade/app";
|
|
5
|
+
export interface CreateOrderRequest {
|
|
6
|
+
startingChainId: number;
|
|
7
|
+
destinationChainId: number;
|
|
8
|
+
startingToken: string;
|
|
9
|
+
startingTokenAmount: string;
|
|
10
|
+
destinationToken: string;
|
|
11
|
+
destinationAddress: string;
|
|
12
|
+
relayerFee: string;
|
|
13
|
+
feeTierStart: number;
|
|
14
|
+
feeTierEnd: number;
|
|
15
|
+
minAmountStart: string;
|
|
16
|
+
minAmountEnd: string;
|
|
17
|
+
bridgeNonce: number;
|
|
18
|
+
shouldWrapNative: boolean;
|
|
19
|
+
shouldUnwrapNative: boolean;
|
|
20
|
+
porticoAddress: string;
|
|
21
|
+
destinationPorticoAddress: string;
|
|
22
|
+
}
|
|
23
|
+
export interface CreateOrderResponse {
|
|
24
|
+
transactionData: string;
|
|
25
|
+
transactionTarget: string;
|
|
26
|
+
transactionValue: string;
|
|
27
|
+
startParameters: string[];
|
|
28
|
+
estimatedAmountOut: string;
|
|
29
|
+
}
|
|
30
|
+
export interface RelayerQuoteResponse {
|
|
31
|
+
fee: string;
|
|
32
|
+
validUntil: string;
|
|
33
|
+
}
|
|
34
|
+
export declare class PorticoApi {
|
|
35
|
+
static createOrder<N extends Network, C extends EvmChains>(network: N, chain: C, receiver: ChainAddress, token: TokenAddress<C>, amount: bigint, destToken: TokenId, quote: PorticoBridge.Quote, nonce: number): Promise<CreateOrderResponse>;
|
|
36
|
+
/**
|
|
37
|
+
* Validates that the response from the order creation API matches the request
|
|
38
|
+
* throws an error if there is a mismatch
|
|
39
|
+
*/
|
|
40
|
+
static validateCreateOrderResponse: (response: CreateOrderResponse, request: CreateOrderRequest) => void;
|
|
41
|
+
static quoteRelayer<C extends Chain>(chain: Chain, from: TokenAddress<C>, to: TokenAddress<C>): Promise<bigint>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,YAAY,EACZ,OAAO,EACP,aAAa,EACb,YAAY,EACZ,OAAO,EASR,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAKzD,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,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,SAAS,EAC7D,OAAO,EAAE,CAAC,EACV,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EACtB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE,aAAa,CAAC,KAAK,EAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,mBAAmB,CAAC;IA6E/B;;;OAGG;IACH,MAAM,CAAC,2BAA2B,aACtB,mBAAmB,WACpB,kBAAkB,KAC1B,IAAI,CAmHL;WAEW,YAAY,CAAC,CAAC,SAAS,KAAK,EACvC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EACrB,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,GAClB,OAAO,CAAC,MAAM,CAAC;CA8BnB"}
|
package/dist/cjs/api.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PorticoApi = exports.OKU_TRADE_BASE_URL = exports.RELAYER_FEE_API_URL = void 0;
|
|
7
|
+
const sdk_connect_1 = require("@wormhole-foundation/sdk-connect");
|
|
8
|
+
const axios_1 = __importDefault(require("axios"));
|
|
9
|
+
const abis_1 = require("./abis");
|
|
10
|
+
const consts_1 = require("./consts");
|
|
11
|
+
exports.RELAYER_FEE_API_URL = 'https://gfx.relayers.xlabs.xyz/api/v1/swap/quote';
|
|
12
|
+
exports.OKU_TRADE_BASE_URL = 'https://oku.trade/app';
|
|
13
|
+
const CREATE_ORDER_API_URL = 'https://thermae.fly.dev/api/order/create';
|
|
14
|
+
class PorticoApi {
|
|
15
|
+
// Post the order to the portico API
|
|
16
|
+
static async createOrder(network, chain, receiver, token, amount, destToken, quote, nonce) {
|
|
17
|
+
try {
|
|
18
|
+
const { minAmountStart, minAmountFinish } = quote.swapAmounts;
|
|
19
|
+
const receiverAddress = (0, sdk_connect_1.canonicalAddress)(receiver);
|
|
20
|
+
const [isStartTokenNative, startToken] = (0, sdk_connect_1.resolveWrappedToken)(network, chain, token);
|
|
21
|
+
const [isFinalTokenNative, finalToken] = (0, sdk_connect_1.resolveWrappedToken)(network, receiver.chain, destToken);
|
|
22
|
+
const startTokenAddress = (0, sdk_connect_1.canonicalAddress)(startToken);
|
|
23
|
+
const finalTokenAddress = (0, sdk_connect_1.canonicalAddress)(finalToken);
|
|
24
|
+
const sourcePorticoAddress = sdk_connect_1.contracts.portico.get(network, chain).portico;
|
|
25
|
+
const destinationPorticoAddress = sdk_connect_1.contracts.portico.get(network, receiver.chain).portico;
|
|
26
|
+
const startingChainId = sdk_connect_1.nativeChainIds.networkChainToNativeChainId.get(network, chain);
|
|
27
|
+
const destinationChainId = sdk_connect_1.nativeChainIds.networkChainToNativeChainId.get(network, receiver.chain);
|
|
28
|
+
// Create the order
|
|
29
|
+
const orderRequest = {
|
|
30
|
+
startingChainId: Number(startingChainId),
|
|
31
|
+
startingToken: startTokenAddress.toLowerCase(),
|
|
32
|
+
destinationChainId: Number(destinationChainId),
|
|
33
|
+
destinationToken: finalTokenAddress.toLowerCase(),
|
|
34
|
+
destinationAddress: receiverAddress,
|
|
35
|
+
porticoAddress: sourcePorticoAddress,
|
|
36
|
+
destinationPorticoAddress: destinationPorticoAddress,
|
|
37
|
+
startingTokenAmount: amount.toString(),
|
|
38
|
+
minAmountStart: minAmountStart.toString(),
|
|
39
|
+
minAmountEnd: minAmountFinish.toString(),
|
|
40
|
+
bridgeNonce: nonce,
|
|
41
|
+
relayerFee: quote.relayerFee.toString(),
|
|
42
|
+
feeTierStart: consts_1.FEE_TIER,
|
|
43
|
+
feeTierEnd: consts_1.FEE_TIER,
|
|
44
|
+
shouldWrapNative: isStartTokenNative,
|
|
45
|
+
shouldUnwrapNative: isFinalTokenNative,
|
|
46
|
+
};
|
|
47
|
+
const response = await axios_1.default.post(CREATE_ORDER_API_URL, orderRequest);
|
|
48
|
+
// Validate the response, not strictly necessary but if some details are wrong we want to know
|
|
49
|
+
this.validateCreateOrderResponse(response.data, orderRequest);
|
|
50
|
+
return response.data;
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
if (axios_1.default.isAxiosError(e)) {
|
|
54
|
+
const message = `${e.response?.statusText}: ${e.response?.data.message}`;
|
|
55
|
+
throw new Error(`Could not create order: ${message},`);
|
|
56
|
+
}
|
|
57
|
+
throw e;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Validates that the response from the order creation API matches the request
|
|
62
|
+
* throws an error if there is a mismatch
|
|
63
|
+
*/
|
|
64
|
+
static validateCreateOrderResponse = (response, request) => {
|
|
65
|
+
if (!sdk_connect_1.tokens.isEqualCaseInsensitive(request.porticoAddress || '', response.transactionTarget)) {
|
|
66
|
+
throw new Error('portico address mismatch');
|
|
67
|
+
}
|
|
68
|
+
const decoded = abis_1.porticoAbi.decodeFunctionData('start', response.transactionData);
|
|
69
|
+
if (decoded.length !== 1 || decoded[0].length !== 10) {
|
|
70
|
+
throw new Error('decoded length mismatch');
|
|
71
|
+
}
|
|
72
|
+
const flagSetBuffer = sdk_connect_1.encoding.hex.decode(decoded[0][0]);
|
|
73
|
+
if (flagSetBuffer.length !== 32) {
|
|
74
|
+
throw new Error('flag set length mismatch');
|
|
75
|
+
}
|
|
76
|
+
const { recipientChain, feeTierStart, feeTierFinish, flags } = sdk_connect_1.PorticoBridge.deserializeFlagSet(flagSetBuffer);
|
|
77
|
+
const { shouldWrapNative, shouldUnwrapNative } = flags;
|
|
78
|
+
const [_, expectedChain] = sdk_connect_1.nativeChainIds.platformNativeChainIdToNetworkChain('Evm', BigInt(request.destinationChainId));
|
|
79
|
+
if (recipientChain !== (0, sdk_connect_1.toChainId)(expectedChain)) {
|
|
80
|
+
throw new Error('recipient chain mismatch');
|
|
81
|
+
}
|
|
82
|
+
if (feeTierStart !== request.feeTierStart) {
|
|
83
|
+
throw new Error('fee tier start mismatch');
|
|
84
|
+
}
|
|
85
|
+
if (feeTierFinish !== request.feeTierEnd) {
|
|
86
|
+
throw new Error('fee tier end mismatch');
|
|
87
|
+
}
|
|
88
|
+
if (!!shouldWrapNative !== request.shouldWrapNative) {
|
|
89
|
+
throw new Error('should wrap native mismatch');
|
|
90
|
+
}
|
|
91
|
+
if (!!shouldUnwrapNative !== request.shouldUnwrapNative) {
|
|
92
|
+
throw new Error('should unwrap native mismatch');
|
|
93
|
+
}
|
|
94
|
+
const startTokenAddress = decoded[0][1];
|
|
95
|
+
if (!sdk_connect_1.tokens.isEqualCaseInsensitive(startTokenAddress, request.startingToken)) {
|
|
96
|
+
throw new Error('start token address mismatch');
|
|
97
|
+
}
|
|
98
|
+
// const startTokenId = Wormhole.chainAddress(toChain(request.startingChainId), startTokenAddress);
|
|
99
|
+
// const canonicalTokenAddress: string = decoded[0][2];
|
|
100
|
+
// if (!isEqualCaseInsensitive(canonicalTokenAddress, getOriginalAddress("Mainnet", startTokenId))) {
|
|
101
|
+
// throw new Error("canonical token address mismatch");
|
|
102
|
+
// }
|
|
103
|
+
const finalTokenAddress = decoded[0][3];
|
|
104
|
+
if (!sdk_connect_1.tokens.isEqualCaseInsensitive(finalTokenAddress, request.destinationToken)) {
|
|
105
|
+
throw new Error('final token address mismatch');
|
|
106
|
+
}
|
|
107
|
+
const recipientAddress = decoded[0][4];
|
|
108
|
+
if (!sdk_connect_1.tokens.isEqualCaseInsensitive(recipientAddress, request.destinationAddress)) {
|
|
109
|
+
throw new Error('recipient address mismatch');
|
|
110
|
+
}
|
|
111
|
+
const destinationPorticoAddress = decoded[0][5];
|
|
112
|
+
if (!sdk_connect_1.tokens.isEqualCaseInsensitive(destinationPorticoAddress, request.destinationPorticoAddress || '')) {
|
|
113
|
+
throw new Error('destination portico address mismatch');
|
|
114
|
+
}
|
|
115
|
+
const amountSpecified = decoded[0][6];
|
|
116
|
+
if (amountSpecified.toString() !== request.startingTokenAmount) {
|
|
117
|
+
throw new Error('amount mismatch');
|
|
118
|
+
}
|
|
119
|
+
const minAmountStart = decoded[0][7];
|
|
120
|
+
if (minAmountStart.toString() !== request.minAmountStart) {
|
|
121
|
+
throw new Error('min amount start mismatch');
|
|
122
|
+
}
|
|
123
|
+
const minAmountFinish = decoded[0][8];
|
|
124
|
+
if (minAmountFinish.toString() !== request.minAmountEnd) {
|
|
125
|
+
throw new Error('min amount finish mismatch');
|
|
126
|
+
}
|
|
127
|
+
const relayerFee = decoded[0][9];
|
|
128
|
+
if (relayerFee.toString() !== request.relayerFee) {
|
|
129
|
+
throw new Error('relayer fee mismatch');
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
static async quoteRelayer(chain, from, to) {
|
|
133
|
+
if ((0, sdk_connect_1.isNative)(from) || (0, sdk_connect_1.isNative)(to))
|
|
134
|
+
throw new Error('how did you get here tho?');
|
|
135
|
+
const sourceToken = sdk_connect_1.encoding.hex.encode(from.toUniversalAddress().toUint8Array(), false);
|
|
136
|
+
const targetToken = sdk_connect_1.encoding.hex.encode(to.toUniversalAddress().toUint8Array(), false);
|
|
137
|
+
const targetChain = (0, sdk_connect_1.toChainId)(chain);
|
|
138
|
+
const request = { targetChain, sourceToken, targetToken };
|
|
139
|
+
try {
|
|
140
|
+
const response = await axios_1.default.post(exports.RELAYER_FEE_API_URL, request);
|
|
141
|
+
return BigInt(response.data.fee);
|
|
142
|
+
}
|
|
143
|
+
catch (e) {
|
|
144
|
+
if (axios_1.default.isAxiosError(e)) {
|
|
145
|
+
throw new Error(`Error getting relayer fee: ${e.response?.statusText}`);
|
|
146
|
+
}
|
|
147
|
+
throw e;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.PorticoApi = PorticoApi;
|
|
152
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":";;;;;;AAAA,kEAe0C;AAE1C,kDAA0B;AAC1B,iCAAoC;AACpC,qCAAoC;AAEvB,QAAA,mBAAmB,GAC9B,kDAAkD,CAAC;AACxC,QAAA,kBAAkB,GAAG,uBAAuB,CAAC;AAE1D,MAAM,oBAAoB,GAAG,0CAA0C,CAAC;AAoCxE,MAAa,UAAU;IACrB,oCAAoC;IACpC,MAAM,CAAC,KAAK,CAAC,WAAW,CACtB,OAAU,EACV,KAAQ,EACR,QAAsB,EACtB,KAAsB,EACtB,MAAc,EACd,SAAkB,EAClB,KAA0B,EAC1B,KAAa;QAEb,IAAI;YACF,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC;YAE9D,MAAM,eAAe,GAAG,IAAA,8BAAgB,EAAC,QAAQ,CAAC,CAAC;YAEnD,MAAM,CAAC,kBAAkB,EAAE,UAAU,CAAC,GAAG,IAAA,iCAAmB,EAC1D,OAAO,EACP,KAAK,EACL,KAAK,CACN,CAAC;YAEF,MAAM,CAAC,kBAAkB,EAAE,UAAU,CAAC,GAAG,IAAA,iCAAmB,EAC1D,OAAO,EACP,QAAQ,CAAC,KAAK,EACd,SAAS,CACV,CAAC;YAEF,MAAM,iBAAiB,GAAG,IAAA,8BAAgB,EAAC,UAAU,CAAC,CAAC;YACvD,MAAM,iBAAiB,GAAG,IAAA,8BAAgB,EAAC,UAAU,CAAC,CAAC;YAEvD,MAAM,oBAAoB,GAAG,uBAAS,CAAC,OAAO,CAAC,GAAG,CAChD,OAAO,EACP,KAAK,CACL,CAAC,OAAO,CAAC;YAEX,MAAM,yBAAyB,GAAG,uBAAS,CAAC,OAAO,CAAC,GAAG,CACrD,OAAO,EACP,QAAQ,CAAC,KAAK,CACd,CAAC,OAAO,CAAC;YAEX,MAAM,eAAe,GAAG,4BAAc,CAAC,2BAA2B,CAAC,GAAG,CACpE,OAAO,EACP,KAAK,CACI,CAAC;YAEZ,MAAM,kBAAkB,GAAG,4BAAc,CAAC,2BAA2B,CAAC,GAAG,CACvE,OAAO,EACP,QAAQ,CAAC,KAAK,CACL,CAAC;YAEZ,mBAAmB;YACnB,MAAM,YAAY,GAAuB;gBACvC,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC;gBACxC,aAAa,EAAE,iBAAiB,CAAC,WAAW,EAAE;gBAC9C,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,CAAC;gBAC9C,gBAAgB,EAAE,iBAAiB,CAAC,WAAW,EAAE;gBACjD,kBAAkB,EAAE,eAAe;gBACnC,cAAc,EAAE,oBAAoB;gBACpC,yBAAyB,EAAE,yBAAyB;gBACpD,mBAAmB,EAAE,MAAM,CAAC,QAAQ,EAAE;gBACtC,cAAc,EAAE,cAAc,CAAC,QAAQ,EAAE;gBACzC,YAAY,EAAE,eAAe,CAAC,QAAQ,EAAE;gBACxC,WAAW,EAAE,KAAK;gBAClB,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE;gBACvC,YAAY,EAAE,iBAAQ;gBACtB,UAAU,EAAE,iBAAQ;gBACpB,gBAAgB,EAAE,kBAAkB;gBACpC,kBAAkB,EAAE,kBAAkB;aACvC,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,oBAAoB,EACpB,YAAY,CACb,CAAC;YACF,8FAA8F;YAC9F,IAAI,CAAC,2BAA2B,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAC9D,OAAO,QAAQ,CAAC,IAAI,CAAC;SACtB;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,eAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;gBACzB,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,UAAU,KAAK,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACzE,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,GAAG,CAAC,CAAC;aACxD;YACD,MAAM,CAAC,CAAC;SACT;IACH,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,2BAA2B,GAAG,CACnC,QAA6B,EAC7B,OAA2B,EACrB,EAAE;QACR,IACE,CAAC,oBAAM,CAAC,sBAAsB,CAC5B,OAAO,CAAC,cAAc,IAAI,EAAE,EAC5B,QAAQ,CAAC,iBAAiB,CAC3B,EACD;YACA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;SAC7C;QAED,MAAM,OAAO,GAAG,iBAAU,CAAC,kBAAkB,CAC3C,OAAO,EACP,QAAQ,CAAC,eAAe,CACzB,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,EAAE;YACpD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC5C;QAED,MAAM,aAAa,GAAG,sBAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,aAAa,CAAC,MAAM,KAAK,EAAE,EAAE;YAC/B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;SAC7C;QAED,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,GAC1D,2BAAa,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAElD,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAC;QAEvD,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,GACtB,4BAAc,CAAC,mCAAmC,CAChD,KAAK,EACL,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CACnC,CAAC;QACJ,IAAI,cAAc,KAAK,IAAA,uBAAS,EAAC,aAAa,CAAC,EAAE;YAC/C,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;SAC7C;QAED,IAAI,YAAY,KAAK,OAAO,CAAC,YAAY,EAAE;YACzC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC5C;QAED,IAAI,aAAa,KAAK,OAAO,CAAC,UAAU,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;SAC1C;QAED,IAAI,CAAC,CAAC,gBAAgB,KAAK,OAAO,CAAC,gBAAgB,EAAE;YACnD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;SAChD;QAED,IAAI,CAAC,CAAC,kBAAkB,KAAK,OAAO,CAAC,kBAAkB,EAAE;YACvD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SAClD;QAED,MAAM,iBAAiB,GAAW,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,IACE,CAAC,oBAAM,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,OAAO,CAAC,aAAa,CAAC,EACxE;YACA,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;SACjD;QAED,mGAAmG;QACnG,uDAAuD;QACvD,qGAAqG;QACrG,yDAAyD;QACzD,IAAI;QAEJ,MAAM,iBAAiB,GAAW,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,IACE,CAAC,oBAAM,CAAC,sBAAsB,CAC5B,iBAAiB,EACjB,OAAO,CAAC,gBAAgB,CACzB,EACD;YACA,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;SACjD;QAED,MAAM,gBAAgB,GAAW,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,IACE,CAAC,oBAAM,CAAC,sBAAsB,CAC5B,gBAAgB,EAChB,OAAO,CAAC,kBAAkB,CAC3B,EACD;YACA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;SAC/C;QAED,MAAM,yBAAyB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,IACE,CAAC,oBAAM,CAAC,sBAAsB,CAC5B,yBAAyB,EACzB,OAAO,CAAC,yBAAyB,IAAI,EAAE,CACxC,EACD;YACA,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;SACzD;QAED,MAAM,eAAe,GAAW,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,eAAe,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,mBAAmB,EAAE;YAC9D,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;SACpC;QAED,MAAM,cAAc,GAAW,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,cAAc,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,cAAc,EAAE;YACxD,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;SAC9C;QAED,MAAM,eAAe,GAAW,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,eAAe,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,YAAY,EAAE;YACvD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;SAC/C;QAED,MAAM,UAAU,GAAW,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,UAAU,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,UAAU,EAAE;YAChD,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;SACzC;IACH,CAAC,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,YAAY,CACvB,KAAY,EACZ,IAAqB,EACrB,EAAmB;QAEnB,IAAI,IAAA,sBAAQ,EAAC,IAAI,CAAC,IAAI,IAAA,sBAAQ,EAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAE/C,MAAM,WAAW,GAAG,sBAAQ,CAAC,GAAG,CAAC,MAAM,CACrC,IAAI,CAAC,kBAAkB,EAAE,CAAC,YAAY,EAAE,EACxC,KAAK,CACN,CAAC;QAEF,MAAM,WAAW,GAAG,sBAAQ,CAAC,GAAG,CAAC,MAAM,CACrC,EAAE,CAAC,kBAAkB,EAAE,CAAC,YAAY,EAAE,EACtC,KAAK,CACN,CAAC;QAEF,MAAM,WAAW,GAAG,IAAA,uBAAS,EAAC,KAAK,CAAC,CAAC;QAErC,MAAM,OAAO,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;QAC1D,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,2BAAmB,EACnB,OAAO,CACR,CAAC;YACF,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAClC;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,eAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;gBACzB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;aACzE;YACD,MAAM,CAAC,CAAC;SACT;IACH,CAAC;;AArPH,gCAsPC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AccountAddress, ChainAddress, ChainsConfig, Contracts, Network, Platform, PorticoBridge, TokenAddress, TokenId } from '@wormhole-foundation/sdk-connect';
|
|
2
|
+
import { EvmChains, EvmUnsignedTransaction } from '@wormhole-foundation/sdk-evm';
|
|
3
|
+
import { Provider, ethers } from 'ethers';
|
|
4
|
+
import { EvmWormholeCore } from '@wormhole-foundation/sdk-evm-core';
|
|
5
|
+
import '@wormhole-foundation/sdk-evm-tokenbridge';
|
|
6
|
+
export declare class EvmPorticoBridge<N extends Network, C extends EvmChains = EvmChains> implements PorticoBridge<N, C> {
|
|
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, quote: PorticoBridge.Quote): AsyncGenerator<EvmUnsignedTransaction<N, C>, void, unknown>;
|
|
20
|
+
redeem(sender: AccountAddress<C>, vaa: PorticoBridge.VAA): AsyncGenerator<EvmUnsignedTransaction<N, C>, void, unknown>;
|
|
21
|
+
quoteSwap(input: TokenAddress<C>, output: TokenAddress<C>, amount: bigint): Promise<bigint>;
|
|
22
|
+
quoteRelay(startToken: TokenAddress<C>, endToken: TokenAddress<C>): Promise<bigint>;
|
|
23
|
+
getTransferrableToken(address: string): TokenId;
|
|
24
|
+
private approve;
|
|
25
|
+
private createUnsignedTransaction;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=bridge.d.ts.map
|
|
@@ -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,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EvmPorticoBridge = void 0;
|
|
4
|
+
const sdk_connect_1 = require("@wormhole-foundation/sdk-connect");
|
|
5
|
+
const sdk_evm_1 = require("@wormhole-foundation/sdk-evm");
|
|
6
|
+
const ethers_1 = require("ethers");
|
|
7
|
+
const abis_1 = require("./abis");
|
|
8
|
+
const api_1 = require("./api");
|
|
9
|
+
const consts_1 = require("./consts");
|
|
10
|
+
const sdk_evm_core_1 = require("@wormhole-foundation/sdk-evm-core");
|
|
11
|
+
require("@wormhole-foundation/sdk-evm-tokenbridge");
|
|
12
|
+
class EvmPorticoBridge {
|
|
13
|
+
network;
|
|
14
|
+
chain;
|
|
15
|
+
provider;
|
|
16
|
+
contracts;
|
|
17
|
+
core;
|
|
18
|
+
chainId;
|
|
19
|
+
porticoAddress;
|
|
20
|
+
uniswapAddress;
|
|
21
|
+
porticoContract;
|
|
22
|
+
uniswapContract;
|
|
23
|
+
constructor(network, chain, provider, contracts, core) {
|
|
24
|
+
this.network = network;
|
|
25
|
+
this.chain = chain;
|
|
26
|
+
this.provider = provider;
|
|
27
|
+
this.contracts = contracts;
|
|
28
|
+
this.core = core;
|
|
29
|
+
if (!contracts.portico)
|
|
30
|
+
throw new Error('Unsupported chain, no contract addresses for: ' + chain);
|
|
31
|
+
const { portico: porticoAddress, uniswapQuoterV2: uniswapAddress } = contracts.portico;
|
|
32
|
+
this.porticoAddress = porticoAddress;
|
|
33
|
+
this.uniswapAddress = uniswapAddress;
|
|
34
|
+
this.chainId = sdk_connect_1.nativeChainIds.networkChainToNativeChainId.get(network, chain);
|
|
35
|
+
this.porticoContract = new ethers_1.ethers.Contract(this.porticoAddress, abis_1.porticoAbi.fragments, this.provider);
|
|
36
|
+
this.uniswapContract = new ethers_1.ethers.Contract(this.uniswapAddress, abis_1.uniswapQuoterV2Abi.fragments, this.provider);
|
|
37
|
+
}
|
|
38
|
+
static async fromRpc(provider, config) {
|
|
39
|
+
const [network, chain] = await sdk_evm_1.EvmPlatform.chainFromRpc(provider);
|
|
40
|
+
const core = await sdk_evm_core_1.EvmWormholeCore.fromRpc(provider, config);
|
|
41
|
+
const conf = config[chain];
|
|
42
|
+
if (conf.network !== network)
|
|
43
|
+
throw new Error(`Network mismatch: ${conf.network} != ${network}`);
|
|
44
|
+
return new EvmPorticoBridge(network, chain, provider, conf.contracts, core);
|
|
45
|
+
}
|
|
46
|
+
async *transfer(sender, receiver, token, amount, destToken, quote) {
|
|
47
|
+
const { minAmountStart, minAmountFinish } = quote.swapAmounts;
|
|
48
|
+
if (minAmountStart === 0n)
|
|
49
|
+
throw new Error('Invalid min swap amount');
|
|
50
|
+
if (minAmountFinish === 0n)
|
|
51
|
+
throw new Error('Invalid min swap amount');
|
|
52
|
+
const senderAddress = new sdk_evm_1.EvmAddress(sender).toString();
|
|
53
|
+
const [isStartTokenNative, startToken] = (0, sdk_connect_1.resolveWrappedToken)(this.network, this.chain, token);
|
|
54
|
+
const [isFinalTokenNative, finalToken] = (0, sdk_connect_1.resolveWrappedToken)(this.network, receiver.chain, destToken);
|
|
55
|
+
const startTokenAddress = (0, sdk_connect_1.canonicalAddress)(startToken);
|
|
56
|
+
const cannonTokenAddress = (0, sdk_connect_1.canonicalAddress)(this.getTransferrableToken(startTokenAddress));
|
|
57
|
+
const receiverAddress = (0, sdk_connect_1.canonicalAddress)(receiver);
|
|
58
|
+
const finalTokenAddress = (0, sdk_connect_1.canonicalAddress)(finalToken);
|
|
59
|
+
const destinationPorticoAddress = sdk_connect_1.contracts.portico.get(this.network, receiver.chain).portico;
|
|
60
|
+
const nonce = new Date().valueOf() % 2 ** 4;
|
|
61
|
+
const flags = sdk_connect_1.PorticoBridge.serializeFlagSet({
|
|
62
|
+
flags: {
|
|
63
|
+
shouldWrapNative: isStartTokenNative,
|
|
64
|
+
shouldUnwrapNative: isFinalTokenNative,
|
|
65
|
+
},
|
|
66
|
+
recipientChain: (0, sdk_connect_1.toChainId)(receiver.chain),
|
|
67
|
+
bridgeNonce: nonce,
|
|
68
|
+
feeTierStart: consts_1.FEE_TIER,
|
|
69
|
+
feeTierFinish: consts_1.FEE_TIER,
|
|
70
|
+
padding: new Uint8Array(19),
|
|
71
|
+
});
|
|
72
|
+
const transactionData = abis_1.porticoAbi.encodeFunctionData('start', [
|
|
73
|
+
[
|
|
74
|
+
flags,
|
|
75
|
+
startTokenAddress.toLowerCase(),
|
|
76
|
+
cannonTokenAddress,
|
|
77
|
+
finalTokenAddress.toLowerCase(),
|
|
78
|
+
receiverAddress,
|
|
79
|
+
destinationPorticoAddress,
|
|
80
|
+
amount.toString(),
|
|
81
|
+
minAmountStart.toString(),
|
|
82
|
+
minAmountFinish.toString(),
|
|
83
|
+
quote.relayerFee.toString(),
|
|
84
|
+
],
|
|
85
|
+
]);
|
|
86
|
+
// Approve the token if necessary
|
|
87
|
+
if (!isStartTokenNative)
|
|
88
|
+
yield* this.approve(startTokenAddress, senderAddress, amount, this.porticoAddress);
|
|
89
|
+
const messageFee = await this.core.getMessageFee();
|
|
90
|
+
const tx = {
|
|
91
|
+
to: this.porticoAddress,
|
|
92
|
+
data: transactionData,
|
|
93
|
+
value: messageFee + (isStartTokenNative ? amount : 0n),
|
|
94
|
+
};
|
|
95
|
+
yield this.createUnsignedTransaction((0, sdk_evm_1.addFrom)(tx, senderAddress), 'PorticoBridge.Transfer');
|
|
96
|
+
}
|
|
97
|
+
async *redeem(sender, vaa) {
|
|
98
|
+
const txReq = await this.porticoContract
|
|
99
|
+
.getFunction('receiveMessageAndSwap')
|
|
100
|
+
.populateTransaction((0, sdk_connect_1.serialize)(vaa));
|
|
101
|
+
const address = new sdk_evm_1.EvmAddress(sender).toString();
|
|
102
|
+
yield this.createUnsignedTransaction((0, sdk_evm_1.addFrom)(txReq, address), 'PorticoBridge.Redeem');
|
|
103
|
+
}
|
|
104
|
+
async quoteSwap(input, output, amount) {
|
|
105
|
+
const [, inputTokenId] = (0, sdk_connect_1.resolveWrappedToken)(this.network, this.chain, input);
|
|
106
|
+
const [, outputTokenId] = (0, sdk_connect_1.resolveWrappedToken)(this.network, this.chain, output);
|
|
107
|
+
const inputAddress = (0, sdk_connect_1.canonicalAddress)(inputTokenId);
|
|
108
|
+
const outputAddress = (0, sdk_connect_1.canonicalAddress)(outputTokenId);
|
|
109
|
+
if (sdk_connect_1.tokens.isEqualCaseInsensitive(inputAddress, outputAddress))
|
|
110
|
+
return amount;
|
|
111
|
+
const result = await this.uniswapContract
|
|
112
|
+
.getFunction('quoteExactInputSingle')
|
|
113
|
+
.staticCall([inputAddress, outputAddress, amount, consts_1.FEE_TIER, 0]);
|
|
114
|
+
return result[0];
|
|
115
|
+
}
|
|
116
|
+
async quoteRelay(startToken, endToken) {
|
|
117
|
+
return await api_1.PorticoApi.quoteRelayer(this.chain, startToken, endToken);
|
|
118
|
+
}
|
|
119
|
+
// For a given token, return the corresponding
|
|
120
|
+
// Wormhole wrapped token that originated on Ethereum
|
|
121
|
+
getTransferrableToken(address) {
|
|
122
|
+
if (this.chain === 'Ethereum')
|
|
123
|
+
return sdk_connect_1.Wormhole.tokenId('Ethereum', address);
|
|
124
|
+
// get the nativeTokenDetails
|
|
125
|
+
const nToken = sdk_connect_1.tokens.getTokenByAddress(this.network, this.chain, address);
|
|
126
|
+
if (!nToken)
|
|
127
|
+
throw new Error('Unsupported source token: ' + address);
|
|
128
|
+
const xToken = sdk_connect_1.tokens
|
|
129
|
+
.getTokensBySymbol(this.network, this.chain, nToken.symbol)
|
|
130
|
+
?.find((orig) => {
|
|
131
|
+
return orig.original === 'Ethereum';
|
|
132
|
+
});
|
|
133
|
+
if (!xToken)
|
|
134
|
+
throw new Error(`Unsupported symbol for chain ${nToken.symbol}: ${this.chain} `);
|
|
135
|
+
return sdk_connect_1.Wormhole.tokenId(xToken.chain, xToken.address);
|
|
136
|
+
}
|
|
137
|
+
async *approve(token, senderAddr, amount, contract) {
|
|
138
|
+
const tokenContract = sdk_evm_1.EvmPlatform.getTokenImplementation(this.provider, token);
|
|
139
|
+
const allowance = await tokenContract.allowance(senderAddr, contract);
|
|
140
|
+
if (allowance < amount) {
|
|
141
|
+
const txReq = await tokenContract.approve.populateTransaction(contract, amount);
|
|
142
|
+
yield this.createUnsignedTransaction((0, sdk_evm_1.addFrom)(txReq, senderAddr), 'PorticoBridge.Approve');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
createUnsignedTransaction(txReq, description) {
|
|
146
|
+
return new sdk_evm_1.EvmUnsignedTransaction((0, sdk_evm_1.addChainId)(txReq, this.chainId), this.network, this.chain, description, false);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.EvmPorticoBridge = EvmPorticoBridge;
|
|
150
|
+
//# 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 @@
|
|
|
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,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.swapErrors = exports.SWAP_ERROR = exports.FEE_TIER = void 0;
|
|
4
|
+
exports.FEE_TIER = 100;
|
|
5
|
+
exports.SWAP_ERROR = 'This transaction will not succeed due to price movement.';
|
|
6
|
+
exports.swapErrors = [
|
|
7
|
+
'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT',
|
|
8
|
+
'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT',
|
|
9
|
+
'Too little received',
|
|
10
|
+
'Too much requested',
|
|
11
|
+
'STF',
|
|
12
|
+
];
|
|
13
|
+
//# sourceMappingURL=consts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../../src/consts.ts"],"names":[],"mappings":";;;AAAa,QAAA,QAAQ,GAAG,GAAG,CAAC;AACf,QAAA,UAAU,GACrB,0DAA0D,CAAC;AAChD,QAAA,UAAU,GAAG;IACxB,6CAA6C;IAC7C,yCAAyC;IACzC,qBAAqB;IACrB,oBAAoB;IACpB,KAAK;CACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
const sdk_connect_1 = require("@wormhole-foundation/sdk-connect");
|
|
18
|
+
const sdk_evm_1 = require("@wormhole-foundation/sdk-evm");
|
|
19
|
+
const bridge_1 = require("./bridge");
|
|
20
|
+
(0, sdk_connect_1.registerProtocol)(sdk_evm_1._platform, 'PorticoBridge', bridge_1.EvmPorticoBridge);
|
|
21
|
+
__exportStar(require("./bridge"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kEAAoE;AACpE,0DAAyD;AACzD,qCAA4C;AAE5C,IAAA,8BAAgB,EAAC,mBAAS,EAAE,eAAe,EAAE,yBAAgB,CAAC,CAAC;AAE/D,2CAAyB"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ethers } from 'ethers';
|
|
2
|
+
export declare const porticoAbi: ethers.Interface;
|
|
3
|
+
export declare const porticoSwapFinishedEvent = "0xc2addcb063016f6dc1647fc8cd7206c3436cc4293c4acffe4feac288459ca7fc";
|
|
4
|
+
export declare const uniswapQuoterV2Abi: ethers.Interface;
|
|
5
|
+
//# sourceMappingURL=abis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abis.d.ts","sourceRoot":"","sources":["../../src/abis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,eAAO,MAAM,UAAU,kBAGrB,CAAC;AAEH,eAAO,MAAM,wBAAwB,uEACiC,CAAC;AAEvE,eAAO,MAAM,kBAAkB,kBAE7B,CAAC"}
|
package/dist/esm/abis.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ethers } from 'ethers';
|
|
2
|
+
export const porticoAbi = new ethers.Interface([
|
|
3
|
+
'function start((bytes32,address,address,address,address,address,uint256,uint256,uint256,uint256)) returns (address,uint16,uint64)',
|
|
4
|
+
'function receiveMessageAndSwap(bytes)',
|
|
5
|
+
]);
|
|
6
|
+
export const porticoSwapFinishedEvent = '0xc2addcb063016f6dc1647fc8cd7206c3436cc4293c4acffe4feac288459ca7fc';
|
|
7
|
+
export const uniswapQuoterV2Abi = new ethers.Interface([
|
|
8
|
+
'function quoteExactInputSingle((address,address,uint256,uint24,uint160)) public view returns (uint256,uint160,uint32,uint256)',
|
|
9
|
+
]);
|
|
10
|
+
//# sourceMappingURL=abis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abis.js","sourceRoot":"","sources":["../../src/abis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC;IAC7C,mIAAmI;IACnI,uCAAuC;CACxC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GACnC,oEAAoE,CAAC;AAEvE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC;IACrD,+HAA+H;CAChI,CAAC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Chain, ChainAddress, Network, PorticoBridge, TokenAddress, TokenId } from '@wormhole-foundation/sdk-connect';
|
|
2
|
+
import { EvmChains } from '@wormhole-foundation/sdk-evm';
|
|
3
|
+
export declare const RELAYER_FEE_API_URL = "https://gfx.relayers.xlabs.xyz/api/v1/swap/quote";
|
|
4
|
+
export declare const OKU_TRADE_BASE_URL = "https://oku.trade/app";
|
|
5
|
+
export interface CreateOrderRequest {
|
|
6
|
+
startingChainId: number;
|
|
7
|
+
destinationChainId: number;
|
|
8
|
+
startingToken: string;
|
|
9
|
+
startingTokenAmount: string;
|
|
10
|
+
destinationToken: string;
|
|
11
|
+
destinationAddress: string;
|
|
12
|
+
relayerFee: string;
|
|
13
|
+
feeTierStart: number;
|
|
14
|
+
feeTierEnd: number;
|
|
15
|
+
minAmountStart: string;
|
|
16
|
+
minAmountEnd: string;
|
|
17
|
+
bridgeNonce: number;
|
|
18
|
+
shouldWrapNative: boolean;
|
|
19
|
+
shouldUnwrapNative: boolean;
|
|
20
|
+
porticoAddress: string;
|
|
21
|
+
destinationPorticoAddress: string;
|
|
22
|
+
}
|
|
23
|
+
export interface CreateOrderResponse {
|
|
24
|
+
transactionData: string;
|
|
25
|
+
transactionTarget: string;
|
|
26
|
+
transactionValue: string;
|
|
27
|
+
startParameters: string[];
|
|
28
|
+
estimatedAmountOut: string;
|
|
29
|
+
}
|
|
30
|
+
export interface RelayerQuoteResponse {
|
|
31
|
+
fee: string;
|
|
32
|
+
validUntil: string;
|
|
33
|
+
}
|
|
34
|
+
export declare class PorticoApi {
|
|
35
|
+
static createOrder<N extends Network, C extends EvmChains>(network: N, chain: C, receiver: ChainAddress, token: TokenAddress<C>, amount: bigint, destToken: TokenId, quote: PorticoBridge.Quote, nonce: number): Promise<CreateOrderResponse>;
|
|
36
|
+
/**
|
|
37
|
+
* Validates that the response from the order creation API matches the request
|
|
38
|
+
* throws an error if there is a mismatch
|
|
39
|
+
*/
|
|
40
|
+
static validateCreateOrderResponse: (response: CreateOrderResponse, request: CreateOrderRequest) => void;
|
|
41
|
+
static quoteRelayer<C extends Chain>(chain: Chain, from: TokenAddress<C>, to: TokenAddress<C>): Promise<bigint>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,YAAY,EACZ,OAAO,EACP,aAAa,EACb,YAAY,EACZ,OAAO,EASR,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAKzD,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,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,SAAS,EAC7D,OAAO,EAAE,CAAC,EACV,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EACtB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE,aAAa,CAAC,KAAK,EAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,mBAAmB,CAAC;IA6E/B;;;OAGG;IACH,MAAM,CAAC,2BAA2B,aACtB,mBAAmB,WACpB,kBAAkB,KAC1B,IAAI,CAmHL;WAEW,YAAY,CAAC,CAAC,SAAS,KAAK,EACvC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EACrB,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,GAClB,OAAO,CAAC,MAAM,CAAC;CA8BnB"}
|
package/dist/esm/api.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { PorticoBridge, canonicalAddress, contracts, encoding, isNative, nativeChainIds, resolveWrappedToken, toChainId, tokens, } from '@wormhole-foundation/sdk-connect';
|
|
2
|
+
import axios from 'axios';
|
|
3
|
+
import { porticoAbi } from './abis';
|
|
4
|
+
import { FEE_TIER } from './consts';
|
|
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(network, chain, receiver, token, amount, destToken, quote, nonce) {
|
|
11
|
+
try {
|
|
12
|
+
const { minAmountStart, minAmountFinish } = quote.swapAmounts;
|
|
13
|
+
const receiverAddress = canonicalAddress(receiver);
|
|
14
|
+
const [isStartTokenNative, startToken] = resolveWrappedToken(network, chain, token);
|
|
15
|
+
const [isFinalTokenNative, finalToken] = resolveWrappedToken(network, receiver.chain, destToken);
|
|
16
|
+
const startTokenAddress = canonicalAddress(startToken);
|
|
17
|
+
const finalTokenAddress = canonicalAddress(finalToken);
|
|
18
|
+
const sourcePorticoAddress = contracts.portico.get(network, chain).portico;
|
|
19
|
+
const destinationPorticoAddress = contracts.portico.get(network, receiver.chain).portico;
|
|
20
|
+
const startingChainId = nativeChainIds.networkChainToNativeChainId.get(network, chain);
|
|
21
|
+
const destinationChainId = nativeChainIds.networkChainToNativeChainId.get(network, receiver.chain);
|
|
22
|
+
// Create the order
|
|
23
|
+
const orderRequest = {
|
|
24
|
+
startingChainId: Number(startingChainId),
|
|
25
|
+
startingToken: startTokenAddress.toLowerCase(),
|
|
26
|
+
destinationChainId: Number(destinationChainId),
|
|
27
|
+
destinationToken: finalTokenAddress.toLowerCase(),
|
|
28
|
+
destinationAddress: receiverAddress,
|
|
29
|
+
porticoAddress: sourcePorticoAddress,
|
|
30
|
+
destinationPorticoAddress: destinationPorticoAddress,
|
|
31
|
+
startingTokenAmount: amount.toString(),
|
|
32
|
+
minAmountStart: minAmountStart.toString(),
|
|
33
|
+
minAmountEnd: minAmountFinish.toString(),
|
|
34
|
+
bridgeNonce: nonce,
|
|
35
|
+
relayerFee: quote.relayerFee.toString(),
|
|
36
|
+
feeTierStart: FEE_TIER,
|
|
37
|
+
feeTierEnd: FEE_TIER,
|
|
38
|
+
shouldWrapNative: isStartTokenNative,
|
|
39
|
+
shouldUnwrapNative: isFinalTokenNative,
|
|
40
|
+
};
|
|
41
|
+
const response = await axios.post(CREATE_ORDER_API_URL, orderRequest);
|
|
42
|
+
// Validate the response, not strictly necessary but if some details are wrong we want to know
|
|
43
|
+
this.validateCreateOrderResponse(response.data, orderRequest);
|
|
44
|
+
return response.data;
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
if (axios.isAxiosError(e)) {
|
|
48
|
+
const message = `${e.response?.statusText}: ${e.response?.data.message}`;
|
|
49
|
+
throw new Error(`Could not create order: ${message},`);
|
|
50
|
+
}
|
|
51
|
+
throw e;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Validates that the response from the order creation API matches the request
|
|
56
|
+
* throws an error if there is a mismatch
|
|
57
|
+
*/
|
|
58
|
+
static validateCreateOrderResponse = (response, request) => {
|
|
59
|
+
if (!tokens.isEqualCaseInsensitive(request.porticoAddress || '', response.transactionTarget)) {
|
|
60
|
+
throw new Error('portico address mismatch');
|
|
61
|
+
}
|
|
62
|
+
const decoded = porticoAbi.decodeFunctionData('start', response.transactionData);
|
|
63
|
+
if (decoded.length !== 1 || decoded[0].length !== 10) {
|
|
64
|
+
throw new Error('decoded length mismatch');
|
|
65
|
+
}
|
|
66
|
+
const flagSetBuffer = encoding.hex.decode(decoded[0][0]);
|
|
67
|
+
if (flagSetBuffer.length !== 32) {
|
|
68
|
+
throw new Error('flag set length mismatch');
|
|
69
|
+
}
|
|
70
|
+
const { recipientChain, feeTierStart, feeTierFinish, flags } = PorticoBridge.deserializeFlagSet(flagSetBuffer);
|
|
71
|
+
const { shouldWrapNative, shouldUnwrapNative } = flags;
|
|
72
|
+
const [_, expectedChain] = nativeChainIds.platformNativeChainIdToNetworkChain('Evm', BigInt(request.destinationChainId));
|
|
73
|
+
if (recipientChain !== toChainId(expectedChain)) {
|
|
74
|
+
throw new Error('recipient chain mismatch');
|
|
75
|
+
}
|
|
76
|
+
if (feeTierStart !== request.feeTierStart) {
|
|
77
|
+
throw new Error('fee tier start mismatch');
|
|
78
|
+
}
|
|
79
|
+
if (feeTierFinish !== request.feeTierEnd) {
|
|
80
|
+
throw new Error('fee tier end mismatch');
|
|
81
|
+
}
|
|
82
|
+
if (!!shouldWrapNative !== request.shouldWrapNative) {
|
|
83
|
+
throw new Error('should wrap native mismatch');
|
|
84
|
+
}
|
|
85
|
+
if (!!shouldUnwrapNative !== request.shouldUnwrapNative) {
|
|
86
|
+
throw new Error('should unwrap native mismatch');
|
|
87
|
+
}
|
|
88
|
+
const startTokenAddress = decoded[0][1];
|
|
89
|
+
if (!tokens.isEqualCaseInsensitive(startTokenAddress, request.startingToken)) {
|
|
90
|
+
throw new Error('start token address mismatch');
|
|
91
|
+
}
|
|
92
|
+
// const startTokenId = Wormhole.chainAddress(toChain(request.startingChainId), startTokenAddress);
|
|
93
|
+
// const canonicalTokenAddress: string = decoded[0][2];
|
|
94
|
+
// if (!isEqualCaseInsensitive(canonicalTokenAddress, getOriginalAddress("Mainnet", startTokenId))) {
|
|
95
|
+
// throw new Error("canonical token address mismatch");
|
|
96
|
+
// }
|
|
97
|
+
const finalTokenAddress = decoded[0][3];
|
|
98
|
+
if (!tokens.isEqualCaseInsensitive(finalTokenAddress, request.destinationToken)) {
|
|
99
|
+
throw new Error('final token address mismatch');
|
|
100
|
+
}
|
|
101
|
+
const recipientAddress = decoded[0][4];
|
|
102
|
+
if (!tokens.isEqualCaseInsensitive(recipientAddress, request.destinationAddress)) {
|
|
103
|
+
throw new Error('recipient address mismatch');
|
|
104
|
+
}
|
|
105
|
+
const destinationPorticoAddress = decoded[0][5];
|
|
106
|
+
if (!tokens.isEqualCaseInsensitive(destinationPorticoAddress, request.destinationPorticoAddress || '')) {
|
|
107
|
+
throw new Error('destination portico address mismatch');
|
|
108
|
+
}
|
|
109
|
+
const amountSpecified = decoded[0][6];
|
|
110
|
+
if (amountSpecified.toString() !== request.startingTokenAmount) {
|
|
111
|
+
throw new Error('amount mismatch');
|
|
112
|
+
}
|
|
113
|
+
const minAmountStart = decoded[0][7];
|
|
114
|
+
if (minAmountStart.toString() !== request.minAmountStart) {
|
|
115
|
+
throw new Error('min amount start mismatch');
|
|
116
|
+
}
|
|
117
|
+
const minAmountFinish = decoded[0][8];
|
|
118
|
+
if (minAmountFinish.toString() !== request.minAmountEnd) {
|
|
119
|
+
throw new Error('min amount finish mismatch');
|
|
120
|
+
}
|
|
121
|
+
const relayerFee = decoded[0][9];
|
|
122
|
+
if (relayerFee.toString() !== request.relayerFee) {
|
|
123
|
+
throw new Error('relayer fee mismatch');
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
static async quoteRelayer(chain, from, to) {
|
|
127
|
+
if (isNative(from) || isNative(to))
|
|
128
|
+
throw new Error('how did you get here tho?');
|
|
129
|
+
const sourceToken = encoding.hex.encode(from.toUniversalAddress().toUint8Array(), false);
|
|
130
|
+
const targetToken = encoding.hex.encode(to.toUniversalAddress().toUint8Array(), false);
|
|
131
|
+
const targetChain = toChainId(chain);
|
|
132
|
+
const request = { targetChain, sourceToken, targetToken };
|
|
133
|
+
try {
|
|
134
|
+
const response = await axios.post(RELAYER_FEE_API_URL, request);
|
|
135
|
+
return BigInt(response.data.fee);
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
if (axios.isAxiosError(e)) {
|
|
139
|
+
throw new Error(`Error getting relayer fee: ${e.response?.statusText}`);
|
|
140
|
+
}
|
|
141
|
+
throw e;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AccountAddress, ChainAddress, ChainsConfig, Contracts, Network, Platform, PorticoBridge, TokenAddress, TokenId } from '@wormhole-foundation/sdk-connect';
|
|
2
|
+
import { EvmChains, EvmUnsignedTransaction } from '@wormhole-foundation/sdk-evm';
|
|
3
|
+
import { Provider, ethers } from 'ethers';
|
|
4
|
+
import { EvmWormholeCore } from '@wormhole-foundation/sdk-evm-core';
|
|
5
|
+
import '@wormhole-foundation/sdk-evm-tokenbridge';
|
|
6
|
+
export declare class EvmPorticoBridge<N extends Network, C extends EvmChains = EvmChains> implements PorticoBridge<N, C> {
|
|
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, quote: PorticoBridge.Quote): AsyncGenerator<EvmUnsignedTransaction<N, C>, void, unknown>;
|
|
20
|
+
redeem(sender: AccountAddress<C>, vaa: PorticoBridge.VAA): AsyncGenerator<EvmUnsignedTransaction<N, C>, void, unknown>;
|
|
21
|
+
quoteSwap(input: TokenAddress<C>, output: TokenAddress<C>, amount: bigint): Promise<bigint>;
|
|
22
|
+
quoteRelay(startToken: TokenAddress<C>, endToken: TokenAddress<C>): Promise<bigint>;
|
|
23
|
+
getTransferrableToken(address: string): TokenId;
|
|
24
|
+
private approve;
|
|
25
|
+
private createUnsignedTransaction;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=bridge.d.ts.map
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@wormhole-foundation/sdk-evm-portico",
|
|
3
|
+
"version": "0.5.0-alpha.0",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "git+https://github.com/wormhole-foundation/connect-sdk.git"
|
|
7
|
+
},
|
|
8
|
+
"bugs": {
|
|
9
|
+
"url": "https://github.com/wormhole-foundation/connect-sdk/issues"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/wormhole-foundation/connect-sdk#readme",
|
|
12
|
+
"directories": {
|
|
13
|
+
"test": "tests"
|
|
14
|
+
},
|
|
15
|
+
"license": "Apache-2.0",
|
|
16
|
+
"main": "./dist/cjs/index.js",
|
|
17
|
+
"module": "./dist/esm/index.js",
|
|
18
|
+
"types": "./dist/cjs/index.d.ts",
|
|
19
|
+
"author": "",
|
|
20
|
+
"description": "SDK for EVM chains, used in conjunction with @wormhole-foundation/sdk",
|
|
21
|
+
"files": [
|
|
22
|
+
"dist/cjs",
|
|
23
|
+
"dist/esm"
|
|
24
|
+
],
|
|
25
|
+
"keywords": [
|
|
26
|
+
"wormhole",
|
|
27
|
+
"sdk",
|
|
28
|
+
"typescript",
|
|
29
|
+
"connect",
|
|
30
|
+
"ethereum",
|
|
31
|
+
"moonbeam",
|
|
32
|
+
"celo",
|
|
33
|
+
"polygon",
|
|
34
|
+
"fantom",
|
|
35
|
+
"avalanche",
|
|
36
|
+
"bsc",
|
|
37
|
+
"evm"
|
|
38
|
+
],
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=16"
|
|
41
|
+
},
|
|
42
|
+
"sideEffects": true,
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build:cjs": "tsc -p ./tsconfig.cjs.json",
|
|
45
|
+
"build:esm": "tsc -p ./tsconfig.esm.json",
|
|
46
|
+
"build": "npm run build:cjs && npm run build:esm",
|
|
47
|
+
"rebuild": "npm run clean && npm run build",
|
|
48
|
+
"clean": "rm -rf ./dist && rm -rf ./.turbo",
|
|
49
|
+
"lint": "npm run prettier && eslint --fix",
|
|
50
|
+
"prettier": "prettier --write ./src"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@wormhole-foundation/sdk-connect": "0.5.0-alpha.0",
|
|
54
|
+
"@wormhole-foundation/sdk-evm": "0.5.0-alpha.0",
|
|
55
|
+
"@wormhole-foundation/sdk-evm-core": "0.5.0-alpha.0",
|
|
56
|
+
"@wormhole-foundation/sdk-evm-tokenbridge": "0.5.0-alpha.0",
|
|
57
|
+
"typechain": "^8.2.0",
|
|
58
|
+
"ethers": "^6.5.1",
|
|
59
|
+
"@typechain/ethers-v6": "^0.4.0"
|
|
60
|
+
}
|
|
61
|
+
}
|