@phantom/embedded-provider-core 0.1.9 → 1.0.0-beta.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/index.d.mts +50 -1
- package/dist/index.d.ts +50 -1
- package/dist/index.js +197 -10
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +196 -11
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -7
package/dist/index.d.mts
CHANGED
|
@@ -2,6 +2,7 @@ import { StamperWithKeyManagement } from '@phantom/sdk-types';
|
|
|
2
2
|
import { AddressType } from '@phantom/client';
|
|
3
3
|
import { NetworkId } from '@phantom/constants';
|
|
4
4
|
import { ParsedSignatureResult, ParsedTransactionResult } from '@phantom/parsers';
|
|
5
|
+
import { ISolanaChain, IEthereumChain, EthTransactionRequest } from '@phantom/chains';
|
|
5
6
|
|
|
6
7
|
interface Keypair {
|
|
7
8
|
publicKey: string;
|
|
@@ -28,6 +29,7 @@ interface Session {
|
|
|
28
29
|
authenticatorExpiresAt: number;
|
|
29
30
|
lastRenewalAttempt?: number;
|
|
30
31
|
username: string;
|
|
32
|
+
accountDerivationIndex?: number;
|
|
31
33
|
}
|
|
32
34
|
interface EmbeddedStorage {
|
|
33
35
|
getSession(): Promise<Session | null>;
|
|
@@ -59,6 +61,7 @@ interface AuthResult {
|
|
|
59
61
|
walletId: string;
|
|
60
62
|
provider?: string;
|
|
61
63
|
userInfo?: Record<string, any>;
|
|
64
|
+
accountDerivationIndex?: number;
|
|
62
65
|
}
|
|
63
66
|
interface PhantomConnectOptions {
|
|
64
67
|
organizationId: string;
|
|
@@ -152,6 +155,8 @@ declare class EmbeddedProvider {
|
|
|
152
155
|
private walletId;
|
|
153
156
|
private addresses;
|
|
154
157
|
private jwtAuth;
|
|
158
|
+
readonly solana: ISolanaChain;
|
|
159
|
+
readonly ethereum: IEthereumChain;
|
|
155
160
|
private eventListeners;
|
|
156
161
|
constructor(config: EmbeddedProviderConfig, platform: PlatformAdapter, logger: DebugLogger);
|
|
157
162
|
on(event: EmbeddedProviderEvent, callback: EventCallback): void;
|
|
@@ -187,6 +192,50 @@ declare function generateSessionId(): string;
|
|
|
187
192
|
|
|
188
193
|
declare function retryWithBackoff<T>(operation: () => Promise<T>, operationName: string, logger: DebugLogger, maxRetries?: number, baseDelay?: number): Promise<T>;
|
|
189
194
|
|
|
195
|
+
/**
|
|
196
|
+
* Embedded Solana chain implementation for React Native and web embedded providers
|
|
197
|
+
*/
|
|
198
|
+
declare class EmbeddedSolanaChain implements ISolanaChain {
|
|
199
|
+
private provider;
|
|
200
|
+
private currentNetworkId;
|
|
201
|
+
constructor(provider: EmbeddedProvider);
|
|
202
|
+
private ensureConnected;
|
|
203
|
+
signMessage(message: string): Promise<ParsedSignatureResult>;
|
|
204
|
+
signTransaction<T>(_transaction: T): Promise<T>;
|
|
205
|
+
signAndSendTransaction<T>(transaction: T): Promise<ParsedTransactionResult>;
|
|
206
|
+
connect(_options?: {
|
|
207
|
+
onlyIfTrusted?: boolean;
|
|
208
|
+
}): Promise<{
|
|
209
|
+
publicKey: string;
|
|
210
|
+
}>;
|
|
211
|
+
disconnect(): Promise<void>;
|
|
212
|
+
switchNetwork(network: 'mainnet' | 'devnet'): Promise<void>;
|
|
213
|
+
getPublicKey(): Promise<string | null>;
|
|
214
|
+
isConnected(): boolean;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Embedded Ethereum chain implementation for React Native and web embedded providers
|
|
219
|
+
*/
|
|
220
|
+
declare class EmbeddedEthereumChain implements IEthereumChain {
|
|
221
|
+
private provider;
|
|
222
|
+
private currentNetworkId;
|
|
223
|
+
constructor(provider: EmbeddedProvider);
|
|
224
|
+
private ensureConnected;
|
|
225
|
+
request<T = any>(args: {
|
|
226
|
+
method: string;
|
|
227
|
+
params?: unknown[];
|
|
228
|
+
}): Promise<T>;
|
|
229
|
+
signPersonalMessage(message: string, address: string): Promise<ParsedSignatureResult>;
|
|
230
|
+
signTypedData(typedData: any, address: string): Promise<ParsedSignatureResult>;
|
|
231
|
+
sendTransaction(transaction: EthTransactionRequest): Promise<ParsedTransactionResult>;
|
|
232
|
+
switchChain(chainId: number): Promise<void>;
|
|
233
|
+
getChainId(): Promise<number>;
|
|
234
|
+
getAccounts(): Promise<string[]>;
|
|
235
|
+
isConnected(): boolean;
|
|
236
|
+
private handleEmbeddedRequest;
|
|
237
|
+
}
|
|
238
|
+
|
|
190
239
|
/**
|
|
191
240
|
* Constants for authenticator lifecycle management
|
|
192
241
|
*/
|
|
@@ -203,4 +252,4 @@ declare const AUTHENTICATOR_EXPIRATION_TIME_MS: number;
|
|
|
203
252
|
*/
|
|
204
253
|
declare const AUTHENTICATOR_RENEWAL_WINDOW_MS: number;
|
|
205
254
|
|
|
206
|
-
export { AUTHENTICATOR_EXPIRATION_TIME_MS, AUTHENTICATOR_RENEWAL_WINDOW_MS, AuthOptions, AuthProvider, AuthResult, ConnectResult, DebugLogger, EmbeddedProvider, EmbeddedProviderConfig, EmbeddedProviderEvent, EmbeddedStorage, EventCallback, JWTAuth, JWTAuthOptions, Keypair, PhantomConnectOptions, PlatformAdapter, Session, SignAndSendTransactionParams, SignMessageParams, SignMessageResult, SignedTransaction, StamperInfo, URLParamsAccessor, WalletAddress, generateSessionId, retryWithBackoff };
|
|
255
|
+
export { AUTHENTICATOR_EXPIRATION_TIME_MS, AUTHENTICATOR_RENEWAL_WINDOW_MS, AuthOptions, AuthProvider, AuthResult, ConnectResult, DebugLogger, EmbeddedEthereumChain, EmbeddedProvider, EmbeddedProviderConfig, EmbeddedProviderEvent, EmbeddedSolanaChain, EmbeddedStorage, EventCallback, JWTAuth, JWTAuthOptions, Keypair, PhantomConnectOptions, PlatformAdapter, Session, SignAndSendTransactionParams, SignMessageParams, SignMessageResult, SignedTransaction, StamperInfo, URLParamsAccessor, WalletAddress, generateSessionId, retryWithBackoff };
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { StamperWithKeyManagement } from '@phantom/sdk-types';
|
|
|
2
2
|
import { AddressType } from '@phantom/client';
|
|
3
3
|
import { NetworkId } from '@phantom/constants';
|
|
4
4
|
import { ParsedSignatureResult, ParsedTransactionResult } from '@phantom/parsers';
|
|
5
|
+
import { ISolanaChain, IEthereumChain, EthTransactionRequest } from '@phantom/chains';
|
|
5
6
|
|
|
6
7
|
interface Keypair {
|
|
7
8
|
publicKey: string;
|
|
@@ -28,6 +29,7 @@ interface Session {
|
|
|
28
29
|
authenticatorExpiresAt: number;
|
|
29
30
|
lastRenewalAttempt?: number;
|
|
30
31
|
username: string;
|
|
32
|
+
accountDerivationIndex?: number;
|
|
31
33
|
}
|
|
32
34
|
interface EmbeddedStorage {
|
|
33
35
|
getSession(): Promise<Session | null>;
|
|
@@ -59,6 +61,7 @@ interface AuthResult {
|
|
|
59
61
|
walletId: string;
|
|
60
62
|
provider?: string;
|
|
61
63
|
userInfo?: Record<string, any>;
|
|
64
|
+
accountDerivationIndex?: number;
|
|
62
65
|
}
|
|
63
66
|
interface PhantomConnectOptions {
|
|
64
67
|
organizationId: string;
|
|
@@ -152,6 +155,8 @@ declare class EmbeddedProvider {
|
|
|
152
155
|
private walletId;
|
|
153
156
|
private addresses;
|
|
154
157
|
private jwtAuth;
|
|
158
|
+
readonly solana: ISolanaChain;
|
|
159
|
+
readonly ethereum: IEthereumChain;
|
|
155
160
|
private eventListeners;
|
|
156
161
|
constructor(config: EmbeddedProviderConfig, platform: PlatformAdapter, logger: DebugLogger);
|
|
157
162
|
on(event: EmbeddedProviderEvent, callback: EventCallback): void;
|
|
@@ -187,6 +192,50 @@ declare function generateSessionId(): string;
|
|
|
187
192
|
|
|
188
193
|
declare function retryWithBackoff<T>(operation: () => Promise<T>, operationName: string, logger: DebugLogger, maxRetries?: number, baseDelay?: number): Promise<T>;
|
|
189
194
|
|
|
195
|
+
/**
|
|
196
|
+
* Embedded Solana chain implementation for React Native and web embedded providers
|
|
197
|
+
*/
|
|
198
|
+
declare class EmbeddedSolanaChain implements ISolanaChain {
|
|
199
|
+
private provider;
|
|
200
|
+
private currentNetworkId;
|
|
201
|
+
constructor(provider: EmbeddedProvider);
|
|
202
|
+
private ensureConnected;
|
|
203
|
+
signMessage(message: string): Promise<ParsedSignatureResult>;
|
|
204
|
+
signTransaction<T>(_transaction: T): Promise<T>;
|
|
205
|
+
signAndSendTransaction<T>(transaction: T): Promise<ParsedTransactionResult>;
|
|
206
|
+
connect(_options?: {
|
|
207
|
+
onlyIfTrusted?: boolean;
|
|
208
|
+
}): Promise<{
|
|
209
|
+
publicKey: string;
|
|
210
|
+
}>;
|
|
211
|
+
disconnect(): Promise<void>;
|
|
212
|
+
switchNetwork(network: 'mainnet' | 'devnet'): Promise<void>;
|
|
213
|
+
getPublicKey(): Promise<string | null>;
|
|
214
|
+
isConnected(): boolean;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Embedded Ethereum chain implementation for React Native and web embedded providers
|
|
219
|
+
*/
|
|
220
|
+
declare class EmbeddedEthereumChain implements IEthereumChain {
|
|
221
|
+
private provider;
|
|
222
|
+
private currentNetworkId;
|
|
223
|
+
constructor(provider: EmbeddedProvider);
|
|
224
|
+
private ensureConnected;
|
|
225
|
+
request<T = any>(args: {
|
|
226
|
+
method: string;
|
|
227
|
+
params?: unknown[];
|
|
228
|
+
}): Promise<T>;
|
|
229
|
+
signPersonalMessage(message: string, address: string): Promise<ParsedSignatureResult>;
|
|
230
|
+
signTypedData(typedData: any, address: string): Promise<ParsedSignatureResult>;
|
|
231
|
+
sendTransaction(transaction: EthTransactionRequest): Promise<ParsedTransactionResult>;
|
|
232
|
+
switchChain(chainId: number): Promise<void>;
|
|
233
|
+
getChainId(): Promise<number>;
|
|
234
|
+
getAccounts(): Promise<string[]>;
|
|
235
|
+
isConnected(): boolean;
|
|
236
|
+
private handleEmbeddedRequest;
|
|
237
|
+
}
|
|
238
|
+
|
|
190
239
|
/**
|
|
191
240
|
* Constants for authenticator lifecycle management
|
|
192
241
|
*/
|
|
@@ -203,4 +252,4 @@ declare const AUTHENTICATOR_EXPIRATION_TIME_MS: number;
|
|
|
203
252
|
*/
|
|
204
253
|
declare const AUTHENTICATOR_RENEWAL_WINDOW_MS: number;
|
|
205
254
|
|
|
206
|
-
export { AUTHENTICATOR_EXPIRATION_TIME_MS, AUTHENTICATOR_RENEWAL_WINDOW_MS, AuthOptions, AuthProvider, AuthResult, ConnectResult, DebugLogger, EmbeddedProvider, EmbeddedProviderConfig, EmbeddedProviderEvent, EmbeddedStorage, EventCallback, JWTAuth, JWTAuthOptions, Keypair, PhantomConnectOptions, PlatformAdapter, Session, SignAndSendTransactionParams, SignMessageParams, SignMessageResult, SignedTransaction, StamperInfo, URLParamsAccessor, WalletAddress, generateSessionId, retryWithBackoff };
|
|
255
|
+
export { AUTHENTICATOR_EXPIRATION_TIME_MS, AUTHENTICATOR_RENEWAL_WINDOW_MS, AuthOptions, AuthProvider, AuthResult, ConnectResult, DebugLogger, EmbeddedEthereumChain, EmbeddedProvider, EmbeddedProviderConfig, EmbeddedProviderEvent, EmbeddedSolanaChain, EmbeddedStorage, EventCallback, JWTAuth, JWTAuthOptions, Keypair, PhantomConnectOptions, PlatformAdapter, Session, SignAndSendTransactionParams, SignMessageParams, SignMessageResult, SignedTransaction, StamperInfo, URLParamsAccessor, WalletAddress, generateSessionId, retryWithBackoff };
|
package/dist/index.js
CHANGED
|
@@ -32,7 +32,9 @@ var src_exports = {};
|
|
|
32
32
|
__export(src_exports, {
|
|
33
33
|
AUTHENTICATOR_EXPIRATION_TIME_MS: () => AUTHENTICATOR_EXPIRATION_TIME_MS,
|
|
34
34
|
AUTHENTICATOR_RENEWAL_WINDOW_MS: () => AUTHENTICATOR_RENEWAL_WINDOW_MS,
|
|
35
|
+
EmbeddedEthereumChain: () => EmbeddedEthereumChain,
|
|
35
36
|
EmbeddedProvider: () => EmbeddedProvider,
|
|
37
|
+
EmbeddedSolanaChain: () => EmbeddedSolanaChain,
|
|
36
38
|
JWTAuth: () => JWTAuth,
|
|
37
39
|
generateSessionId: () => generateSessionId,
|
|
38
40
|
retryWithBackoff: () => retryWithBackoff
|
|
@@ -43,7 +45,7 @@ module.exports = __toCommonJS(src_exports);
|
|
|
43
45
|
var import_client = require("@phantom/client");
|
|
44
46
|
var import_base64url = require("@phantom/base64url");
|
|
45
47
|
var import_bs58 = __toESM(require("bs58"));
|
|
46
|
-
var
|
|
48
|
+
var import_parsers3 = require("@phantom/parsers");
|
|
47
49
|
|
|
48
50
|
// src/constants.ts
|
|
49
51
|
var AUTHENTICATOR_EXPIRATION_TIME_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
@@ -165,6 +167,170 @@ async function retryWithBackoff(operation, operationName, logger, maxRetries = 3
|
|
|
165
167
|
throw lastError;
|
|
166
168
|
}
|
|
167
169
|
|
|
170
|
+
// src/chains/SolanaChain.ts
|
|
171
|
+
var import_constants = require("@phantom/constants");
|
|
172
|
+
var import_parsers = require("@phantom/parsers");
|
|
173
|
+
var EmbeddedSolanaChain = class {
|
|
174
|
+
constructor(provider) {
|
|
175
|
+
this.provider = provider;
|
|
176
|
+
this.currentNetworkId = import_constants.NetworkId.SOLANA_MAINNET;
|
|
177
|
+
}
|
|
178
|
+
ensureConnected() {
|
|
179
|
+
if (!this.provider.isConnected()) {
|
|
180
|
+
throw new Error("Solana chain not available. Ensure SDK is connected.");
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async signMessage(message) {
|
|
184
|
+
this.ensureConnected();
|
|
185
|
+
const result = await this.provider.signMessage({
|
|
186
|
+
message,
|
|
187
|
+
networkId: this.currentNetworkId
|
|
188
|
+
});
|
|
189
|
+
return (0, import_parsers.parseSignMessageResponse)(result.signature, this.currentNetworkId);
|
|
190
|
+
}
|
|
191
|
+
signTransaction(_transaction) {
|
|
192
|
+
this.ensureConnected();
|
|
193
|
+
throw new Error("signTransaction not yet implemented for embedded provider");
|
|
194
|
+
}
|
|
195
|
+
async signAndSendTransaction(transaction) {
|
|
196
|
+
this.ensureConnected();
|
|
197
|
+
const result = await this.provider.signAndSendTransaction({
|
|
198
|
+
transaction,
|
|
199
|
+
networkId: this.currentNetworkId
|
|
200
|
+
});
|
|
201
|
+
return (0, import_parsers.parseTransactionResponse)(result.rawTransaction, this.currentNetworkId, result.hash);
|
|
202
|
+
}
|
|
203
|
+
connect(_options) {
|
|
204
|
+
const addresses = this.provider.getAddresses();
|
|
205
|
+
const solanaAddr = addresses.find((a) => a.addressType === "Solana");
|
|
206
|
+
if (!solanaAddr)
|
|
207
|
+
throw new Error("No Solana address found");
|
|
208
|
+
return Promise.resolve({ publicKey: solanaAddr.address });
|
|
209
|
+
}
|
|
210
|
+
async disconnect() {
|
|
211
|
+
return this.provider.disconnect();
|
|
212
|
+
}
|
|
213
|
+
switchNetwork(network) {
|
|
214
|
+
this.currentNetworkId = network === "mainnet" ? import_constants.NetworkId.SOLANA_MAINNET : import_constants.NetworkId.SOLANA_DEVNET;
|
|
215
|
+
return Promise.resolve();
|
|
216
|
+
}
|
|
217
|
+
getPublicKey() {
|
|
218
|
+
if (!this.provider.isConnected())
|
|
219
|
+
return Promise.resolve(null);
|
|
220
|
+
const addresses = this.provider.getAddresses();
|
|
221
|
+
const solanaAddr = addresses.find((a) => a.addressType === "Solana");
|
|
222
|
+
return Promise.resolve(solanaAddr?.address || null);
|
|
223
|
+
}
|
|
224
|
+
isConnected() {
|
|
225
|
+
return this.provider.isConnected();
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
// src/chains/EthereumChain.ts
|
|
230
|
+
var import_constants2 = require("@phantom/constants");
|
|
231
|
+
var import_parsers2 = require("@phantom/parsers");
|
|
232
|
+
var EmbeddedEthereumChain = class {
|
|
233
|
+
constructor(provider) {
|
|
234
|
+
this.provider = provider;
|
|
235
|
+
this.currentNetworkId = import_constants2.NetworkId.ETHEREUM_MAINNET;
|
|
236
|
+
}
|
|
237
|
+
ensureConnected() {
|
|
238
|
+
if (!this.provider.isConnected()) {
|
|
239
|
+
throw new Error("Ethereum chain not available. Ensure SDK is connected.");
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
async request(args) {
|
|
243
|
+
this.ensureConnected();
|
|
244
|
+
return this.handleEmbeddedRequest(args);
|
|
245
|
+
}
|
|
246
|
+
async signPersonalMessage(message, address) {
|
|
247
|
+
const signature = await this.request({
|
|
248
|
+
method: "personal_sign",
|
|
249
|
+
params: [message, address]
|
|
250
|
+
});
|
|
251
|
+
return (0, import_parsers2.parseSignMessageResponse)(signature, this.currentNetworkId);
|
|
252
|
+
}
|
|
253
|
+
async signTypedData(typedData, address) {
|
|
254
|
+
const signature = await this.request({
|
|
255
|
+
method: "eth_signTypedData_v4",
|
|
256
|
+
params: [address, JSON.stringify(typedData)]
|
|
257
|
+
});
|
|
258
|
+
return (0, import_parsers2.parseSignMessageResponse)(signature, this.currentNetworkId);
|
|
259
|
+
}
|
|
260
|
+
async sendTransaction(transaction) {
|
|
261
|
+
const result = await this.provider.signAndSendTransaction({
|
|
262
|
+
transaction,
|
|
263
|
+
networkId: this.currentNetworkId
|
|
264
|
+
});
|
|
265
|
+
return (0, import_parsers2.parseTransactionResponse)(result.rawTransaction, this.currentNetworkId, result.hash);
|
|
266
|
+
}
|
|
267
|
+
switchChain(chainId) {
|
|
268
|
+
const networkId = (0, import_constants2.chainIdToNetworkId)(chainId);
|
|
269
|
+
if (!networkId) {
|
|
270
|
+
return Promise.reject(new Error(`Unsupported chainId: ${chainId}`));
|
|
271
|
+
}
|
|
272
|
+
this.currentNetworkId = networkId;
|
|
273
|
+
return Promise.resolve();
|
|
274
|
+
}
|
|
275
|
+
getChainId() {
|
|
276
|
+
const chainId = (0, import_constants2.networkIdToChainId)(this.currentNetworkId);
|
|
277
|
+
return Promise.resolve(chainId || 1);
|
|
278
|
+
}
|
|
279
|
+
async getAccounts() {
|
|
280
|
+
return this.request({ method: "eth_accounts" });
|
|
281
|
+
}
|
|
282
|
+
isConnected() {
|
|
283
|
+
return this.provider.isConnected();
|
|
284
|
+
}
|
|
285
|
+
async handleEmbeddedRequest(args) {
|
|
286
|
+
switch (args.method) {
|
|
287
|
+
case "personal_sign": {
|
|
288
|
+
const [message, _address] = args.params;
|
|
289
|
+
const result = await this.provider.signMessage({
|
|
290
|
+
message,
|
|
291
|
+
networkId: this.currentNetworkId
|
|
292
|
+
});
|
|
293
|
+
return (0, import_parsers2.parseSignMessageResponse)(result.signature, this.currentNetworkId).signature;
|
|
294
|
+
}
|
|
295
|
+
case "eth_signTypedData_v4": {
|
|
296
|
+
const [_typedDataAddress, typedDataStr] = args.params;
|
|
297
|
+
const _typedData = JSON.parse(typedDataStr);
|
|
298
|
+
const typedDataResult = await this.provider.signMessage({
|
|
299
|
+
message: typedDataStr,
|
|
300
|
+
// Pass the stringified typed data as message
|
|
301
|
+
networkId: this.currentNetworkId
|
|
302
|
+
});
|
|
303
|
+
return (0, import_parsers2.parseSignMessageResponse)(typedDataResult.signature, this.currentNetworkId).signature;
|
|
304
|
+
}
|
|
305
|
+
case "eth_sendTransaction": {
|
|
306
|
+
const [transaction] = args.params;
|
|
307
|
+
const networkIdFromTx = transaction.chainId ? (0, import_constants2.chainIdToNetworkId)(typeof transaction.chainId === "number" ? transaction.chainId : parseInt(transaction.chainId, 16)) : null;
|
|
308
|
+
const sendResult = await this.provider.signAndSendTransaction({
|
|
309
|
+
transaction,
|
|
310
|
+
networkId: networkIdFromTx || this.currentNetworkId
|
|
311
|
+
});
|
|
312
|
+
return (0, import_parsers2.parseTransactionResponse)(sendResult.rawTransaction, this.currentNetworkId, sendResult.hash).hash;
|
|
313
|
+
}
|
|
314
|
+
case "eth_accounts": {
|
|
315
|
+
const addresses = this.provider.getAddresses();
|
|
316
|
+
const ethAddr = addresses.find((a) => a.addressType === "Ethereum");
|
|
317
|
+
return ethAddr ? [ethAddr.address] : [];
|
|
318
|
+
}
|
|
319
|
+
case "eth_chainId": {
|
|
320
|
+
return `0x${((0, import_constants2.networkIdToChainId)(this.currentNetworkId) || 1).toString(16)}`;
|
|
321
|
+
}
|
|
322
|
+
case "wallet_switchEthereumChain": {
|
|
323
|
+
const [{ chainId }] = args.params;
|
|
324
|
+
const numericChainId = parseInt(chainId, 16);
|
|
325
|
+
await this.switchChain(numericChainId);
|
|
326
|
+
return void 0;
|
|
327
|
+
}
|
|
328
|
+
default:
|
|
329
|
+
throw new Error(`Embedded provider doesn't support method: ${args.method}`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
|
|
168
334
|
// src/embedded-provider.ts
|
|
169
335
|
var EmbeddedProvider = class {
|
|
170
336
|
constructor(config, platform, logger) {
|
|
@@ -182,6 +348,8 @@ var EmbeddedProvider = class {
|
|
|
182
348
|
this.stamper = platform.stamper;
|
|
183
349
|
this.jwtAuth = new JWTAuth();
|
|
184
350
|
config.solanaProvider;
|
|
351
|
+
this.solana = new EmbeddedSolanaChain(this);
|
|
352
|
+
this.ethereum = new EmbeddedEthereumChain(this);
|
|
185
353
|
this.logger.info("EMBEDDED_PROVIDER", "EmbeddedProvider initialized");
|
|
186
354
|
}
|
|
187
355
|
/*
|
|
@@ -215,14 +383,17 @@ var EmbeddedProvider = class {
|
|
|
215
383
|
}
|
|
216
384
|
}
|
|
217
385
|
async getAndFilterWalletAddresses(walletId) {
|
|
386
|
+
const session = await this.storage.getSession();
|
|
387
|
+
const derivationIndex = session?.accountDerivationIndex ?? 0;
|
|
218
388
|
const addresses = await retryWithBackoff(
|
|
219
|
-
() => this.client.getWalletAddresses(walletId),
|
|
389
|
+
() => this.client.getWalletAddresses(walletId, void 0, derivationIndex),
|
|
220
390
|
"getWalletAddresses",
|
|
221
391
|
this.logger
|
|
222
392
|
).catch(async (error) => {
|
|
223
393
|
this.logger.error("EMBEDDED_PROVIDER", "getWalletAddresses failed after retries, disconnecting", {
|
|
224
394
|
walletId,
|
|
225
|
-
error: error.message
|
|
395
|
+
error: error.message,
|
|
396
|
+
derivationIndex
|
|
226
397
|
});
|
|
227
398
|
await this.storage.clearSession();
|
|
228
399
|
this.client = null;
|
|
@@ -572,17 +743,20 @@ var EmbeddedProvider = class {
|
|
|
572
743
|
walletId: this.walletId,
|
|
573
744
|
message: params.message
|
|
574
745
|
});
|
|
575
|
-
const parsedMessage = (0,
|
|
746
|
+
const parsedMessage = (0, import_parsers3.parseMessage)(params.message);
|
|
747
|
+
const session = await this.storage.getSession();
|
|
748
|
+
const derivationIndex = session?.accountDerivationIndex ?? 0;
|
|
576
749
|
const rawResponse = await this.client.signMessage({
|
|
577
750
|
walletId: this.walletId,
|
|
578
751
|
message: parsedMessage.base64url,
|
|
579
|
-
networkId: params.networkId
|
|
752
|
+
networkId: params.networkId,
|
|
753
|
+
derivationIndex
|
|
580
754
|
});
|
|
581
755
|
this.logger.info("EMBEDDED_PROVIDER", "Message signed successfully", {
|
|
582
756
|
walletId: this.walletId,
|
|
583
757
|
message: params.message
|
|
584
758
|
});
|
|
585
|
-
return (0,
|
|
759
|
+
return (0, import_parsers3.parseSignMessageResponse)(rawResponse, params.networkId);
|
|
586
760
|
}
|
|
587
761
|
async signAndSendTransaction(params) {
|
|
588
762
|
if (!this.client || !this.walletId) {
|
|
@@ -593,15 +767,19 @@ var EmbeddedProvider = class {
|
|
|
593
767
|
walletId: this.walletId,
|
|
594
768
|
networkId: params.networkId
|
|
595
769
|
});
|
|
596
|
-
const parsedTransaction = await (0,
|
|
770
|
+
const parsedTransaction = await (0, import_parsers3.parseTransactionToBase64Url)(params.transaction, params.networkId);
|
|
771
|
+
const session = await this.storage.getSession();
|
|
772
|
+
const derivationIndex = session?.accountDerivationIndex ?? 0;
|
|
597
773
|
this.logger.log("EMBEDDED_PROVIDER", "Parsed transaction for signing", {
|
|
598
774
|
walletId: this.walletId,
|
|
599
|
-
transaction: parsedTransaction
|
|
775
|
+
transaction: parsedTransaction,
|
|
776
|
+
derivationIndex
|
|
600
777
|
});
|
|
601
778
|
const rawResponse = await this.client.signAndSendTransaction({
|
|
602
779
|
walletId: this.walletId,
|
|
603
780
|
transaction: parsedTransaction.base64url,
|
|
604
|
-
networkId: params.networkId
|
|
781
|
+
networkId: params.networkId,
|
|
782
|
+
derivationIndex
|
|
605
783
|
});
|
|
606
784
|
this.logger.info("EMBEDDED_PROVIDER", "Transaction signed and sent successfully", {
|
|
607
785
|
walletId: this.walletId,
|
|
@@ -609,7 +787,7 @@ var EmbeddedProvider = class {
|
|
|
609
787
|
hash: rawResponse.hash,
|
|
610
788
|
rawTransaction: rawResponse.rawTransaction
|
|
611
789
|
});
|
|
612
|
-
return await (0,
|
|
790
|
+
return await (0, import_parsers3.parseTransactionResponse)(rawResponse.rawTransaction, params.networkId, rawResponse.hash);
|
|
613
791
|
}
|
|
614
792
|
getAddresses() {
|
|
615
793
|
return this.addresses;
|
|
@@ -658,6 +836,8 @@ var EmbeddedProvider = class {
|
|
|
658
836
|
stamperInfo,
|
|
659
837
|
authProvider: "app-wallet",
|
|
660
838
|
userInfo: { embeddedWalletType: this.config.embeddedWalletType },
|
|
839
|
+
accountDerivationIndex: 0,
|
|
840
|
+
// App wallets default to index 0
|
|
661
841
|
status: "completed",
|
|
662
842
|
createdAt: now,
|
|
663
843
|
lastUsed: now,
|
|
@@ -698,6 +878,7 @@ var EmbeddedProvider = class {
|
|
|
698
878
|
stamperInfo,
|
|
699
879
|
authProvider: authResult.provider,
|
|
700
880
|
userInfo: authResult.userInfo,
|
|
881
|
+
accountDerivationIndex: authResult.accountDerivationIndex,
|
|
701
882
|
status: "completed",
|
|
702
883
|
createdAt: now,
|
|
703
884
|
lastUsed: now,
|
|
@@ -731,6 +912,8 @@ var EmbeddedProvider = class {
|
|
|
731
912
|
stamperInfo,
|
|
732
913
|
authProvider: "phantom-connect",
|
|
733
914
|
userInfo: { provider: authOptions?.provider },
|
|
915
|
+
accountDerivationIndex: void 0,
|
|
916
|
+
// Will be set when redirect completes
|
|
734
917
|
status: "pending",
|
|
735
918
|
createdAt: now,
|
|
736
919
|
lastUsed: now,
|
|
@@ -769,6 +952,7 @@ var EmbeddedProvider = class {
|
|
|
769
952
|
});
|
|
770
953
|
tempSession.walletId = authResult.walletId;
|
|
771
954
|
tempSession.authProvider = authResult.provider || tempSession.authProvider;
|
|
955
|
+
tempSession.accountDerivationIndex = authResult.accountDerivationIndex;
|
|
772
956
|
tempSession.status = "completed";
|
|
773
957
|
tempSession.lastUsed = Date.now();
|
|
774
958
|
await this.storage.saveSession(tempSession);
|
|
@@ -784,6 +968,7 @@ var EmbeddedProvider = class {
|
|
|
784
968
|
}
|
|
785
969
|
session.walletId = authResult.walletId;
|
|
786
970
|
session.authProvider = authResult.provider || session.authProvider;
|
|
971
|
+
session.accountDerivationIndex = authResult.accountDerivationIndex;
|
|
787
972
|
session.status = "completed";
|
|
788
973
|
session.lastUsed = Date.now();
|
|
789
974
|
await this.storage.saveSession(session);
|
|
@@ -923,7 +1108,9 @@ var EmbeddedProvider = class {
|
|
|
923
1108
|
0 && (module.exports = {
|
|
924
1109
|
AUTHENTICATOR_EXPIRATION_TIME_MS,
|
|
925
1110
|
AUTHENTICATOR_RENEWAL_WINDOW_MS,
|
|
1111
|
+
EmbeddedEthereumChain,
|
|
926
1112
|
EmbeddedProvider,
|
|
1113
|
+
EmbeddedSolanaChain,
|
|
927
1114
|
JWTAuth,
|
|
928
1115
|
generateSessionId,
|
|
929
1116
|
retryWithBackoff
|