@enkryptcom/swap 0.0.4 → 0.0.5
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/index.cjs +2 -1
- package/dist/index.js +2 -1
- package/package.json +14 -13
- package/src/index.ts +0 -270
package/dist/index.cjs
CHANGED
|
@@ -1924,7 +1924,8 @@ var Changelly = /*#__PURE__*/ function(ProviderClass) {
|
|
|
1924
1924
|
if (!supportedChangellyNames.has(cur.blockchain)) {
|
|
1925
1925
|
return;
|
|
1926
1926
|
}
|
|
1927
|
-
if (cur.enabledFrom && cur.fixRateEnabled
|
|
1927
|
+
if (cur.enabledFrom && (cur.fixRateEnabled || cur.protocol === "RBTC") && // Allow RBTC as native currency for gas fees and swaps
|
|
1928
|
+
cur.token && changellyToNetwork[cur.blockchain] === _this.network) {
|
|
1928
1929
|
_this.fromTokens[cur.token.address] = cur.token;
|
|
1929
1930
|
}
|
|
1930
1931
|
if (cur.enabledTo && cur.fixRateEnabled && cur.token) {
|
package/dist/index.js
CHANGED
|
@@ -1824,7 +1824,8 @@ var Changelly = /*#__PURE__*/ function(ProviderClass) {
|
|
|
1824
1824
|
if (!supportedChangellyNames.has(cur.blockchain)) {
|
|
1825
1825
|
return;
|
|
1826
1826
|
}
|
|
1827
|
-
if (cur.enabledFrom && cur.fixRateEnabled
|
|
1827
|
+
if (cur.enabledFrom && (cur.fixRateEnabled || cur.protocol === "RBTC") && // Allow RBTC as native currency for gas fees and swaps
|
|
1828
|
+
cur.token && changellyToNetwork[cur.blockchain] === _this.network) {
|
|
1828
1829
|
_this.fromTokens[cur.token.address] = cur.token;
|
|
1829
1830
|
}
|
|
1830
1831
|
if (cur.enabledTo && cur.fixRateEnabled && cur.token) {
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enkryptcom/swap",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "Swap library for enkrypt",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "
|
|
7
|
-
"module": "
|
|
6
|
+
"main": "dist/index.cjs",
|
|
7
|
+
"module": "dist/index.js",
|
|
8
8
|
"publishConfig": {
|
|
9
9
|
"main": "dist/index.cjs",
|
|
10
10
|
"module": "dist/index.js",
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"node": ">=14.15.0"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@enkryptcom/types": "
|
|
26
|
-
"@enkryptcom/utils": "
|
|
25
|
+
"@enkryptcom/types": "^0.0.6",
|
|
26
|
+
"@enkryptcom/utils": "^0.0.6",
|
|
27
27
|
"@solana/spl-token": "^0.4.13",
|
|
28
28
|
"@solana/web3.js": "^1.98.2",
|
|
29
29
|
"bignumber.js": "^9.3.0",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"isomorphic-ws": "^5.0.0",
|
|
32
32
|
"json-rpc-2.0": "^1.7.0",
|
|
33
33
|
"lodash": "^4.17.21",
|
|
34
|
-
"rango-sdk-basic": "^0.1.
|
|
34
|
+
"rango-sdk-basic": "^0.1.69",
|
|
35
35
|
"reconnecting-websocket": "^4.4.0",
|
|
36
36
|
"uuid": "^11.1.0",
|
|
37
37
|
"web3-eth": "^1.10.4",
|
|
@@ -40,9 +40,9 @@
|
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/node": "^22.15.24",
|
|
43
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
44
|
-
"@typescript-eslint/parser": "^8.
|
|
45
|
-
"eslint": "^9.
|
|
43
|
+
"@typescript-eslint/eslint-plugin": "^8.34.1",
|
|
44
|
+
"@typescript-eslint/parser": "^8.34.1",
|
|
45
|
+
"eslint": "^9.29.0",
|
|
46
46
|
"eslint-config-airbnb-base": "^15.0.0",
|
|
47
47
|
"eslint-config-prettier": "^10.1.5",
|
|
48
48
|
"eslint-import-resolver-alias": "^1.1.2",
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"tsconfig-paths": "^4.2.0",
|
|
54
54
|
"tsup": "^8.5.0",
|
|
55
55
|
"typescript": "^5.8.3",
|
|
56
|
-
"typescript-eslint": "8.
|
|
57
|
-
"vitest": "^3.
|
|
56
|
+
"typescript-eslint": "8.34.1",
|
|
57
|
+
"vitest": "^3.2.3"
|
|
58
58
|
},
|
|
59
59
|
"repository": {
|
|
60
60
|
"type": "git",
|
|
@@ -62,5 +62,6 @@
|
|
|
62
62
|
},
|
|
63
63
|
"keywords": [],
|
|
64
64
|
"author": "kvhnuke",
|
|
65
|
-
"license": "MIT"
|
|
66
|
-
|
|
65
|
+
"license": "MIT",
|
|
66
|
+
"types": "dist/index.d.ts"
|
|
67
|
+
}
|
package/src/index.ts
DELETED
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
import { merge } from "lodash";
|
|
2
|
-
import EventEmitter from "eventemitter3";
|
|
3
|
-
import type Web3Eth from "web3-eth";
|
|
4
|
-
import type { Connection as Web3Solana } from "@solana/web3.js";
|
|
5
|
-
import { TOKEN_LISTS, TOP_TOKEN_INFO_LIST } from "./configs";
|
|
6
|
-
import OneInch from "./providers/oneInch";
|
|
7
|
-
import Paraswap from "./providers/paraswap";
|
|
8
|
-
import Changelly from "./providers/changelly";
|
|
9
|
-
import ZeroX from "./providers/zerox";
|
|
10
|
-
import Rango from "./providers/rango";
|
|
11
|
-
import NetworkDetails, {
|
|
12
|
-
isSupportedNetwork,
|
|
13
|
-
getSupportedNetworks,
|
|
14
|
-
getNetworkInfoByName,
|
|
15
|
-
} from "./common/supportedNetworks";
|
|
16
|
-
import type {
|
|
17
|
-
APIType,
|
|
18
|
-
EvmOptions,
|
|
19
|
-
FromTokenType,
|
|
20
|
-
getQuoteOptions,
|
|
21
|
-
NetworkInfo,
|
|
22
|
-
ProviderFromTokenResponse,
|
|
23
|
-
ProviderQuoteResponse,
|
|
24
|
-
ProviderSwapResponse,
|
|
25
|
-
ProviderToTokenResponse,
|
|
26
|
-
SwapOptions,
|
|
27
|
-
SwapQuote,
|
|
28
|
-
TokenType,
|
|
29
|
-
TokenTypeTo,
|
|
30
|
-
TopTokenInfo,
|
|
31
|
-
ToTokenType,
|
|
32
|
-
GenericTransaction,
|
|
33
|
-
SolanaTransaction,
|
|
34
|
-
EVMTransaction,
|
|
35
|
-
StatusOptionsResponse,
|
|
36
|
-
StatusOptions,
|
|
37
|
-
ProviderClass,
|
|
38
|
-
} from "./types";
|
|
39
|
-
import {
|
|
40
|
-
SupportedNetworkName,
|
|
41
|
-
Events,
|
|
42
|
-
WalletIdentifier,
|
|
43
|
-
NetworkType,
|
|
44
|
-
TransactionType,
|
|
45
|
-
TransactionStatus,
|
|
46
|
-
} from "./types";
|
|
47
|
-
import { sortByRank, sortNativeToFront } from "./utils/common";
|
|
48
|
-
import SwapToken from "./swapToken";
|
|
49
|
-
import { Jupiter } from "./providers/jupiter";
|
|
50
|
-
|
|
51
|
-
class Swap extends EventEmitter {
|
|
52
|
-
network: SupportedNetworkName;
|
|
53
|
-
|
|
54
|
-
evmOptions: EvmOptions;
|
|
55
|
-
|
|
56
|
-
private api: APIType;
|
|
57
|
-
|
|
58
|
-
initPromise: Promise<void>;
|
|
59
|
-
|
|
60
|
-
private providers: ProviderClass[];
|
|
61
|
-
|
|
62
|
-
private tokenList: FromTokenType;
|
|
63
|
-
|
|
64
|
-
private topTokenInfo: TopTokenInfo;
|
|
65
|
-
|
|
66
|
-
private fromTokens: FromTokenType;
|
|
67
|
-
|
|
68
|
-
private toTokens: ToTokenType;
|
|
69
|
-
|
|
70
|
-
private walletId: WalletIdentifier;
|
|
71
|
-
|
|
72
|
-
constructor(options: SwapOptions) {
|
|
73
|
-
super();
|
|
74
|
-
this.network = options.network;
|
|
75
|
-
this.evmOptions = options.evmOptions
|
|
76
|
-
? options.evmOptions
|
|
77
|
-
: { infiniteApproval: true };
|
|
78
|
-
this.api = options.api;
|
|
79
|
-
this.walletId = options.walletIdentifier;
|
|
80
|
-
this.topTokenInfo = {
|
|
81
|
-
contractsToId: {},
|
|
82
|
-
topTokens: {},
|
|
83
|
-
trendingTokens: {},
|
|
84
|
-
};
|
|
85
|
-
this.tokenList = {
|
|
86
|
-
all: [],
|
|
87
|
-
top: [],
|
|
88
|
-
trending: [],
|
|
89
|
-
};
|
|
90
|
-
this.toTokens = {
|
|
91
|
-
all: {},
|
|
92
|
-
top: {},
|
|
93
|
-
trending: {},
|
|
94
|
-
};
|
|
95
|
-
this.fromTokens = {
|
|
96
|
-
all: [],
|
|
97
|
-
top: [],
|
|
98
|
-
trending: [],
|
|
99
|
-
};
|
|
100
|
-
this.initPromise = this.init();
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
private async init() {
|
|
104
|
-
if (TOKEN_LISTS[this.network]) {
|
|
105
|
-
this.tokenList = await fetch(TOKEN_LISTS[this.network]).then((res) =>
|
|
106
|
-
res.json(),
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
this.topTokenInfo = await fetch(TOP_TOKEN_INFO_LIST).then((res) =>
|
|
111
|
-
res.json(),
|
|
112
|
-
);
|
|
113
|
-
|
|
114
|
-
// TODO: use network type instead?
|
|
115
|
-
switch (this.network) {
|
|
116
|
-
case SupportedNetworkName.Solana:
|
|
117
|
-
// Solana
|
|
118
|
-
this.providers = [
|
|
119
|
-
new Jupiter(this.api as Web3Solana, this.network),
|
|
120
|
-
new Rango(this.api as Web3Solana, this.network),
|
|
121
|
-
new Changelly(this.api, this.network),
|
|
122
|
-
];
|
|
123
|
-
break;
|
|
124
|
-
default:
|
|
125
|
-
// EVM
|
|
126
|
-
this.providers = [
|
|
127
|
-
new OneInch(this.api as Web3Eth, this.network),
|
|
128
|
-
new Paraswap(this.api as Web3Eth, this.network),
|
|
129
|
-
new Changelly(this.api, this.network),
|
|
130
|
-
new ZeroX(this.api as Web3Eth, this.network),
|
|
131
|
-
new Rango(this.api as Web3Eth, this.network),
|
|
132
|
-
];
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
await Promise.all(
|
|
137
|
-
this.providers.map((Provider) => Provider.init(this.tokenList.all)),
|
|
138
|
-
);
|
|
139
|
-
const allFromTokens: ProviderFromTokenResponse = {};
|
|
140
|
-
[...this.providers].reverse().forEach((p) => {
|
|
141
|
-
Object.assign(allFromTokens, p.getFromTokens());
|
|
142
|
-
});
|
|
143
|
-
this.fromTokens = {
|
|
144
|
-
all: Object.values(allFromTokens).sort(sortNativeToFront),
|
|
145
|
-
top: this.tokenList.top.filter((topt) => !!allFromTokens[topt.address]),
|
|
146
|
-
trending: this.tokenList.trending.filter(
|
|
147
|
-
(trendt) => !!allFromTokens[trendt.address],
|
|
148
|
-
),
|
|
149
|
-
};
|
|
150
|
-
const native = this.fromTokens.all.shift();
|
|
151
|
-
this.fromTokens.all.sort(sortByRank);
|
|
152
|
-
if (native) this.fromTokens.all.unshift(native);
|
|
153
|
-
const allToTokens: ProviderToTokenResponse = {};
|
|
154
|
-
[...this.providers].reverse().forEach((p) => {
|
|
155
|
-
merge(allToTokens, p.getToTokens());
|
|
156
|
-
});
|
|
157
|
-
Object.keys(allToTokens).forEach((nName) => {
|
|
158
|
-
const values = Object.values(allToTokens[nName]);
|
|
159
|
-
values.sort(sortNativeToFront);
|
|
160
|
-
const nativeTo = values.shift();
|
|
161
|
-
values.sort(sortByRank);
|
|
162
|
-
if (nativeTo) values.unshift(nativeTo);
|
|
163
|
-
values.forEach((val: TokenTypeTo) => {
|
|
164
|
-
if (val.cgId && this.topTokenInfo.topTokens[val.cgId]) {
|
|
165
|
-
if (!this.toTokens.top[nName]) this.toTokens.top[nName] = [];
|
|
166
|
-
this.toTokens.top[nName].push({
|
|
167
|
-
...val,
|
|
168
|
-
rank: this.topTokenInfo.topTokens[val.cgId].rank,
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
if (val.cgId && this.topTokenInfo.trendingTokens[val.cgId]) {
|
|
172
|
-
if (!this.toTokens.trending[nName])
|
|
173
|
-
this.toTokens.trending[nName] = [];
|
|
174
|
-
this.toTokens.trending[nName].push({
|
|
175
|
-
...val,
|
|
176
|
-
rank: this.topTokenInfo.trendingTokens[val.cgId],
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
if (this.toTokens.top[nName]) this.toTokens.top[nName].sort(sortByRank);
|
|
181
|
-
if (this.toTokens.trending[nName])
|
|
182
|
-
this.toTokens.trending[nName].sort(sortByRank);
|
|
183
|
-
this.toTokens.all[nName] = values;
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
getFromTokens() {
|
|
188
|
-
return this.fromTokens;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
getToTokens() {
|
|
192
|
-
return this.toTokens;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Request a quote from each provider
|
|
197
|
-
*
|
|
198
|
-
* Only providers that support the network will respond
|
|
199
|
-
*/
|
|
200
|
-
async getQuotes(
|
|
201
|
-
options: getQuoteOptions,
|
|
202
|
-
context?: { signal?: AbortSignal },
|
|
203
|
-
): Promise<ProviderQuoteResponse[]> {
|
|
204
|
-
const response = await Promise.all(
|
|
205
|
-
this.providers.map((provider) =>
|
|
206
|
-
provider
|
|
207
|
-
.getQuote(
|
|
208
|
-
options,
|
|
209
|
-
{
|
|
210
|
-
infiniteApproval: this.evmOptions.infiniteApproval,
|
|
211
|
-
walletIdentifier: this.walletId,
|
|
212
|
-
},
|
|
213
|
-
context,
|
|
214
|
-
)
|
|
215
|
-
.then((res) => {
|
|
216
|
-
if (!res) return res;
|
|
217
|
-
this.emit(Events.QuoteUpdate, res.toTokenAmount);
|
|
218
|
-
return res;
|
|
219
|
-
}),
|
|
220
|
-
),
|
|
221
|
-
);
|
|
222
|
-
// Sort by the dest token amount i.e. best offer first
|
|
223
|
-
return response
|
|
224
|
-
.filter((res) => res !== null)
|
|
225
|
-
.sort((a, b) => (b.toTokenAmount.gt(a.toTokenAmount) ? 1 : -1));
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
getSwap(
|
|
229
|
-
quote: SwapQuote,
|
|
230
|
-
context?: { signal?: AbortSignal },
|
|
231
|
-
): Promise<ProviderSwapResponse | null> {
|
|
232
|
-
const provider = this.providers.find((p) => p.name === quote.provider);
|
|
233
|
-
return provider.getSwap(quote, context);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
getStatus(options: StatusOptionsResponse): Promise<TransactionStatus | null> {
|
|
237
|
-
const provider = this.providers.find((p) => p.name === options.provider);
|
|
238
|
-
return provider.getStatus(options.options);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
static networkNameToInfo(networkName: SupportedNetworkName): NetworkInfo {
|
|
242
|
-
return NetworkDetails[networkName];
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
export {
|
|
247
|
-
SwapToken,
|
|
248
|
-
isSupportedNetwork,
|
|
249
|
-
getSupportedNetworks,
|
|
250
|
-
TokenType,
|
|
251
|
-
TokenTypeTo,
|
|
252
|
-
WalletIdentifier,
|
|
253
|
-
SupportedNetworkName,
|
|
254
|
-
getNetworkInfoByName,
|
|
255
|
-
sortByRank,
|
|
256
|
-
sortNativeToFront,
|
|
257
|
-
NetworkInfo,
|
|
258
|
-
ProviderQuoteResponse,
|
|
259
|
-
ProviderSwapResponse,
|
|
260
|
-
NetworkType,
|
|
261
|
-
GenericTransaction,
|
|
262
|
-
SolanaTransaction,
|
|
263
|
-
EVMTransaction,
|
|
264
|
-
TransactionType,
|
|
265
|
-
TransactionStatus,
|
|
266
|
-
StatusOptionsResponse,
|
|
267
|
-
StatusOptions,
|
|
268
|
-
};
|
|
269
|
-
|
|
270
|
-
export default Swap;
|