@kaspacom/swap-sdk 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/dist/{controllers → cjs/controllers}/swap-sdk.controller.d.ts +1 -0
- package/dist/cjs/controllers/swap-sdk.controller.d.ts.map +1 -0
- package/dist/cjs/controllers/swap-sdk.controller.js +181 -0
- package/dist/cjs/controllers/swap-sdk.controller.js.map +1 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +53 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/{services → cjs/services}/swap.service.d.ts +7 -1
- package/dist/cjs/services/swap.service.d.ts.map +1 -0
- package/dist/cjs/services/swap.service.js +568 -0
- package/dist/cjs/services/swap.service.js.map +1 -0
- package/dist/cjs/services/wallet.service.d.ts.map +1 -0
- package/dist/cjs/services/wallet.service.js +144 -0
- package/dist/cjs/services/wallet.service.js.map +1 -0
- package/dist/cjs/types/index.d.ts.map +1 -0
- package/dist/cjs/types/index.js +10 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/networks.d.ts.map +1 -0
- package/dist/cjs/types/networks.js +23 -0
- package/dist/cjs/types/networks.js.map +1 -0
- package/dist/esm/controllers/swap-sdk.controller.d.ts +27 -0
- package/dist/esm/controllers/swap-sdk.controller.d.ts.map +1 -0
- package/dist/{controllers → esm/controllers}/swap-sdk.controller.js +8 -0
- package/dist/esm/controllers/swap-sdk.controller.js.map +1 -0
- package/dist/esm/index.d.ts +15 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/services/swap.service.d.ts +109 -0
- package/dist/esm/services/swap.service.d.ts.map +1 -0
- package/dist/{services → esm/services}/swap.service.js +17 -3
- package/dist/esm/services/swap.service.js.map +1 -0
- package/dist/esm/services/wallet.service.d.ts +21 -0
- package/dist/esm/services/wallet.service.d.ts.map +1 -0
- package/dist/esm/services/wallet.service.js.map +1 -0
- package/dist/esm/types/index.d.ts +71 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/networks.d.ts +14 -0
- package/dist/esm/types/networks.d.ts.map +1 -0
- package/dist/esm/types/networks.js.map +1 -0
- package/package.json +14 -6
- package/dist/controllers/swap-sdk.controller.d.ts.map +0 -1
- package/dist/controllers/swap-sdk.controller.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/services/swap.service.d.ts.map +0 -1
- package/dist/services/swap.service.js.map +0 -1
- package/dist/services/wallet.service.d.ts.map +0 -1
- package/dist/services/wallet.service.js.map +0 -1
- package/dist/swap-sdk.js +0 -33099
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/types/networks.d.ts.map +0 -1
- package/dist/types/networks.js.map +0 -1
- /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
- /package/dist/{services → cjs/services}/wallet.service.d.ts +0 -0
- /package/dist/{types → cjs/types}/index.d.ts +0 -0
- /package/dist/{types → cjs/types}/networks.d.ts +0 -0
- /package/dist/{index.js → esm/index.js} +0 -0
- /package/dist/{services → esm/services}/wallet.service.js +0 -0
- /package/dist/{types → esm/types}/index.js +0 -0
- /package/dist/{types → esm/types}/networks.js +0 -0
package/README.md
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
A lightweight, headless swap SDK for Kaspa DeFi powered by Uniswap V2. Build your own UI and use the SDK to handle quotes, approvals, and swaps.
|
|
4
4
|
|
|
5
|
+
# Examples
|
|
6
|
+
You can find some examples of how to use the SDK in the [swap-sdk-examples](https://github.com/KASPACOM/swap-sdk-examples) repository.
|
|
7
|
+
|
|
5
8
|
|
|
6
9
|
## Features
|
|
7
10
|
|
|
@@ -17,6 +17,7 @@ export declare class SwapSdkController {
|
|
|
17
17
|
private get settings();
|
|
18
18
|
calculateQuoteIfNeeded(): Promise<void>;
|
|
19
19
|
setData(input: Partial<SwapControllerInput>): Promise<SwapControllerOutput>;
|
|
20
|
+
isNeedApproval(): Promise<boolean>;
|
|
20
21
|
approveIfNeeded(): Promise<string | undefined>;
|
|
21
22
|
swap(): Promise<string>;
|
|
22
23
|
getPartnerFee(): Promise<number>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap-sdk.controller.d.ts","sourceRoot":"","sources":["../../../src/controllers/swap-sdk.controller.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EAEpB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAEzC,eAAO,MAAM,gBAAgB,EAAE,YAG9B,CAAA;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,WAAW,CAA0B;IAE7C,OAAO,CAAC,KAAK,CAEX;IAIF,OAAO,CAAC,KAAK,CAMX;IAIF,OAAO,CAAC,OAAO,CAAiB;gBAEpB,OAAO,EAAE,cAAc;IAMnC,OAAO,CAAC,YAAY;YAaN,SAAS;IAWjB,aAAa,CAAC,gBAAgB,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAOxE,gBAAgB,IAAI,IAAI;IAKxB,QAAQ,IAAI,oBAAoB;IAIhC,OAAO,KAAK,QAAQ,GAKnB;IAGK,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BvC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAY3E,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAOlC,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAmC9C,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IA2DvB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAKhC,kBAAkB,CAAC,KAAK,GAAE,MAAY,EAAE,MAAM,CAAC,EAAE,MAAM;IAQ7D,IAAI,oBAAoB,IAAI,oBAAoB,CAE/C;CACF"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SwapSdkController = exports.DEFAULT_SETTINGS = void 0;
|
|
4
|
+
const wallet_service_1 = require("../services/wallet.service");
|
|
5
|
+
const swap_service_1 = require("../services/swap.service");
|
|
6
|
+
const types_1 = require("../types");
|
|
7
|
+
exports.DEFAULT_SETTINGS = {
|
|
8
|
+
maxSlippage: '0.5',
|
|
9
|
+
swapDeadline: 20,
|
|
10
|
+
};
|
|
11
|
+
class SwapSdkController {
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.state = {
|
|
14
|
+
loader: null,
|
|
15
|
+
};
|
|
16
|
+
this.input = {
|
|
17
|
+
fromToken: null,
|
|
18
|
+
toToken: null,
|
|
19
|
+
amount: undefined,
|
|
20
|
+
isOutputAmount: false,
|
|
21
|
+
settings: exports.DEFAULT_SETTINGS,
|
|
22
|
+
};
|
|
23
|
+
this.options = options;
|
|
24
|
+
this.initServices();
|
|
25
|
+
}
|
|
26
|
+
initServices() {
|
|
27
|
+
this.walletService = new wallet_service_1.WalletService(this.options.networkConfig, this.options.walletProvider);
|
|
28
|
+
this.swapService = new swap_service_1.SwapService(this.walletService.getProvider(), this.options.networkConfig, this.options);
|
|
29
|
+
}
|
|
30
|
+
async setChange(patch) {
|
|
31
|
+
const next = {
|
|
32
|
+
...this.state,
|
|
33
|
+
...patch,
|
|
34
|
+
};
|
|
35
|
+
this.state = next;
|
|
36
|
+
if (typeof this.options.onChange === 'function') {
|
|
37
|
+
await this.options.onChange(next, patch);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async connectWallet(injectedProvider) {
|
|
41
|
+
const address = await this.walletService.connect(injectedProvider);
|
|
42
|
+
const signer = this.walletService.getSigner();
|
|
43
|
+
if (signer)
|
|
44
|
+
this.swapService.setSigner(signer);
|
|
45
|
+
return address;
|
|
46
|
+
}
|
|
47
|
+
disconnectWallet() {
|
|
48
|
+
this.walletService.disconnect();
|
|
49
|
+
this.swapService.setSigner(null);
|
|
50
|
+
}
|
|
51
|
+
getState() {
|
|
52
|
+
return this.state;
|
|
53
|
+
}
|
|
54
|
+
get settings() {
|
|
55
|
+
return {
|
|
56
|
+
...exports.DEFAULT_SETTINGS,
|
|
57
|
+
...(this.input.settings || {}),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async calculateQuoteIfNeeded() {
|
|
61
|
+
const { fromToken, toToken, amount, isOutputAmount } = this.input;
|
|
62
|
+
if (!fromToken || !toToken || !amount || amount <= 0) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Set loader to calculating
|
|
66
|
+
await this.setChange({ loader: types_1.LoaderStatuses.CALCULATING_QUOTE, error: undefined });
|
|
67
|
+
try {
|
|
68
|
+
// Use the calculateTrade method which returns both trade and computed amounts
|
|
69
|
+
const tradeResult = await this.swapService.calculateTrade(fromToken, toToken, String(amount), isOutputAmount == true, // isOutputAmount: true for input amount, false for output amount
|
|
70
|
+
this.settings.maxSlippage);
|
|
71
|
+
await this.setChange({
|
|
72
|
+
computed: tradeResult.computed,
|
|
73
|
+
tradeInfo: tradeResult.trade,
|
|
74
|
+
loader: null,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
await this.setChange({ error: error?.message || String(error), loader: null });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async setData(input) {
|
|
82
|
+
// Merge input and settings
|
|
83
|
+
this.input = {
|
|
84
|
+
...this.input,
|
|
85
|
+
...input,
|
|
86
|
+
};
|
|
87
|
+
await this.calculateQuoteIfNeeded();
|
|
88
|
+
return this.getState();
|
|
89
|
+
}
|
|
90
|
+
async isNeedApproval() {
|
|
91
|
+
if (!this.input || !this.walletService.isConnected() || !this.swapService)
|
|
92
|
+
throw new Error('Wallet not connected or input missing');
|
|
93
|
+
const { fromToken, amount } = this.input;
|
|
94
|
+
if (!fromToken || amount === undefined || !this.state.computed?.amountInRaw)
|
|
95
|
+
throw new Error('fromToken or amount missing');
|
|
96
|
+
return (await this.swapService.isApprovalNeeded(fromToken, BigInt(this.state.computed.amountInRaw))).isApprovalNeeded;
|
|
97
|
+
}
|
|
98
|
+
async approveIfNeeded() {
|
|
99
|
+
if (!this.input || !this.walletService.isConnected())
|
|
100
|
+
throw new Error('Wallet not connected or input missing');
|
|
101
|
+
const { fromToken, amount } = this.input;
|
|
102
|
+
if (!fromToken || amount === undefined || !this.state.computed?.amountInRaw)
|
|
103
|
+
throw new Error('fromToken or amount missing');
|
|
104
|
+
await this.setChange({ loader: types_1.LoaderStatuses.APPROVING });
|
|
105
|
+
try {
|
|
106
|
+
const tx = await this.swapService?.approveIfNeedApproval(fromToken, BigInt(this.state.computed.amountInRaw));
|
|
107
|
+
let receipt;
|
|
108
|
+
if (tx) {
|
|
109
|
+
await this.setChange({ approveTxHash: tx.hash });
|
|
110
|
+
receipt = await tx.wait();
|
|
111
|
+
if (!receipt) {
|
|
112
|
+
throw new Error("Receipt not found, Please try again");
|
|
113
|
+
}
|
|
114
|
+
if (receipt.status != 1) {
|
|
115
|
+
throw new Error("Transaction Rejected");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return receipt?.hash;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
await this.setChange({ error: error?.message || String(error), loader: null });
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async swap() {
|
|
126
|
+
try {
|
|
127
|
+
await this.setChange({
|
|
128
|
+
txHash: undefined,
|
|
129
|
+
approveTxHash: undefined,
|
|
130
|
+
});
|
|
131
|
+
const { fromToken, toToken, amount } = this.input;
|
|
132
|
+
if (!fromToken || !toToken || amount === undefined)
|
|
133
|
+
throw new Error('Tokens or amount not set');
|
|
134
|
+
await this.approveIfNeeded();
|
|
135
|
+
await this.setChange({ loader: types_1.LoaderStatuses.SWAPPING });
|
|
136
|
+
// Get the trade path from the tradeInfo
|
|
137
|
+
const trade = this.state.tradeInfo;
|
|
138
|
+
if (!trade)
|
|
139
|
+
throw new Error('Trade info missing - calculate quote first');
|
|
140
|
+
// Extract path from the trade route
|
|
141
|
+
const path = trade.route.path.map(token => token.address);
|
|
142
|
+
if (path.length === 0)
|
|
143
|
+
throw new Error('Trade path missing');
|
|
144
|
+
// Use the computed amounts for the swap
|
|
145
|
+
const computed = this.state.computed;
|
|
146
|
+
if (!computed)
|
|
147
|
+
throw new Error('Computed amounts missing');
|
|
148
|
+
const transaction = await this.swapService.swapTokens(fromToken, toToken, computed.maxAmountInRaw || computed.amountInRaw, computed.minAmountOutRaw || computed.amountOutRaw, path, this.input.isOutputAmount == true, this.settings.swapDeadline);
|
|
149
|
+
await this.setChange({ txHash: transaction.hash });
|
|
150
|
+
const receipt = await transaction.wait();
|
|
151
|
+
if (!receipt) {
|
|
152
|
+
throw new Error("Receipt not found, Please try again");
|
|
153
|
+
}
|
|
154
|
+
if (receipt.status != 1) {
|
|
155
|
+
throw new Error("Transaction Rejected");
|
|
156
|
+
}
|
|
157
|
+
await this.setChange({
|
|
158
|
+
loader: null,
|
|
159
|
+
});
|
|
160
|
+
return receipt.hash;
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
await this.setChange({ error: error?.message || String(error), loader: null });
|
|
164
|
+
throw error;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async getPartnerFee() {
|
|
168
|
+
return Number(await this.swapService.loadPartnerFee()) / Number(swap_service_1.PARTNER_FEE_BPS_DIVISOR);
|
|
169
|
+
}
|
|
170
|
+
async getTokensFromGraph(limit = 100, search) {
|
|
171
|
+
if (!this.swapService) {
|
|
172
|
+
throw new Error('Swap Service not exists');
|
|
173
|
+
}
|
|
174
|
+
return await this.swapService.getTokensFromGraph(limit, search);
|
|
175
|
+
}
|
|
176
|
+
get currentNetworkConfig() {
|
|
177
|
+
return this.options.networkConfig;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
exports.SwapSdkController = SwapSdkController;
|
|
181
|
+
//# sourceMappingURL=swap-sdk.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap-sdk.controller.js","sourceRoot":"","sources":["../../../src/controllers/swap-sdk.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAGtE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,gBAAgB,IAAI,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE9F;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,cAAc,GAAG,iBAAiB,CAWvF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
exports.DEFAULT_SWAP_SETTINGS = exports.NETWORKS = exports.SwapSdkController = exports.SwapService = exports.WalletService = void 0;
|
|
18
|
+
exports.createKaspaComSwapController = createKaspaComSwapController;
|
|
19
|
+
// Export types
|
|
20
|
+
__exportStar(require("./types"), exports);
|
|
21
|
+
// Export services
|
|
22
|
+
var wallet_service_1 = require("./services/wallet.service");
|
|
23
|
+
Object.defineProperty(exports, "WalletService", { enumerable: true, get: function () { return wallet_service_1.WalletService; } });
|
|
24
|
+
var swap_service_1 = require("./services/swap.service");
|
|
25
|
+
Object.defineProperty(exports, "SwapService", { enumerable: true, get: function () { return swap_service_1.SwapService; } });
|
|
26
|
+
// Export headless controller only
|
|
27
|
+
const swap_sdk_controller_1 = require("./controllers/swap-sdk.controller");
|
|
28
|
+
var swap_sdk_controller_2 = require("./controllers/swap-sdk.controller");
|
|
29
|
+
Object.defineProperty(exports, "SwapSdkController", { enumerable: true, get: function () { return swap_sdk_controller_2.SwapSdkController; } });
|
|
30
|
+
const networks_1 = require("./types/networks");
|
|
31
|
+
var networks_2 = require("./types/networks");
|
|
32
|
+
Object.defineProperty(exports, "NETWORKS", { enumerable: true, get: function () { return networks_2.NETWORKS; } });
|
|
33
|
+
var swap_sdk_controller_3 = require("./controllers/swap-sdk.controller");
|
|
34
|
+
Object.defineProperty(exports, "DEFAULT_SWAP_SETTINGS", { enumerable: true, get: function () { return swap_sdk_controller_3.DEFAULT_SETTINGS; } });
|
|
35
|
+
/**
|
|
36
|
+
* Create a new headless swap controller
|
|
37
|
+
* @param options Configuration options for the controller
|
|
38
|
+
* @returns SwapSdkController instance
|
|
39
|
+
*/
|
|
40
|
+
function createKaspaComSwapController(options) {
|
|
41
|
+
let resolvedOptions;
|
|
42
|
+
if ('networkConfig' in options && typeof options.networkConfig === 'string') {
|
|
43
|
+
const networkConfig = networks_1.NETWORKS[options.networkConfig];
|
|
44
|
+
if (!networkConfig)
|
|
45
|
+
throw new Error(`Unknown network key: ${options.networkConfig}`);
|
|
46
|
+
resolvedOptions = { ...options, networkConfig };
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
resolvedOptions = options;
|
|
50
|
+
}
|
|
51
|
+
return new swap_sdk_controller_1.SwapSdkController(resolvedOptions);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAuBA,oEAWC;AAlCD,eAAe;AACf,0CAAwB;AAExB,kBAAkB;AAClB,4DAA0D;AAAjD,+GAAA,aAAa,OAAA;AACtB,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AAEpB,kCAAkC;AAClC,2EAAsE;AACtE,yEAAsE;AAA7D,wHAAA,iBAAiB,OAAA;AAI1B,+CAA4C;AAC5C,6CAA2C;AAAlC,oGAAA,QAAQ,OAAA;AAEjB,yEAA8F;AAArF,4HAAA,gBAAgB,OAAyB;AAElD;;;;GAIG;AACH,SAAgB,4BAA4B,CAAC,OAAuB;IAClE,IAAI,eAA+B,CAAC;IACpC,IAAI,eAAe,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QAC5E,MAAM,aAAa,GAAG,mBAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACtD,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACrF,eAAe,GAAG,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,eAAe,GAAG,OAAyB,CAAC;IAC9C,CAAC;IAED,OAAO,IAAI,uCAAiB,CAAC,eAAe,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Signer, BrowserProvider, JsonRpcProvider, ContractTransactionResponse, TransactionResponse } from 'ethers';
|
|
1
|
+
import { Contract, Signer, BrowserProvider, JsonRpcProvider, ContractTransactionResponse, TransactionResponse } from 'ethers';
|
|
2
2
|
import { Currency, Token, TradeType } from '@uniswap/sdk-core';
|
|
3
3
|
import { Trade, Pair } from '@uniswap/v2-sdk';
|
|
4
4
|
import { ComputedAmounts, Erc20Token, SwapSdkOptions } from '../types';
|
|
@@ -80,6 +80,12 @@ export declare class SwapService {
|
|
|
80
80
|
computed: ComputedAmounts;
|
|
81
81
|
}>;
|
|
82
82
|
checkApproval(tokenAddress: string, amount: string, spenderAddress: string): Promise<boolean>;
|
|
83
|
+
isApprovalNeeded(fromToken: Erc20Token, amountInWei: bigint): Promise<{
|
|
84
|
+
isApprovalNeeded: boolean;
|
|
85
|
+
tokenContract?: Contract;
|
|
86
|
+
signerAddress?: string;
|
|
87
|
+
allowanceTo?: string;
|
|
88
|
+
}>;
|
|
83
89
|
approveIfNeedApproval(fromToken: Erc20Token, amountInWei: bigint): Promise<ContractTransactionResponse | null>;
|
|
84
90
|
swapTokens(fromToken: Erc20Token, toToken: Erc20Token, amountInWei: string, amountOutWei: string, path: string[], isOutputAmount: boolean, deadline: number): Promise<TransactionResponse>;
|
|
85
91
|
getPairAddress(tokenA: string, tokenB: string): Promise<string>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.service.d.ts","sourceRoot":"","sources":["../../../src/services/swap.service.ts"],"names":[],"mappings":"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"}
|