@layerswap/wallet-starknet 1.0.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/esm/StarknetProvider.js +116 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/jsons/ERC20.json +258 -0
- package/dist/esm/starknetAddressUtilsProvider.js +26 -0
- package/dist/esm/starknetBalanceProvider.js +42 -0
- package/dist/esm/starknetGasProvider.js +43 -0
- package/dist/esm/starknetNftProvider.js +48 -0
- package/dist/esm/useStarknetConnection.js +159 -0
- package/dist/esm/utils/KnownStarknetConnectors.js +24 -0
- package/dist/esm/utils/index.js +3 -0
- package/dist/esm/utils/resolveIcon.js +9 -0
- package/dist/esm/utils/starkNetAddressValidator.js +46 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/StarknetProvider.d.ts +6 -0
- package/dist/types/StarknetProvider.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/starknetAddressUtilsProvider.d.ts +7 -0
- package/dist/types/starknetAddressUtilsProvider.d.ts.map +1 -0
- package/dist/types/starknetBalanceProvider.d.ts +6 -0
- package/dist/types/starknetBalanceProvider.d.ts.map +1 -0
- package/dist/types/starknetGasProvider.d.ts +9 -0
- package/dist/types/starknetGasProvider.d.ts.map +1 -0
- package/dist/types/starknetNftProvider.d.ts +6 -0
- package/dist/types/starknetNftProvider.d.ts.map +1 -0
- package/dist/types/useStarknetConnection.d.ts +3 -0
- package/dist/types/useStarknetConnection.d.ts.map +1 -0
- package/dist/types/utils/KnownStarknetConnectors.d.ts +6 -0
- package/dist/types/utils/KnownStarknetConnectors.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +4 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/resolveIcon.d.ts +6 -0
- package/dist/types/utils/resolveIcon.d.ts.map +1 -0
- package/dist/types/utils/starkNetAddressValidator.d.ts +2 -0
- package/dist/types/utils/starkNetAddressValidator.d.ts.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _DiscoveryConnector_wallet, _DiscoveryConnector_store;
|
|
13
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
14
|
+
import { useEffect, useState } from "react";
|
|
15
|
+
import { mainnet, sepolia } from "@starknet-react/chains";
|
|
16
|
+
import { Connector, ConnectorNotConnectedError, UserNotConnectedError, StarknetConfig, publicProvider } from '@starknet-react/core';
|
|
17
|
+
import { AppSettings } from "@layerswap/widget/internal";
|
|
18
|
+
//@ts-ignore
|
|
19
|
+
import { ArgentMobileConnector } from "starknetkit/argentMobile";
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
import { InjectedConnector } from "starknetkit/injected";
|
|
22
|
+
// @ts-ignore
|
|
23
|
+
import { WebWalletConnector } from "starknetkit/webwallet";
|
|
24
|
+
const WALLETCONNECT_PROJECT_ID = AppSettings.WalletConnectConfig.projectId;
|
|
25
|
+
class DiscoveryConnector extends Connector {
|
|
26
|
+
constructor(wallet, store) {
|
|
27
|
+
super();
|
|
28
|
+
_DiscoveryConnector_wallet.set(this, void 0);
|
|
29
|
+
_DiscoveryConnector_store.set(this, void 0);
|
|
30
|
+
__classPrivateFieldSet(this, _DiscoveryConnector_wallet, wallet, "f");
|
|
31
|
+
__classPrivateFieldSet(this, _DiscoveryConnector_store, store, "f");
|
|
32
|
+
}
|
|
33
|
+
get id() {
|
|
34
|
+
return `${__classPrivateFieldGet(this, _DiscoveryConnector_wallet, "f").id}-mobile`;
|
|
35
|
+
}
|
|
36
|
+
get icon() {
|
|
37
|
+
return {
|
|
38
|
+
dark: __classPrivateFieldGet(this, _DiscoveryConnector_wallet, "f").icon,
|
|
39
|
+
light: __classPrivateFieldGet(this, _DiscoveryConnector_wallet, "f").icon
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
get name() {
|
|
43
|
+
return `${__classPrivateFieldGet(this, _DiscoveryConnector_wallet, "f").name} (mobile)`;
|
|
44
|
+
}
|
|
45
|
+
available() {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
connect() {
|
|
49
|
+
window.open(__classPrivateFieldGet(this, _DiscoveryConnector_wallet, "f").downloads[__classPrivateFieldGet(this, _DiscoveryConnector_store, "f")], "_blank");
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
get wallet() {
|
|
53
|
+
throw new ConnectorNotConnectedError();
|
|
54
|
+
}
|
|
55
|
+
disconnect() {
|
|
56
|
+
throw new UserNotConnectedError();
|
|
57
|
+
}
|
|
58
|
+
account() {
|
|
59
|
+
throw new ConnectorNotConnectedError();
|
|
60
|
+
}
|
|
61
|
+
ready() {
|
|
62
|
+
throw new Error("Method not implemented.");
|
|
63
|
+
}
|
|
64
|
+
chainId() {
|
|
65
|
+
throw new Error("Method not implemented.");
|
|
66
|
+
}
|
|
67
|
+
request(call) {
|
|
68
|
+
throw new Error("Method not implemented.");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
_DiscoveryConnector_wallet = new WeakMap(), _DiscoveryConnector_store = new WeakMap();
|
|
72
|
+
const StarknetProvider = ({ children }) => {
|
|
73
|
+
const [connectors, setConnectors] = useState([]);
|
|
74
|
+
const resolveConnectors = async () => {
|
|
75
|
+
const isSafari = typeof window !== "undefined"
|
|
76
|
+
? /^((?!chrome|android).)*safari/i.test(navigator.userAgent)
|
|
77
|
+
: false;
|
|
78
|
+
const isAndroid = navigator.userAgent.match(/Android/i);
|
|
79
|
+
const isIOS = navigator.userAgent.match(/iPhone|iPad|iPod/i);
|
|
80
|
+
const defaultConnectors = [];
|
|
81
|
+
if (!isSafari) {
|
|
82
|
+
if (!(isAndroid || isIOS)) {
|
|
83
|
+
defaultConnectors.push(new InjectedConnector({ options: { id: "argentX" } }));
|
|
84
|
+
defaultConnectors.push(new InjectedConnector({ options: { id: "keplr" } }));
|
|
85
|
+
}
|
|
86
|
+
defaultConnectors.push(new InjectedConnector({ options: { id: "braavos" } }));
|
|
87
|
+
}
|
|
88
|
+
if ((isAndroid || isIOS) && !defaultConnectors.some(c => c.id === "braavos")) {
|
|
89
|
+
const starknet = (await import('get-starknet-core')).default;
|
|
90
|
+
const discoverWallets = (await starknet.getDiscoveryWallets()).filter(w => {
|
|
91
|
+
return (isAndroid && w.downloads["android"]) || (isIOS && w.downloads["ios"]);
|
|
92
|
+
});
|
|
93
|
+
if (discoverWallets.length)
|
|
94
|
+
defaultConnectors.push(...discoverWallets.map(w => new DiscoveryConnector(w, isAndroid ? "android" : "ios")));
|
|
95
|
+
}
|
|
96
|
+
defaultConnectors.push(ArgentMobileConnector.init({
|
|
97
|
+
options: {
|
|
98
|
+
dappName: 'Layerswap',
|
|
99
|
+
projectId: WALLETCONNECT_PROJECT_ID,
|
|
100
|
+
url: 'https://www.layerswap.io/app/',
|
|
101
|
+
description: 'Move crypto across exchanges, blockchains, and wallets.',
|
|
102
|
+
}
|
|
103
|
+
}));
|
|
104
|
+
defaultConnectors.push(new WebWalletConnector());
|
|
105
|
+
return defaultConnectors;
|
|
106
|
+
};
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
(async () => {
|
|
109
|
+
const result = await resolveConnectors();
|
|
110
|
+
setConnectors(result);
|
|
111
|
+
})();
|
|
112
|
+
}, []);
|
|
113
|
+
const chains = [mainnet, sepolia];
|
|
114
|
+
return (_jsx(StarknetConfig, { chains: chains, provider: publicProvider(), connectors: connectors, children: children }));
|
|
115
|
+
};
|
|
116
|
+
export default StarknetProvider;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import StarknetProviderWrapper from "./StarknetProvider";
|
|
2
|
+
import useStarknetConnection from "./useStarknetConnection";
|
|
3
|
+
import { StarknetBalanceProvider } from "./starknetBalanceProvider";
|
|
4
|
+
import { StarknetGasProvider } from "./starknetGasProvider";
|
|
5
|
+
import { StarknetAddressUtilsProvider } from "./starknetAddressUtilsProvider";
|
|
6
|
+
import { StarknetNftProvider } from "./starknetNftProvider";
|
|
7
|
+
export const StarknetProvider = {
|
|
8
|
+
id: "starknet",
|
|
9
|
+
wrapper: StarknetProviderWrapper,
|
|
10
|
+
walletConnectionProvider: useStarknetConnection,
|
|
11
|
+
addressUtilsProvider: new StarknetAddressUtilsProvider(),
|
|
12
|
+
balanceProvider: new StarknetBalanceProvider(),
|
|
13
|
+
gasProvider: new StarknetGasProvider(),
|
|
14
|
+
nftProvider: new StarknetNftProvider(),
|
|
15
|
+
};
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"members": [
|
|
4
|
+
{
|
|
5
|
+
"name": "low",
|
|
6
|
+
"offset": 0,
|
|
7
|
+
"type": "felt"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"name": "high",
|
|
11
|
+
"offset": 1,
|
|
12
|
+
"type": "felt"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"name": "Uint256",
|
|
16
|
+
"size": 2,
|
|
17
|
+
"type": "struct"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"inputs": [
|
|
21
|
+
{
|
|
22
|
+
"name": "name",
|
|
23
|
+
"type": "felt"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"name": "symbol",
|
|
27
|
+
"type": "felt"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "recipient",
|
|
31
|
+
"type": "felt"
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"name": "constructor",
|
|
35
|
+
"outputs": [],
|
|
36
|
+
"type": "constructor"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"inputs": [],
|
|
40
|
+
"name": "name",
|
|
41
|
+
"outputs": [
|
|
42
|
+
{
|
|
43
|
+
"name": "name",
|
|
44
|
+
"type": "felt"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"stateMutability": "view",
|
|
48
|
+
"type": "function"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"inputs": [],
|
|
52
|
+
"name": "symbol",
|
|
53
|
+
"outputs": [
|
|
54
|
+
{
|
|
55
|
+
"name": "symbol",
|
|
56
|
+
"type": "felt"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"stateMutability": "view",
|
|
60
|
+
"type": "function"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"inputs": [],
|
|
64
|
+
"name": "totalSupply",
|
|
65
|
+
"outputs": [
|
|
66
|
+
{
|
|
67
|
+
"name": "totalSupply",
|
|
68
|
+
"type": "Uint256"
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"stateMutability": "view",
|
|
72
|
+
"type": "function"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"inputs": [],
|
|
76
|
+
"name": "decimals",
|
|
77
|
+
"outputs": [
|
|
78
|
+
{
|
|
79
|
+
"name": "decimals",
|
|
80
|
+
"type": "felt"
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
"stateMutability": "view",
|
|
84
|
+
"type": "function"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"inputs": [
|
|
88
|
+
{
|
|
89
|
+
"name": "account",
|
|
90
|
+
"type": "felt"
|
|
91
|
+
}
|
|
92
|
+
],
|
|
93
|
+
"name": "balanceOf",
|
|
94
|
+
"outputs": [
|
|
95
|
+
{
|
|
96
|
+
"name": "balance",
|
|
97
|
+
"type": "Uint256"
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
"stateMutability": "view",
|
|
101
|
+
"type": "function"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"inputs": [
|
|
105
|
+
{
|
|
106
|
+
"name": "owner",
|
|
107
|
+
"type": "felt"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "spender",
|
|
111
|
+
"type": "felt"
|
|
112
|
+
}
|
|
113
|
+
],
|
|
114
|
+
"name": "allowance",
|
|
115
|
+
"outputs": [
|
|
116
|
+
{
|
|
117
|
+
"name": "remaining",
|
|
118
|
+
"type": "Uint256"
|
|
119
|
+
}
|
|
120
|
+
],
|
|
121
|
+
"stateMutability": "view",
|
|
122
|
+
"type": "function"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"inputs": [
|
|
126
|
+
{
|
|
127
|
+
"name": "recipient",
|
|
128
|
+
"type": "felt"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"name": "amount",
|
|
132
|
+
"type": "Uint256"
|
|
133
|
+
}
|
|
134
|
+
],
|
|
135
|
+
"name": "transfer",
|
|
136
|
+
"outputs": [
|
|
137
|
+
{
|
|
138
|
+
"name": "success",
|
|
139
|
+
"type": "felt"
|
|
140
|
+
}
|
|
141
|
+
],
|
|
142
|
+
"type": "function"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"inputs": [
|
|
146
|
+
{
|
|
147
|
+
"name": "sender",
|
|
148
|
+
"type": "felt"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"name": "recipient",
|
|
152
|
+
"type": "felt"
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"name": "amount",
|
|
156
|
+
"type": "Uint256"
|
|
157
|
+
}
|
|
158
|
+
],
|
|
159
|
+
"name": "transferFrom",
|
|
160
|
+
"outputs": [
|
|
161
|
+
{
|
|
162
|
+
"name": "success",
|
|
163
|
+
"type": "felt"
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
"type": "function"
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"inputs": [
|
|
170
|
+
{
|
|
171
|
+
"name": "spender",
|
|
172
|
+
"type": "felt"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"name": "amount",
|
|
176
|
+
"type": "Uint256"
|
|
177
|
+
}
|
|
178
|
+
],
|
|
179
|
+
"name": "approve",
|
|
180
|
+
"outputs": [
|
|
181
|
+
{
|
|
182
|
+
"name": "success",
|
|
183
|
+
"type": "felt"
|
|
184
|
+
}
|
|
185
|
+
],
|
|
186
|
+
"type": "function"
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"inputs": [
|
|
190
|
+
{
|
|
191
|
+
"name": "spender",
|
|
192
|
+
"type": "felt"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"name": "added_value",
|
|
196
|
+
"type": "Uint256"
|
|
197
|
+
}
|
|
198
|
+
],
|
|
199
|
+
"name": "increaseAllowance",
|
|
200
|
+
"outputs": [
|
|
201
|
+
{
|
|
202
|
+
"name": "success",
|
|
203
|
+
"type": "felt"
|
|
204
|
+
}
|
|
205
|
+
],
|
|
206
|
+
"type": "function"
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"inputs": [
|
|
210
|
+
{
|
|
211
|
+
"name": "spender",
|
|
212
|
+
"type": "felt"
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"name": "subtracted_value",
|
|
216
|
+
"type": "Uint256"
|
|
217
|
+
}
|
|
218
|
+
],
|
|
219
|
+
"name": "decreaseAllowance",
|
|
220
|
+
"outputs": [
|
|
221
|
+
{
|
|
222
|
+
"name": "success",
|
|
223
|
+
"type": "felt"
|
|
224
|
+
}
|
|
225
|
+
],
|
|
226
|
+
"type": "function"
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"inputs": [
|
|
230
|
+
{
|
|
231
|
+
"name": "recipient",
|
|
232
|
+
"type": "felt"
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"name": "amount",
|
|
236
|
+
"type": "Uint256"
|
|
237
|
+
}
|
|
238
|
+
],
|
|
239
|
+
"name": "mint",
|
|
240
|
+
"outputs": [],
|
|
241
|
+
"type": "function"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"inputs": [
|
|
245
|
+
{
|
|
246
|
+
"name": "user",
|
|
247
|
+
"type": "felt"
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"name": "amount",
|
|
251
|
+
"type": "Uint256"
|
|
252
|
+
}
|
|
253
|
+
],
|
|
254
|
+
"name": "burn",
|
|
255
|
+
"outputs": [],
|
|
256
|
+
"type": "function"
|
|
257
|
+
}
|
|
258
|
+
]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { validateAndParseAddress } from "./utils";
|
|
2
|
+
import { KnownInternalNames } from "@layerswap/widget/internal";
|
|
3
|
+
export class StarknetAddressUtilsProvider {
|
|
4
|
+
supportsNetwork(network) {
|
|
5
|
+
return (KnownInternalNames.Networks.StarkNetMainnet.includes(network.name) || KnownInternalNames.Networks.StarkNetSepolia.includes(network.name))
|
|
6
|
+
|| (KnownInternalNames.Networks.ParadexMainnet.includes(network.name) || KnownInternalNames.Networks.ParadexTestnet.includes(network.name));
|
|
7
|
+
}
|
|
8
|
+
isValidAddress(address) {
|
|
9
|
+
if (!address) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
return validateAndParseAddress(address);
|
|
13
|
+
}
|
|
14
|
+
addressFormat(address) {
|
|
15
|
+
const removeHexPrefix = (hex) => {
|
|
16
|
+
return hex?.replace("0x", "");
|
|
17
|
+
};
|
|
18
|
+
const addHexPrefix = (hex) => {
|
|
19
|
+
return `0x${hex}`;
|
|
20
|
+
};
|
|
21
|
+
const addAddressPadding = (address) => {
|
|
22
|
+
return addHexPrefix(removeHexPrefix(address)?.padStart(64, '0'));
|
|
23
|
+
};
|
|
24
|
+
return addAddressPadding(address?.toLowerCase());
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import Erc20Abi from './jsons/ERC20.json';
|
|
2
|
+
import { KnownInternalNames, insertIfNotExists, formatUnits } from "@layerswap/widget/internal";
|
|
3
|
+
import { BalanceProvider } from "@layerswap/widget/types";
|
|
4
|
+
export class StarknetBalanceProvider extends BalanceProvider {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
this.supportsNetwork = (network) => {
|
|
8
|
+
return (KnownInternalNames.Networks.StarkNetMainnet.includes(network.name) || KnownInternalNames.Networks.StarkNetGoerli.includes(network.name) || KnownInternalNames.Networks.StarkNetSepolia.includes(network.name));
|
|
9
|
+
};
|
|
10
|
+
this.fetchBalance = async (address, network) => {
|
|
11
|
+
const { Contract, RpcProvider, uint256, } = await import("starknet");
|
|
12
|
+
const { BigNumber } = await import("ethers");
|
|
13
|
+
let balances = [];
|
|
14
|
+
if (!network?.tokens)
|
|
15
|
+
return;
|
|
16
|
+
const provider = new RpcProvider({
|
|
17
|
+
nodeUrl: network.node_url,
|
|
18
|
+
});
|
|
19
|
+
const tokens = insertIfNotExists(network.tokens || [], network.token);
|
|
20
|
+
for (const token of tokens) {
|
|
21
|
+
try {
|
|
22
|
+
const erc20 = new Contract(Erc20Abi, token.contract, provider);
|
|
23
|
+
const balanceResult = await erc20.balanceOf(address);
|
|
24
|
+
const balanceInWei = BigNumber.from(uint256.uint256ToBN(balanceResult.balance).toString()).toString();
|
|
25
|
+
const balance = {
|
|
26
|
+
network: network.name,
|
|
27
|
+
token: token.symbol,
|
|
28
|
+
amount: Number(formatUnits(BigInt(balanceInWei), token.decimals)),
|
|
29
|
+
request_time: new Date().toJSON(),
|
|
30
|
+
decimals: token.decimals,
|
|
31
|
+
isNativeCurrency: false,
|
|
32
|
+
};
|
|
33
|
+
balances.push(balance);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
balances.push(this.resolveTokenBalanceFetchError(e, token, network));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return balances;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { KnownInternalNames, formatUnits } from "@layerswap/widget/internal";
|
|
2
|
+
import { CallData, cairo } from "starknet";
|
|
3
|
+
export class StarknetGasProvider {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.getGas = async ({ network, token, wallet, amount }) => {
|
|
6
|
+
const testnetWatchdog = '0x0423074c4bf903478daaa719bb3b1539d23af07db07101d263c78d75e5e6e0a3';
|
|
7
|
+
const mainnetWatchdog = '0x022993789c33e54e0d296fc266a9c9a2e9dcabe2e48941f5fa1bd5692ac4a8c4';
|
|
8
|
+
const mainnetRecipient = '0x19252B1dEef483477C4D30cFcc3e5Ed9C82FAFEA44669c182A45A01b4FdB97a';
|
|
9
|
+
const testnetRecipient = '0x065a93bf9a33c87346f534a3b6c825e5c9e86a8e612cba683d0271aae5062d21';
|
|
10
|
+
const version = (network.name.split('_').pop() === 'SEPOLIA' || network.name.split('_').pop() === 'GOERLI') ? 'sandbox' : 'prod';
|
|
11
|
+
const recipient = version === 'prod' ? mainnetRecipient : testnetRecipient;
|
|
12
|
+
const watchdogContract = version === 'prod' ? mainnetWatchdog : testnetWatchdog;
|
|
13
|
+
const starknetWalletAccount = wallet?.metadata?.starknetAccount;
|
|
14
|
+
if (!token || !network.token || !token.contract || !starknetWalletAccount)
|
|
15
|
+
return;
|
|
16
|
+
const amt = BigInt(amount ?? 100000);
|
|
17
|
+
const transferCall = {
|
|
18
|
+
contractAddress: token.contract.toLowerCase(),
|
|
19
|
+
entrypoint: "transfer",
|
|
20
|
+
calldata: CallData.compile({
|
|
21
|
+
recipient,
|
|
22
|
+
amount: cairo.uint256(amt),
|
|
23
|
+
})
|
|
24
|
+
};
|
|
25
|
+
const watch = {
|
|
26
|
+
contractAddress: watchdogContract,
|
|
27
|
+
entrypoint: "watch",
|
|
28
|
+
calldata: ["69420"],
|
|
29
|
+
};
|
|
30
|
+
const resp = await starknetWalletAccount.estimateInvokeFee([transferCall, watch], { skipValidate: true });
|
|
31
|
+
if (!resp?.suggestedMaxFee) {
|
|
32
|
+
throw new Error(`Couldn't get fee estimation for the transfer. Response: ${JSON.stringify(resp)}`);
|
|
33
|
+
}
|
|
34
|
+
;
|
|
35
|
+
const feeInWei = resp.suggestedMaxFee.toString();
|
|
36
|
+
const gas = Number(formatUnits(BigInt(feeInWei), network.token.decimals));
|
|
37
|
+
return { gas, token: network.token };
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
supportsNetwork(network) {
|
|
41
|
+
return (KnownInternalNames.Networks.StarkNetMainnet.includes(network.name) || KnownInternalNames.Networks.StarkNetGoerli.includes(network.name) || KnownInternalNames.Networks.StarkNetSepolia.includes(network.name));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Contract, RpcProvider } from "starknet";
|
|
2
|
+
import { KnownInternalNames } from "@layerswap/widget/internal";
|
|
3
|
+
const NFT_ABI = [
|
|
4
|
+
{
|
|
5
|
+
"name": "balanceOf",
|
|
6
|
+
"type": "function",
|
|
7
|
+
"inputs": [
|
|
8
|
+
{
|
|
9
|
+
"name": "owner",
|
|
10
|
+
"type": "felt"
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"outputs": [
|
|
14
|
+
{
|
|
15
|
+
"name": "balance",
|
|
16
|
+
"type": "felt"
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"stateMutability": "view"
|
|
20
|
+
}
|
|
21
|
+
];
|
|
22
|
+
export class StarknetNftProvider {
|
|
23
|
+
constructor() {
|
|
24
|
+
this.getBalance = async ({ address, network, contractAddress }) => {
|
|
25
|
+
if (!contractAddress || !network.node_url) {
|
|
26
|
+
throw new Error("Missing NFT contract address or node URL");
|
|
27
|
+
}
|
|
28
|
+
const provider = new RpcProvider({
|
|
29
|
+
nodeUrl: network.node_url
|
|
30
|
+
});
|
|
31
|
+
try {
|
|
32
|
+
const contract = new Contract(NFT_ABI, contractAddress, provider);
|
|
33
|
+
const response = await contract.balanceOf(address);
|
|
34
|
+
if (!response || typeof response.balance === 'undefined') {
|
|
35
|
+
throw new Error("Invalid response from NFT contract");
|
|
36
|
+
}
|
|
37
|
+
return Number(response.balance);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error("Error fetching NFT balance:", error);
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
supportsNetwork(network) {
|
|
46
|
+
return (KnownInternalNames.Networks.StarkNetMainnet.includes(network.name) || KnownInternalNames.Networks.StarkNetGoerli.includes(network.name) || KnownInternalNames.Networks.StarkNetSepolia.includes(network.name));
|
|
47
|
+
}
|
|
48
|
+
}
|