@dynamic-labs/starknet 4.0.0-alpha.8 → 4.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/CHANGELOG.md +496 -1
- package/package.cjs +1 -1
- package/package.js +1 -1
- package/package.json +14 -12
- package/src/StarknetWalletConnector.cjs +232 -0
- package/src/StarknetWalletConnector.d.ts +58 -0
- package/src/StarknetWalletConnector.js +228 -0
- package/src/index.cjs +14 -12
- package/src/index.d.ts +16 -7
- package/src/index.js +12 -12
- package/src/types.d.ts +26 -11
- package/src/utils/convertors.cjs +1 -1
- package/src/utils/convertors.d.ts +1 -1
- package/src/utils/convertors.js +1 -1
- package/src/wallet/StarknetWallet.cjs +24 -3
- package/src/wallet/StarknetWallet.d.ts +14 -4
- package/src/wallet/StarknetWallet.js +24 -3
- package/src/wallets/argent/argentMobile/argentMobile.cjs +70 -0
- package/src/wallets/argent/argentMobile/argentMobile.d.ts +16 -0
- package/src/wallets/argent/argentMobile/argentMobile.js +66 -0
- package/src/wallets/argent/base.cjs +50 -0
- package/src/wallets/argent/base.d.ts +5 -0
- package/src/wallets/argent/base.js +46 -0
- package/src/wallets/argent/injected/argentx.cjs +33 -0
- package/src/wallets/argent/injected/argentx.d.ts +8 -0
- package/src/wallets/argent/injected/argentx.js +29 -0
- package/src/wallets/argent/webwallet/webwallet.cjs +37 -0
- package/src/wallets/argent/webwallet/webwallet.d.ts +10 -0
- package/src/wallets/argent/webwallet/webwallet.js +33 -0
- package/src/wallets/injected/braavos.cjs +31 -0
- package/src/wallets/injected/braavos.d.ts +13 -0
- package/src/wallets/injected/braavos.js +27 -0
- package/src/wallets/injected/fetchStarknetInjectedWalletConnectors.cjs +35 -0
- package/src/wallets/injected/fetchStarknetInjectedWalletConnectors.d.ts +5 -0
- package/src/wallets/injected/fetchStarknetInjectedWalletConnectors.js +31 -0
- package/src/wallets/injected/injected.cjs +141 -0
- package/src/wallets/injected/injected.d.ts +10 -0
- package/src/wallets/injected/injected.js +137 -0
- package/src/wallets/{metamask.cjs → injected/metamask.cjs} +19 -29
- package/src/wallets/{metamask.d.ts → injected/metamask.d.ts} +2 -4
- package/src/wallets/{metamask.js → injected/metamask.js} +15 -29
- package/src/starknetWalletConnector.cjs +0 -320
- package/src/starknetWalletConnector.d.ts +0 -127
- package/src/starknetWalletConnector.js +0 -314
- package/src/utils/starknetSnap.cjs +0 -92
- package/src/utils/starknetSnap.d.ts +0 -8
- package/src/utils/starknetSnap.js +0 -88
- package/src/wallets/argentx.cjs +0 -24
- package/src/wallets/argentx.d.ts +0 -8
- package/src/wallets/argentx.js +0 -20
- package/src/wallets/argentxBase.cjs +0 -50
- package/src/wallets/argentxBase.d.ts +0 -16
- package/src/wallets/argentxBase.js +0 -48
- package/src/wallets/argentxMobile.cjs +0 -100
- package/src/wallets/argentxMobile.d.ts +0 -13
- package/src/wallets/argentxMobile.js +0 -96
- package/src/wallets/argentxWeb.cjs +0 -57
- package/src/wallets/argentxWeb.d.ts +0 -8
- package/src/wallets/argentxWeb.js +0 -53
- package/src/wallets/bitget.cjs +0 -22
- package/src/wallets/bitget.d.ts +0 -7
- package/src/wallets/bitget.js +0 -18
- package/src/wallets/braavos.cjs +0 -37
- package/src/wallets/braavos.d.ts +0 -8
- package/src/wallets/braavos.js +0 -33
- package/src/wallets/okx.cjs +0 -15
- package/src/wallets/okx.d.ts +0 -6
- package/src/wallets/okx.js +0 -11
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
+
|
|
6
|
+
var _tslib = require('../_virtual/_tslib.cjs');
|
|
7
|
+
var starknet = require('starknet');
|
|
8
|
+
var walletConnectorCore = require('@dynamic-labs/wallet-connector-core');
|
|
9
|
+
var utils = require('@dynamic-labs/utils');
|
|
10
|
+
var logger = require('@dynamic-labs/logger');
|
|
11
|
+
var constants = require('./constants.cjs');
|
|
12
|
+
var ethereumContractAbi = require('./ethereumContractAbi.cjs');
|
|
13
|
+
var convertors = require('./utils/convertors.cjs');
|
|
14
|
+
var StarknetWallet = require('./wallet/StarknetWallet.cjs');
|
|
15
|
+
|
|
16
|
+
class StarknetWalletConnector extends walletConnectorCore.WalletConnectorBase {
|
|
17
|
+
constructor(name, id, opts) {
|
|
18
|
+
var _a;
|
|
19
|
+
super(opts);
|
|
20
|
+
this.ChainWallet = StarknetWallet.StarknetWallet;
|
|
21
|
+
this.connectedChain = 'STARK';
|
|
22
|
+
this.supportedChains = ['STARK'];
|
|
23
|
+
this.switchNetworkOnlyFromWallet = true;
|
|
24
|
+
/** required for metamask snap integration as MM snaps don't have event listeners */
|
|
25
|
+
this.canSetEventListeners = true;
|
|
26
|
+
this.name = name;
|
|
27
|
+
this.id = id;
|
|
28
|
+
this.starknetNetworks = opts.starknetNetworks;
|
|
29
|
+
this.chainRpcProviders = opts.chainRpcProviders;
|
|
30
|
+
(_a = this.chainRpcProviders) === null || _a === void 0 ? void 0 : _a.registerStarknetProviders();
|
|
31
|
+
this.walletBookWallet = opts.walletBookWallet;
|
|
32
|
+
this.logger = new logger.Logger(this.name);
|
|
33
|
+
}
|
|
34
|
+
connect() {
|
|
35
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
36
|
+
yield this.getAddress();
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
getAddress() {
|
|
40
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
41
|
+
var _a;
|
|
42
|
+
if ((_a = this.walletData) === null || _a === void 0 ? void 0 : _a.account) {
|
|
43
|
+
return this.walletData.account;
|
|
44
|
+
}
|
|
45
|
+
this.logger.debug('[getAddress] Prompting new connection');
|
|
46
|
+
const { wallet, data } = yield this.prompt({
|
|
47
|
+
silently: false,
|
|
48
|
+
});
|
|
49
|
+
this.logger.debug(`[getAddress] Connection returned account: ${data === null || data === void 0 ? void 0 : data.account}, wallet: ${wallet}`);
|
|
50
|
+
if (!wallet || !data) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
this.wallet = wallet;
|
|
54
|
+
this.walletData = data;
|
|
55
|
+
this.setupEventListeners();
|
|
56
|
+
return this.walletData.account;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* returns starknet wallet network id
|
|
61
|
+
*/
|
|
62
|
+
getNetwork() {
|
|
63
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
var _a;
|
|
65
|
+
if (!((_a = this.walletData) === null || _a === void 0 ? void 0 : _a.chainId)) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
return starknet.num.toHex(this.walletData.chainId);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
getBalance(address) {
|
|
72
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
const wallet = yield this.getWalletAccount();
|
|
74
|
+
if (!wallet) {
|
|
75
|
+
this.logger.error('Could not find provider for getting balance');
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
const contract = new starknet.Contract(ethereumContractAbi, constants.ETH_STARKNET_ADDRESS, wallet);
|
|
79
|
+
try {
|
|
80
|
+
const { balance } = yield contract.balanceOf(address);
|
|
81
|
+
/**
|
|
82
|
+
* Dividing by 1e18 as the returned balance is a Gwei number.
|
|
83
|
+
* Read more here: https://www.investopedia.com/terms/g/gwei-ethereum.asp#toc-what-is-gwei
|
|
84
|
+
*/
|
|
85
|
+
return (Number(starknet.cairo.uint256(balance.low).low) / 1e18).toFixed(6);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
this.logger.error(error);
|
|
89
|
+
throw new utils.DynamicError('Something went wrong');
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
signMessage(messageToSign) {
|
|
94
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
95
|
+
const [walletAddress, chainId] = yield Promise.all([
|
|
96
|
+
this.getAddress(),
|
|
97
|
+
this.getNetwork(),
|
|
98
|
+
]);
|
|
99
|
+
const assertions = [
|
|
100
|
+
[walletAddress, 'No address for wallet'],
|
|
101
|
+
[chainId, 'No chainId for wallet'],
|
|
102
|
+
[this.wallet, 'No wallet provider'],
|
|
103
|
+
];
|
|
104
|
+
for (const [value, message] of assertions) {
|
|
105
|
+
if (!value) {
|
|
106
|
+
this.logger.error(`[signMessage] ${message}. Make sure \`connect\` was called first`);
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const encodedMessage = convertors.formatTypedDataMessage(messageToSign, chainId);
|
|
111
|
+
// justification: performing assertion above
|
|
112
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
113
|
+
const signature = yield this.wallet.request({
|
|
114
|
+
params: encodedMessage,
|
|
115
|
+
type: 'wallet_signTypedData',
|
|
116
|
+
});
|
|
117
|
+
return signature === null || signature === void 0 ? void 0 : signature.join(',');
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
getWalletAccount() {
|
|
121
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
122
|
+
if (!this.wallet) {
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
return new starknet.WalletAccount(yield this.getProvider(), this.wallet);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
getProvider() {
|
|
129
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
130
|
+
const rpcUrl = yield this.resolveRpcUrl();
|
|
131
|
+
this.logger.debug(`[getProvider] using rpcUrl: ${rpcUrl}`);
|
|
132
|
+
return new starknet.RpcProvider({ nodeUrl: rpcUrl });
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
isInstalledOnBrowser() {
|
|
136
|
+
return Boolean(window[`starknet_${this.id}`]);
|
|
137
|
+
}
|
|
138
|
+
endSession() {
|
|
139
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
140
|
+
this.teardownEventListeners();
|
|
141
|
+
this.wallet = undefined;
|
|
142
|
+
this.walletData = undefined;
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
setupEventListeners() {
|
|
146
|
+
if (!this.canSetEventListeners)
|
|
147
|
+
return;
|
|
148
|
+
if (!this.wallet) {
|
|
149
|
+
this.logger.debug('[setupEventListeners] Not connected, returning early');
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
this.handleAccountChange = (accounts) => _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
153
|
+
var _a;
|
|
154
|
+
this.logger.debug(`[accountsChanged] Received argument: ${accounts === null || accounts === void 0 ? void 0 : accounts.toString()}`);
|
|
155
|
+
if (!accounts || accounts[0] === null) {
|
|
156
|
+
this.emit('disconnect');
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const [address] = accounts;
|
|
160
|
+
if (address) {
|
|
161
|
+
this.walletData = {
|
|
162
|
+
account: address,
|
|
163
|
+
chainId: (_a = this.walletData) === null || _a === void 0 ? void 0 : _a.chainId,
|
|
164
|
+
};
|
|
165
|
+
this.emit('accountChange', { accounts: [address.toString()] });
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
this.handleNetworkChange = (chainId) => _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
169
|
+
var _b;
|
|
170
|
+
this.logger.debug(`[networkChanged] Received argument: ${chainId === null || chainId === void 0 ? void 0 : chainId.toString()}`);
|
|
171
|
+
if (!chainId) {
|
|
172
|
+
this.emit('disconnect');
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
this.walletData = {
|
|
176
|
+
account: (_b = this.walletData) === null || _b === void 0 ? void 0 : _b.account,
|
|
177
|
+
chainId: BigInt(chainId),
|
|
178
|
+
};
|
|
179
|
+
this.emit('chainChange', { chain: chainId });
|
|
180
|
+
});
|
|
181
|
+
this.logger.debug('[setupEventListeners] Setting up accountsChanged and networkChanged');
|
|
182
|
+
this.wallet.on('accountsChanged', this.handleAccountChange);
|
|
183
|
+
this.wallet.on('networkChanged', this.handleNetworkChange);
|
|
184
|
+
}
|
|
185
|
+
teardownEventListeners() {
|
|
186
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
187
|
+
var _a, _b;
|
|
188
|
+
if (!this.canSetEventListeners)
|
|
189
|
+
return;
|
|
190
|
+
if (this.handleAccountChange) {
|
|
191
|
+
(_a = this.wallet) === null || _a === void 0 ? void 0 : _a.off('accountsChanged', this.handleAccountChange);
|
|
192
|
+
this.handleAccountChange = undefined;
|
|
193
|
+
}
|
|
194
|
+
if (this.handleNetworkChange) {
|
|
195
|
+
(_b = this.wallet) === null || _b === void 0 ? void 0 : _b.off('networkChanged', this.handleNetworkChange);
|
|
196
|
+
this.handleNetworkChange = undefined;
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
resolveRpcUrl() {
|
|
201
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
202
|
+
var _a;
|
|
203
|
+
const chainId = yield this.getNetwork();
|
|
204
|
+
if (!chainId) {
|
|
205
|
+
this.logger.warn('[resolveRpcUrl] `getNetwork` returned undefined');
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
const networkConfig = this.starknetNetworks.find((config) => config.chainId === chainId);
|
|
209
|
+
if (!networkConfig) {
|
|
210
|
+
this.logger.warn(`[resolveRpcUrl] Network configuration for chainId \`${chainId}\` is not found in starknetNetworks`);
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
return (((_a = networkConfig.privateCustomerRpcUrls) === null || _a === void 0 ? void 0 : _a[0]) || networkConfig.rpcUrls[0]);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
mapChainIdToNetworkName(chainIdOrNetworkName) {
|
|
217
|
+
if (chainIdOrNetworkName === starknet.constants.StarknetChainId.SN_MAIN ||
|
|
218
|
+
chainIdOrNetworkName === starknet.constants.NetworkName.SN_MAIN) {
|
|
219
|
+
return starknet.constants.NetworkName.SN_MAIN;
|
|
220
|
+
}
|
|
221
|
+
else if (chainIdOrNetworkName === starknet.constants.StarknetChainId.SN_SEPOLIA ||
|
|
222
|
+
chainIdOrNetworkName === starknet.constants.NetworkName.SN_SEPOLIA) {
|
|
223
|
+
return starknet.constants.NetworkName.SN_SEPOLIA;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
this.logger.error('Unknown chainId', chainIdOrNetworkName);
|
|
227
|
+
return undefined;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
exports.StarknetWalletConnector = StarknetWalletConnector;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { constants, WalletAccount, RpcProvider } from 'starknet';
|
|
2
|
+
import { WALLET_API, StarknetWindowObject } from '@starknet-io/types-js';
|
|
3
|
+
import { Chain, WalletConnectorBase } from '@dynamic-labs/wallet-connector-core';
|
|
4
|
+
import { NetworkConfiguration } from '@dynamic-labs/sdk-api-core';
|
|
5
|
+
import { WalletSchema } from '@dynamic-labs/wallet-book';
|
|
6
|
+
import { Logger } from '@dynamic-labs/logger';
|
|
7
|
+
import { PromptOptions, PromptResult, StarknetWalletConnectorProps, WalletData } from './types';
|
|
8
|
+
import { StarknetWallet } from './wallet';
|
|
9
|
+
export declare abstract class StarknetWalletConnector extends WalletConnectorBase<typeof StarknetWallet> {
|
|
10
|
+
/** the name of the connector, e.g. "Argent X", "Braavos" */
|
|
11
|
+
name: string;
|
|
12
|
+
/**
|
|
13
|
+
* the string identifier of the connector as surfaced by `get-starknet-core` or `starknetkit`
|
|
14
|
+
* this is used to prompt the correct extension, e.g. the argentX browser extension
|
|
15
|
+
*/
|
|
16
|
+
id: string;
|
|
17
|
+
ChainWallet: typeof StarknetWallet;
|
|
18
|
+
connectedChain: Chain;
|
|
19
|
+
supportedChains: Chain[];
|
|
20
|
+
handleAccountChange: WALLET_API.AccountChangeEventHandler | undefined;
|
|
21
|
+
handleNetworkChange: WALLET_API.NetworkChangeEventHandler | undefined;
|
|
22
|
+
switchNetworkOnlyFromWallet: boolean;
|
|
23
|
+
/** the starknet networks configuration from redcoast */
|
|
24
|
+
starknetNetworks: NetworkConfiguration[];
|
|
25
|
+
/** required for metamask snap integration as MM snaps don't have event listeners */
|
|
26
|
+
canSetEventListeners: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* used to obtain a WalletAccount to interact with the wallet
|
|
29
|
+
*/
|
|
30
|
+
wallet: StarknetWindowObject | undefined;
|
|
31
|
+
/** The wallet metadata. Replace with _metadata once inAppBrowser is migrated */
|
|
32
|
+
protected walletBookWallet: WalletSchema;
|
|
33
|
+
/**
|
|
34
|
+
* used to track wallet state (account and chain)
|
|
35
|
+
*/
|
|
36
|
+
walletData: WalletData | undefined;
|
|
37
|
+
logger: Logger;
|
|
38
|
+
constructor(name: string, id: string, opts: StarknetWalletConnectorProps);
|
|
39
|
+
/** implementing classes should use starknetkit or get-starknet-core functions here */
|
|
40
|
+
abstract prompt(options: PromptOptions): Promise<PromptResult>;
|
|
41
|
+
connect(): Promise<void>;
|
|
42
|
+
getAddress(): Promise<string | undefined>;
|
|
43
|
+
/**
|
|
44
|
+
* returns starknet wallet network id
|
|
45
|
+
*/
|
|
46
|
+
getNetwork(): Promise<string | undefined>;
|
|
47
|
+
getBalance(address: string): Promise<string | undefined>;
|
|
48
|
+
signMessage(messageToSign: string): Promise<string | undefined>;
|
|
49
|
+
getWalletAccount(): Promise<WalletAccount | undefined>;
|
|
50
|
+
getProvider(): Promise<RpcProvider>;
|
|
51
|
+
isInstalledOnBrowser(): boolean;
|
|
52
|
+
endSession(): Promise<void>;
|
|
53
|
+
setupEventListeners(): void;
|
|
54
|
+
teardownEventListeners(): Promise<void>;
|
|
55
|
+
protected resolveRpcUrl(): Promise<string | undefined>;
|
|
56
|
+
protected mapChainIdToNetworkName(chainIdOrNetworkName: string): constants.NetworkName | undefined;
|
|
57
|
+
}
|
|
58
|
+
export type StarknetWalletConnectorType = StarknetWalletConnector;
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
import { __awaiter } from '../_virtual/_tslib.js';
|
|
3
|
+
import { constants, num, Contract, cairo, WalletAccount, RpcProvider } from 'starknet';
|
|
4
|
+
import { WalletConnectorBase } from '@dynamic-labs/wallet-connector-core';
|
|
5
|
+
import { DynamicError } from '@dynamic-labs/utils';
|
|
6
|
+
import { Logger } from '@dynamic-labs/logger';
|
|
7
|
+
import { ETH_STARKNET_ADDRESS } from './constants.js';
|
|
8
|
+
import ETH_CONTRACT_ABI from './ethereumContractAbi.js';
|
|
9
|
+
import { formatTypedDataMessage } from './utils/convertors.js';
|
|
10
|
+
import { StarknetWallet } from './wallet/StarknetWallet.js';
|
|
11
|
+
|
|
12
|
+
class StarknetWalletConnector extends WalletConnectorBase {
|
|
13
|
+
constructor(name, id, opts) {
|
|
14
|
+
var _a;
|
|
15
|
+
super(opts);
|
|
16
|
+
this.ChainWallet = StarknetWallet;
|
|
17
|
+
this.connectedChain = 'STARK';
|
|
18
|
+
this.supportedChains = ['STARK'];
|
|
19
|
+
this.switchNetworkOnlyFromWallet = true;
|
|
20
|
+
/** required for metamask snap integration as MM snaps don't have event listeners */
|
|
21
|
+
this.canSetEventListeners = true;
|
|
22
|
+
this.name = name;
|
|
23
|
+
this.id = id;
|
|
24
|
+
this.starknetNetworks = opts.starknetNetworks;
|
|
25
|
+
this.chainRpcProviders = opts.chainRpcProviders;
|
|
26
|
+
(_a = this.chainRpcProviders) === null || _a === void 0 ? void 0 : _a.registerStarknetProviders();
|
|
27
|
+
this.walletBookWallet = opts.walletBookWallet;
|
|
28
|
+
this.logger = new Logger(this.name);
|
|
29
|
+
}
|
|
30
|
+
connect() {
|
|
31
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
yield this.getAddress();
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
getAddress() {
|
|
36
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
+
var _a;
|
|
38
|
+
if ((_a = this.walletData) === null || _a === void 0 ? void 0 : _a.account) {
|
|
39
|
+
return this.walletData.account;
|
|
40
|
+
}
|
|
41
|
+
this.logger.debug('[getAddress] Prompting new connection');
|
|
42
|
+
const { wallet, data } = yield this.prompt({
|
|
43
|
+
silently: false,
|
|
44
|
+
});
|
|
45
|
+
this.logger.debug(`[getAddress] Connection returned account: ${data === null || data === void 0 ? void 0 : data.account}, wallet: ${wallet}`);
|
|
46
|
+
if (!wallet || !data) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
this.wallet = wallet;
|
|
50
|
+
this.walletData = data;
|
|
51
|
+
this.setupEventListeners();
|
|
52
|
+
return this.walletData.account;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* returns starknet wallet network id
|
|
57
|
+
*/
|
|
58
|
+
getNetwork() {
|
|
59
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
60
|
+
var _a;
|
|
61
|
+
if (!((_a = this.walletData) === null || _a === void 0 ? void 0 : _a.chainId)) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
return num.toHex(this.walletData.chainId);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
getBalance(address) {
|
|
68
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
+
const wallet = yield this.getWalletAccount();
|
|
70
|
+
if (!wallet) {
|
|
71
|
+
this.logger.error('Could not find provider for getting balance');
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
const contract = new Contract(ETH_CONTRACT_ABI, ETH_STARKNET_ADDRESS, wallet);
|
|
75
|
+
try {
|
|
76
|
+
const { balance } = yield contract.balanceOf(address);
|
|
77
|
+
/**
|
|
78
|
+
* Dividing by 1e18 as the returned balance is a Gwei number.
|
|
79
|
+
* Read more here: https://www.investopedia.com/terms/g/gwei-ethereum.asp#toc-what-is-gwei
|
|
80
|
+
*/
|
|
81
|
+
return (Number(cairo.uint256(balance.low).low) / 1e18).toFixed(6);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
this.logger.error(error);
|
|
85
|
+
throw new DynamicError('Something went wrong');
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
signMessage(messageToSign) {
|
|
90
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
const [walletAddress, chainId] = yield Promise.all([
|
|
92
|
+
this.getAddress(),
|
|
93
|
+
this.getNetwork(),
|
|
94
|
+
]);
|
|
95
|
+
const assertions = [
|
|
96
|
+
[walletAddress, 'No address for wallet'],
|
|
97
|
+
[chainId, 'No chainId for wallet'],
|
|
98
|
+
[this.wallet, 'No wallet provider'],
|
|
99
|
+
];
|
|
100
|
+
for (const [value, message] of assertions) {
|
|
101
|
+
if (!value) {
|
|
102
|
+
this.logger.error(`[signMessage] ${message}. Make sure \`connect\` was called first`);
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const encodedMessage = formatTypedDataMessage(messageToSign, chainId);
|
|
107
|
+
// justification: performing assertion above
|
|
108
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
109
|
+
const signature = yield this.wallet.request({
|
|
110
|
+
params: encodedMessage,
|
|
111
|
+
type: 'wallet_signTypedData',
|
|
112
|
+
});
|
|
113
|
+
return signature === null || signature === void 0 ? void 0 : signature.join(',');
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
getWalletAccount() {
|
|
117
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
+
if (!this.wallet) {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
return new WalletAccount(yield this.getProvider(), this.wallet);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
getProvider() {
|
|
125
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
126
|
+
const rpcUrl = yield this.resolveRpcUrl();
|
|
127
|
+
this.logger.debug(`[getProvider] using rpcUrl: ${rpcUrl}`);
|
|
128
|
+
return new RpcProvider({ nodeUrl: rpcUrl });
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
isInstalledOnBrowser() {
|
|
132
|
+
return Boolean(window[`starknet_${this.id}`]);
|
|
133
|
+
}
|
|
134
|
+
endSession() {
|
|
135
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
this.teardownEventListeners();
|
|
137
|
+
this.wallet = undefined;
|
|
138
|
+
this.walletData = undefined;
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
setupEventListeners() {
|
|
142
|
+
if (!this.canSetEventListeners)
|
|
143
|
+
return;
|
|
144
|
+
if (!this.wallet) {
|
|
145
|
+
this.logger.debug('[setupEventListeners] Not connected, returning early');
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
this.handleAccountChange = (accounts) => __awaiter(this, void 0, void 0, function* () {
|
|
149
|
+
var _a;
|
|
150
|
+
this.logger.debug(`[accountsChanged] Received argument: ${accounts === null || accounts === void 0 ? void 0 : accounts.toString()}`);
|
|
151
|
+
if (!accounts || accounts[0] === null) {
|
|
152
|
+
this.emit('disconnect');
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const [address] = accounts;
|
|
156
|
+
if (address) {
|
|
157
|
+
this.walletData = {
|
|
158
|
+
account: address,
|
|
159
|
+
chainId: (_a = this.walletData) === null || _a === void 0 ? void 0 : _a.chainId,
|
|
160
|
+
};
|
|
161
|
+
this.emit('accountChange', { accounts: [address.toString()] });
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
this.handleNetworkChange = (chainId) => __awaiter(this, void 0, void 0, function* () {
|
|
165
|
+
var _b;
|
|
166
|
+
this.logger.debug(`[networkChanged] Received argument: ${chainId === null || chainId === void 0 ? void 0 : chainId.toString()}`);
|
|
167
|
+
if (!chainId) {
|
|
168
|
+
this.emit('disconnect');
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
this.walletData = {
|
|
172
|
+
account: (_b = this.walletData) === null || _b === void 0 ? void 0 : _b.account,
|
|
173
|
+
chainId: BigInt(chainId),
|
|
174
|
+
};
|
|
175
|
+
this.emit('chainChange', { chain: chainId });
|
|
176
|
+
});
|
|
177
|
+
this.logger.debug('[setupEventListeners] Setting up accountsChanged and networkChanged');
|
|
178
|
+
this.wallet.on('accountsChanged', this.handleAccountChange);
|
|
179
|
+
this.wallet.on('networkChanged', this.handleNetworkChange);
|
|
180
|
+
}
|
|
181
|
+
teardownEventListeners() {
|
|
182
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
183
|
+
var _a, _b;
|
|
184
|
+
if (!this.canSetEventListeners)
|
|
185
|
+
return;
|
|
186
|
+
if (this.handleAccountChange) {
|
|
187
|
+
(_a = this.wallet) === null || _a === void 0 ? void 0 : _a.off('accountsChanged', this.handleAccountChange);
|
|
188
|
+
this.handleAccountChange = undefined;
|
|
189
|
+
}
|
|
190
|
+
if (this.handleNetworkChange) {
|
|
191
|
+
(_b = this.wallet) === null || _b === void 0 ? void 0 : _b.off('networkChanged', this.handleNetworkChange);
|
|
192
|
+
this.handleNetworkChange = undefined;
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
resolveRpcUrl() {
|
|
197
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
198
|
+
var _a;
|
|
199
|
+
const chainId = yield this.getNetwork();
|
|
200
|
+
if (!chainId) {
|
|
201
|
+
this.logger.warn('[resolveRpcUrl] `getNetwork` returned undefined');
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
const networkConfig = this.starknetNetworks.find((config) => config.chainId === chainId);
|
|
205
|
+
if (!networkConfig) {
|
|
206
|
+
this.logger.warn(`[resolveRpcUrl] Network configuration for chainId \`${chainId}\` is not found in starknetNetworks`);
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
return (((_a = networkConfig.privateCustomerRpcUrls) === null || _a === void 0 ? void 0 : _a[0]) || networkConfig.rpcUrls[0]);
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
mapChainIdToNetworkName(chainIdOrNetworkName) {
|
|
213
|
+
if (chainIdOrNetworkName === constants.StarknetChainId.SN_MAIN ||
|
|
214
|
+
chainIdOrNetworkName === constants.NetworkName.SN_MAIN) {
|
|
215
|
+
return constants.NetworkName.SN_MAIN;
|
|
216
|
+
}
|
|
217
|
+
else if (chainIdOrNetworkName === constants.StarknetChainId.SN_SEPOLIA ||
|
|
218
|
+
chainIdOrNetworkName === constants.NetworkName.SN_SEPOLIA) {
|
|
219
|
+
return constants.NetworkName.SN_SEPOLIA;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
this.logger.error('Unknown chainId', chainIdOrNetworkName);
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export { StarknetWalletConnector };
|
package/src/index.cjs
CHANGED
|
@@ -5,29 +5,31 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
|
|
6
6
|
var assertPackageVersion = require('@dynamic-labs/assert-package-version');
|
|
7
7
|
var _package = require('../package.cjs');
|
|
8
|
-
var argentx = require('./wallets/argentx.cjs');
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var metamask = require('./wallets/metamask.cjs');
|
|
8
|
+
var argentx = require('./wallets/argent/injected/argentx.cjs');
|
|
9
|
+
var argentMobile = require('./wallets/argent/argentMobile/argentMobile.cjs');
|
|
10
|
+
var webwallet = require('./wallets/argent/webwallet/webwallet.cjs');
|
|
11
|
+
var metamask = require('./wallets/injected/metamask.cjs');
|
|
12
|
+
var fetchStarknetInjectedWalletConnectors = require('./wallets/injected/fetchStarknetInjectedWalletConnectors.cjs');
|
|
13
|
+
var braavos = require('./wallets/injected/braavos.cjs');
|
|
15
14
|
require('@dynamic-labs/starknet-core');
|
|
16
15
|
var StarknetWallet = require('./wallet/StarknetWallet.cjs');
|
|
17
16
|
var isStarknetWallet = require('./wallet/isStarknetWallet/isStarknetWallet.cjs');
|
|
17
|
+
var StarknetWalletConnector = require('./StarknetWalletConnector.cjs');
|
|
18
|
+
var injected = require('./wallets/injected/injected.cjs');
|
|
18
19
|
|
|
19
20
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
20
21
|
assertPackageVersion.assertPackageVersion('@dynamic-labs/starknet', _package.version);
|
|
21
22
|
const StarknetWalletConnectors = (props) => [
|
|
23
|
+
...fetchStarknetInjectedWalletConnectors.fetchStarknetInjectedWalletConnectors(props),
|
|
22
24
|
argentx.ArgentX,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
argentxWeb.ArgentXWeb,
|
|
26
|
-
okx.Okx,
|
|
27
|
-
bitget.Bitget,
|
|
25
|
+
argentMobile.ArgentMobile,
|
|
26
|
+
webwallet.WebWallet,
|
|
28
27
|
metamask.MetaMask,
|
|
28
|
+
braavos.Braavos,
|
|
29
29
|
];
|
|
30
30
|
|
|
31
31
|
exports.StarknetWallet = StarknetWallet.StarknetWallet;
|
|
32
32
|
exports.isStarknetWallet = isStarknetWallet.isStarknetWallet;
|
|
33
|
+
exports.StarknetWalletConnector = StarknetWalletConnector.StarknetWalletConnector;
|
|
34
|
+
exports.StarknetInjectedConnector = injected.Injected;
|
|
33
35
|
exports.StarknetWalletConnectors = StarknetWalletConnectors;
|
package/src/index.d.ts
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { WebWallet } from './wallets/argent/webwallet/webwallet';
|
|
2
|
+
import type { ArgentMobileWalletConnectorType } from './wallets/argent/argentMobile/argentMobile';
|
|
3
|
+
import type { WebWalletConnectorType } from './wallets/argent/webwallet/webwallet';
|
|
2
4
|
import '@dynamic-labs/starknet-core';
|
|
3
|
-
export declare const StarknetWalletConnectors: (props: any) => (typeof
|
|
4
|
-
export type { StarknetWalletConnectorType } from './
|
|
5
|
-
export type { ArgentXWalletConnectorType } from './wallets/argentx';
|
|
6
|
-
export type {
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
export declare const StarknetWalletConnectors: (props: any) => (import("dist/packages/wallet-connector-core/src").WalletConnectorConstructor | typeof WebWallet)[];
|
|
6
|
+
export type { StarknetWalletConnectorType } from './StarknetWalletConnector';
|
|
7
|
+
export type { ArgentXWalletConnectorType } from './wallets/argent/injected/argentx';
|
|
8
|
+
export type {
|
|
9
|
+
/** Deprecated. Use ArgentMobileWalletConnectorType */
|
|
10
|
+
ArgentMobileWalletConnectorType as ArgentXMobileWalletConnectorType, };
|
|
11
|
+
export type { ArgentMobileWalletConnectorType };
|
|
12
|
+
export type {
|
|
13
|
+
/** Deprecated. Use WebWalletConnectorType */
|
|
14
|
+
WebWalletConnectorType as ArgentXWebWalletConnectorType, };
|
|
15
|
+
export type { WebWalletConnectorType };
|
|
9
16
|
export { StarknetWallet, isStarknetWallet } from './wallet';
|
|
17
|
+
export { StarknetWalletConnector } from './StarknetWalletConnector';
|
|
18
|
+
export { Injected as StarknetInjectedConnector } from './wallets/injected/injected';
|
package/src/index.js
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
import { assertPackageVersion } from '@dynamic-labs/assert-package-version';
|
|
3
3
|
import { version } from '../package.js';
|
|
4
|
-
import { ArgentX } from './wallets/argentx.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { MetaMask } from './wallets/metamask.js';
|
|
4
|
+
import { ArgentX } from './wallets/argent/injected/argentx.js';
|
|
5
|
+
import { ArgentMobile } from './wallets/argent/argentMobile/argentMobile.js';
|
|
6
|
+
import { WebWallet } from './wallets/argent/webwallet/webwallet.js';
|
|
7
|
+
import { MetaMask } from './wallets/injected/metamask.js';
|
|
8
|
+
import { fetchStarknetInjectedWalletConnectors } from './wallets/injected/fetchStarknetInjectedWalletConnectors.js';
|
|
9
|
+
import { Braavos } from './wallets/injected/braavos.js';
|
|
11
10
|
import '@dynamic-labs/starknet-core';
|
|
12
11
|
export { StarknetWallet } from './wallet/StarknetWallet.js';
|
|
13
12
|
export { isStarknetWallet } from './wallet/isStarknetWallet/isStarknetWallet.js';
|
|
13
|
+
export { StarknetWalletConnector } from './StarknetWalletConnector.js';
|
|
14
|
+
export { Injected as StarknetInjectedConnector } from './wallets/injected/injected.js';
|
|
14
15
|
|
|
15
16
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
16
17
|
assertPackageVersion('@dynamic-labs/starknet', version);
|
|
17
18
|
const StarknetWalletConnectors = (props) => [
|
|
19
|
+
...fetchStarknetInjectedWalletConnectors(props),
|
|
18
20
|
ArgentX,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
ArgentXWeb,
|
|
22
|
-
Okx,
|
|
23
|
-
Bitget,
|
|
21
|
+
ArgentMobile,
|
|
22
|
+
WebWallet,
|
|
24
23
|
MetaMask,
|
|
24
|
+
Braavos,
|
|
25
25
|
];
|
|
26
26
|
|
|
27
27
|
export { StarknetWalletConnectors };
|
package/src/types.d.ts
CHANGED
|
@@ -1,11 +1,26 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
1
|
+
import { StarknetWindowObject } from '@starknet-io/types-js';
|
|
2
|
+
import { IChainRpcProviders } from '@dynamic-labs/rpc-providers';
|
|
3
|
+
import { NetworkConfiguration } from '@dynamic-labs/sdk-api-core';
|
|
4
|
+
import { WalletBookSchema, WalletSchema } from '@dynamic-labs/wallet-book';
|
|
5
|
+
import { WalletMetadata } from '@dynamic-labs/wallet-connector-core';
|
|
6
|
+
/** Models the currently active Starknet wallet data */
|
|
7
|
+
export type WalletData = {
|
|
8
|
+
account: string | undefined;
|
|
9
|
+
chainId: bigint | undefined;
|
|
10
|
+
};
|
|
11
|
+
/** Options to pass to the prompt call which triggers a connection to a wallet */
|
|
12
|
+
export type PromptOptions = {
|
|
13
|
+
/** Whether or not a wallet popup is desired */
|
|
14
|
+
silently: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type PromptResult = {
|
|
17
|
+
wallet: StarknetWindowObject | undefined;
|
|
18
|
+
data: WalletData | undefined;
|
|
19
|
+
};
|
|
20
|
+
export type StarknetWalletConnectorProps = {
|
|
21
|
+
chainRpcProviders: IChainRpcProviders;
|
|
22
|
+
starknetNetworks: NetworkConfiguration[];
|
|
23
|
+
walletBook: WalletBookSchema;
|
|
24
|
+
walletBookWallet: WalletSchema;
|
|
25
|
+
metadata?: WalletMetadata;
|
|
26
|
+
};
|