@phantom/embedded-provider-core 1.0.2 → 1.0.4
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 +21 -11
- package/dist/index.d.ts +21 -11
- package/dist/index.js +54 -66
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +55 -67
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -9
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AddressType, SpendingLimitError } from '@phantom/client';
|
|
2
2
|
import { NetworkId, ClientSideSdkHeaders } from '@phantom/constants';
|
|
3
3
|
import { ParsedSignatureResult, ParsedTransactionResult } from '@phantom/parsers';
|
|
4
|
-
import { StamperWithKeyManagement, Transaction, VersionedTransaction } from '@phantom/sdk-types';
|
|
4
|
+
import { Algorithm, StamperWithKeyManagement, Transaction, VersionedTransaction } from '@phantom/sdk-types';
|
|
5
5
|
import { ISolanaChain, IEthereumChain, EthTransactionRequest } from '@phantom/chain-interfaces';
|
|
6
6
|
|
|
7
7
|
interface WalletAddress {
|
|
@@ -44,8 +44,13 @@ interface EmbeddedProviderConfig {
|
|
|
44
44
|
apiBaseUrl: string;
|
|
45
45
|
appId: string;
|
|
46
46
|
authOptions: {
|
|
47
|
-
authUrl
|
|
48
|
-
redirectUrl
|
|
47
|
+
authUrl?: string;
|
|
48
|
+
redirectUrl?: string;
|
|
49
|
+
};
|
|
50
|
+
/** When also provided, the Auth2 PKCE flow is used instead of the legacy Phantom Connect flow. */
|
|
51
|
+
unstable__auth2Options?: {
|
|
52
|
+
authApiBaseUrl: string;
|
|
53
|
+
clientId: string;
|
|
49
54
|
};
|
|
50
55
|
embeddedWalletType: "app-wallet" | "user-wallet" | (string & Record<never, never>);
|
|
51
56
|
addressTypes: AddressType[];
|
|
@@ -77,6 +82,9 @@ interface Session {
|
|
|
77
82
|
lastRenewalAttempt?: number;
|
|
78
83
|
accountDerivationIndex?: number;
|
|
79
84
|
authUserId?: string;
|
|
85
|
+
pkceCodeVerifier?: string;
|
|
86
|
+
salt?: string;
|
|
87
|
+
bearerToken?: string;
|
|
80
88
|
}
|
|
81
89
|
interface EmbeddedStorage {
|
|
82
90
|
getSession(): Promise<Session | null>;
|
|
@@ -113,6 +121,7 @@ interface AuthResult {
|
|
|
113
121
|
accountDerivationIndex: number;
|
|
114
122
|
expiresInMs: number;
|
|
115
123
|
authUserId?: string;
|
|
124
|
+
bearerToken?: string;
|
|
116
125
|
}
|
|
117
126
|
interface PhantomConnectOptions {
|
|
118
127
|
publicKey: string;
|
|
@@ -123,10 +132,11 @@ interface PhantomConnectOptions {
|
|
|
123
132
|
sessionId: string;
|
|
124
133
|
clearPreviousSession?: boolean;
|
|
125
134
|
allowRefresh?: boolean;
|
|
135
|
+
algorithm?: Algorithm;
|
|
126
136
|
}
|
|
127
137
|
interface AuthProvider {
|
|
128
138
|
authenticate(options: PhantomConnectOptions): Promise<void | AuthResult>;
|
|
129
|
-
resumeAuthFromRedirect?(provider: EmbeddedProviderAuthType): AuthResult | null
|
|
139
|
+
resumeAuthFromRedirect?(provider: EmbeddedProviderAuthType): Promise<AuthResult | null>;
|
|
130
140
|
}
|
|
131
141
|
interface PhantomAppAuthOptions {
|
|
132
142
|
publicKey: string;
|
|
@@ -163,6 +173,7 @@ interface ConnectStartEventData {
|
|
|
163
173
|
authOptions?: {
|
|
164
174
|
provider?: string;
|
|
165
175
|
};
|
|
176
|
+
walletId?: string;
|
|
166
177
|
}
|
|
167
178
|
interface ConnectErrorEventData {
|
|
168
179
|
error: string;
|
|
@@ -215,6 +226,11 @@ declare class EmbeddedProvider {
|
|
|
215
226
|
private createOrganizationForAppWallet;
|
|
216
227
|
connect(authOptions: AuthOptions): Promise<ConnectResult>;
|
|
217
228
|
disconnect(shouldClearPreviousSession?: boolean): Promise<void>;
|
|
229
|
+
/**
|
|
230
|
+
* Handles errors from signing operations.
|
|
231
|
+
* Disconnects the user if the server returns a 401/403 (revoked or expired authenticator).
|
|
232
|
+
*/
|
|
233
|
+
private handleSigningError;
|
|
218
234
|
signMessage(params: SignMessageParams): Promise<ParsedSignatureResult>;
|
|
219
235
|
signEthereumMessage(params: SignMessageParams): Promise<ParsedSignatureResult>;
|
|
220
236
|
signTypedDataV4(params: SignTypedDataV4Params): Promise<ParsedSignatureResult>;
|
|
@@ -240,12 +256,11 @@ declare function retryWithBackoff<T>(operation: () => Promise<T>, operationName:
|
|
|
240
256
|
declare class EmbeddedSolanaChain implements ISolanaChain {
|
|
241
257
|
private provider;
|
|
242
258
|
private currentNetworkId;
|
|
243
|
-
private _connected;
|
|
244
259
|
private _publicKey;
|
|
245
260
|
private eventEmitter;
|
|
246
261
|
constructor(provider: EmbeddedProvider);
|
|
247
|
-
get connected(): boolean;
|
|
248
262
|
get publicKey(): string | null;
|
|
263
|
+
get isConnected(): boolean;
|
|
249
264
|
private ensureConnected;
|
|
250
265
|
signMessage(message: string | Uint8Array): Promise<{
|
|
251
266
|
signature: Uint8Array;
|
|
@@ -266,11 +281,8 @@ declare class EmbeddedSolanaChain implements ISolanaChain {
|
|
|
266
281
|
}>;
|
|
267
282
|
disconnect(): Promise<void>;
|
|
268
283
|
switchNetwork(network: "mainnet" | "devnet"): Promise<void>;
|
|
269
|
-
getPublicKey(): Promise<string | null>;
|
|
270
|
-
isConnected(): boolean;
|
|
271
284
|
private setupEventListeners;
|
|
272
285
|
private syncInitialState;
|
|
273
|
-
private updateConnectionState;
|
|
274
286
|
on(event: string, listener: (...args: any[]) => void): void;
|
|
275
287
|
off(event: string, listener: (...args: any[]) => void): void;
|
|
276
288
|
}
|
|
@@ -281,11 +293,9 @@ declare class EmbeddedSolanaChain implements ISolanaChain {
|
|
|
281
293
|
declare class EmbeddedEthereumChain implements IEthereumChain {
|
|
282
294
|
private provider;
|
|
283
295
|
private currentNetworkId;
|
|
284
|
-
private _connected;
|
|
285
296
|
private _accounts;
|
|
286
297
|
private eventEmitter;
|
|
287
298
|
constructor(provider: EmbeddedProvider);
|
|
288
|
-
get connected(): boolean;
|
|
289
299
|
get chainId(): string;
|
|
290
300
|
get accounts(): string[];
|
|
291
301
|
private ensureConnected;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AddressType, SpendingLimitError } from '@phantom/client';
|
|
2
2
|
import { NetworkId, ClientSideSdkHeaders } from '@phantom/constants';
|
|
3
3
|
import { ParsedSignatureResult, ParsedTransactionResult } from '@phantom/parsers';
|
|
4
|
-
import { StamperWithKeyManagement, Transaction, VersionedTransaction } from '@phantom/sdk-types';
|
|
4
|
+
import { Algorithm, StamperWithKeyManagement, Transaction, VersionedTransaction } from '@phantom/sdk-types';
|
|
5
5
|
import { ISolanaChain, IEthereumChain, EthTransactionRequest } from '@phantom/chain-interfaces';
|
|
6
6
|
|
|
7
7
|
interface WalletAddress {
|
|
@@ -44,8 +44,13 @@ interface EmbeddedProviderConfig {
|
|
|
44
44
|
apiBaseUrl: string;
|
|
45
45
|
appId: string;
|
|
46
46
|
authOptions: {
|
|
47
|
-
authUrl
|
|
48
|
-
redirectUrl
|
|
47
|
+
authUrl?: string;
|
|
48
|
+
redirectUrl?: string;
|
|
49
|
+
};
|
|
50
|
+
/** When also provided, the Auth2 PKCE flow is used instead of the legacy Phantom Connect flow. */
|
|
51
|
+
unstable__auth2Options?: {
|
|
52
|
+
authApiBaseUrl: string;
|
|
53
|
+
clientId: string;
|
|
49
54
|
};
|
|
50
55
|
embeddedWalletType: "app-wallet" | "user-wallet" | (string & Record<never, never>);
|
|
51
56
|
addressTypes: AddressType[];
|
|
@@ -77,6 +82,9 @@ interface Session {
|
|
|
77
82
|
lastRenewalAttempt?: number;
|
|
78
83
|
accountDerivationIndex?: number;
|
|
79
84
|
authUserId?: string;
|
|
85
|
+
pkceCodeVerifier?: string;
|
|
86
|
+
salt?: string;
|
|
87
|
+
bearerToken?: string;
|
|
80
88
|
}
|
|
81
89
|
interface EmbeddedStorage {
|
|
82
90
|
getSession(): Promise<Session | null>;
|
|
@@ -113,6 +121,7 @@ interface AuthResult {
|
|
|
113
121
|
accountDerivationIndex: number;
|
|
114
122
|
expiresInMs: number;
|
|
115
123
|
authUserId?: string;
|
|
124
|
+
bearerToken?: string;
|
|
116
125
|
}
|
|
117
126
|
interface PhantomConnectOptions {
|
|
118
127
|
publicKey: string;
|
|
@@ -123,10 +132,11 @@ interface PhantomConnectOptions {
|
|
|
123
132
|
sessionId: string;
|
|
124
133
|
clearPreviousSession?: boolean;
|
|
125
134
|
allowRefresh?: boolean;
|
|
135
|
+
algorithm?: Algorithm;
|
|
126
136
|
}
|
|
127
137
|
interface AuthProvider {
|
|
128
138
|
authenticate(options: PhantomConnectOptions): Promise<void | AuthResult>;
|
|
129
|
-
resumeAuthFromRedirect?(provider: EmbeddedProviderAuthType): AuthResult | null
|
|
139
|
+
resumeAuthFromRedirect?(provider: EmbeddedProviderAuthType): Promise<AuthResult | null>;
|
|
130
140
|
}
|
|
131
141
|
interface PhantomAppAuthOptions {
|
|
132
142
|
publicKey: string;
|
|
@@ -163,6 +173,7 @@ interface ConnectStartEventData {
|
|
|
163
173
|
authOptions?: {
|
|
164
174
|
provider?: string;
|
|
165
175
|
};
|
|
176
|
+
walletId?: string;
|
|
166
177
|
}
|
|
167
178
|
interface ConnectErrorEventData {
|
|
168
179
|
error: string;
|
|
@@ -215,6 +226,11 @@ declare class EmbeddedProvider {
|
|
|
215
226
|
private createOrganizationForAppWallet;
|
|
216
227
|
connect(authOptions: AuthOptions): Promise<ConnectResult>;
|
|
217
228
|
disconnect(shouldClearPreviousSession?: boolean): Promise<void>;
|
|
229
|
+
/**
|
|
230
|
+
* Handles errors from signing operations.
|
|
231
|
+
* Disconnects the user if the server returns a 401/403 (revoked or expired authenticator).
|
|
232
|
+
*/
|
|
233
|
+
private handleSigningError;
|
|
218
234
|
signMessage(params: SignMessageParams): Promise<ParsedSignatureResult>;
|
|
219
235
|
signEthereumMessage(params: SignMessageParams): Promise<ParsedSignatureResult>;
|
|
220
236
|
signTypedDataV4(params: SignTypedDataV4Params): Promise<ParsedSignatureResult>;
|
|
@@ -240,12 +256,11 @@ declare function retryWithBackoff<T>(operation: () => Promise<T>, operationName:
|
|
|
240
256
|
declare class EmbeddedSolanaChain implements ISolanaChain {
|
|
241
257
|
private provider;
|
|
242
258
|
private currentNetworkId;
|
|
243
|
-
private _connected;
|
|
244
259
|
private _publicKey;
|
|
245
260
|
private eventEmitter;
|
|
246
261
|
constructor(provider: EmbeddedProvider);
|
|
247
|
-
get connected(): boolean;
|
|
248
262
|
get publicKey(): string | null;
|
|
263
|
+
get isConnected(): boolean;
|
|
249
264
|
private ensureConnected;
|
|
250
265
|
signMessage(message: string | Uint8Array): Promise<{
|
|
251
266
|
signature: Uint8Array;
|
|
@@ -266,11 +281,8 @@ declare class EmbeddedSolanaChain implements ISolanaChain {
|
|
|
266
281
|
}>;
|
|
267
282
|
disconnect(): Promise<void>;
|
|
268
283
|
switchNetwork(network: "mainnet" | "devnet"): Promise<void>;
|
|
269
|
-
getPublicKey(): Promise<string | null>;
|
|
270
|
-
isConnected(): boolean;
|
|
271
284
|
private setupEventListeners;
|
|
272
285
|
private syncInitialState;
|
|
273
|
-
private updateConnectionState;
|
|
274
286
|
on(event: string, listener: (...args: any[]) => void): void;
|
|
275
287
|
off(event: string, listener: (...args: any[]) => void): void;
|
|
276
288
|
}
|
|
@@ -281,11 +293,9 @@ declare class EmbeddedSolanaChain implements ISolanaChain {
|
|
|
281
293
|
declare class EmbeddedEthereumChain implements IEthereumChain {
|
|
282
294
|
private provider;
|
|
283
295
|
private currentNetworkId;
|
|
284
|
-
private _connected;
|
|
285
296
|
private _accounts;
|
|
286
297
|
private eventEmitter;
|
|
287
298
|
constructor(provider: EmbeddedProvider);
|
|
288
|
-
get connected(): boolean;
|
|
289
299
|
get chainId(): string;
|
|
290
300
|
get accounts(): string[];
|
|
291
301
|
private ensureConnected;
|
package/dist/index.js
CHANGED
|
@@ -63,21 +63,19 @@ var EmbeddedSolanaChain = class {
|
|
|
63
63
|
constructor(provider) {
|
|
64
64
|
this.provider = provider;
|
|
65
65
|
this.currentNetworkId = import_constants.NetworkId.SOLANA_MAINNET;
|
|
66
|
-
this._connected = false;
|
|
67
66
|
this._publicKey = null;
|
|
68
67
|
this.eventEmitter = new import_eventemitter3.EventEmitter();
|
|
69
68
|
this.setupEventListeners();
|
|
70
69
|
this.syncInitialState();
|
|
71
70
|
}
|
|
72
|
-
// Wallet adapter compliant properties
|
|
73
|
-
get connected() {
|
|
74
|
-
return this._connected;
|
|
75
|
-
}
|
|
76
71
|
get publicKey() {
|
|
77
72
|
return this._publicKey;
|
|
78
73
|
}
|
|
74
|
+
get isConnected() {
|
|
75
|
+
return this._publicKey !== null;
|
|
76
|
+
}
|
|
79
77
|
ensureConnected() {
|
|
80
|
-
if (!this.
|
|
78
|
+
if (!this.isConnected) {
|
|
81
79
|
throw new Error("Solana chain not available. Ensure SDK is connected.");
|
|
82
80
|
}
|
|
83
81
|
}
|
|
@@ -135,7 +133,7 @@ var EmbeddedSolanaChain = class {
|
|
|
135
133
|
const solanaAddr = addresses.find((a) => a.addressType === "Solana");
|
|
136
134
|
if (!solanaAddr)
|
|
137
135
|
throw new Error("No Solana address found");
|
|
138
|
-
this.
|
|
136
|
+
this._publicKey = solanaAddr.address;
|
|
139
137
|
return Promise.resolve({ publicKey: solanaAddr.address });
|
|
140
138
|
}
|
|
141
139
|
async disconnect() {
|
|
@@ -145,41 +143,25 @@ var EmbeddedSolanaChain = class {
|
|
|
145
143
|
this.currentNetworkId = network === "mainnet" ? import_constants.NetworkId.SOLANA_MAINNET : import_constants.NetworkId.SOLANA_DEVNET;
|
|
146
144
|
return Promise.resolve();
|
|
147
145
|
}
|
|
148
|
-
getPublicKey() {
|
|
149
|
-
if (!this.provider.isConnected())
|
|
150
|
-
return Promise.resolve(null);
|
|
151
|
-
const addresses = this.provider.getAddresses();
|
|
152
|
-
const solanaAddr = addresses.find((a) => a.addressType === "Solana");
|
|
153
|
-
return Promise.resolve(solanaAddr?.address || null);
|
|
154
|
-
}
|
|
155
|
-
isConnected() {
|
|
156
|
-
return this._connected && this.provider.isConnected();
|
|
157
|
-
}
|
|
158
146
|
setupEventListeners() {
|
|
159
147
|
this.provider.on("connect", (data) => {
|
|
160
148
|
const solanaAddress = data.addresses?.find((addr) => addr.addressType === "Solana");
|
|
161
149
|
if (solanaAddress) {
|
|
162
|
-
this.
|
|
150
|
+
this._publicKey = solanaAddress.address;
|
|
163
151
|
this.eventEmitter.emit("connect", solanaAddress.address);
|
|
164
152
|
}
|
|
165
153
|
});
|
|
166
154
|
this.provider.on("disconnect", () => {
|
|
167
|
-
this.
|
|
155
|
+
this._publicKey = null;
|
|
168
156
|
this.eventEmitter.emit("disconnect");
|
|
169
157
|
});
|
|
170
158
|
}
|
|
171
159
|
syncInitialState() {
|
|
172
|
-
if (this.provider.isConnected())
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
updateConnectionState(connected, publicKey) {
|
|
181
|
-
this._connected = connected;
|
|
182
|
-
this._publicKey = publicKey;
|
|
160
|
+
if (!this.provider.isConnected())
|
|
161
|
+
return;
|
|
162
|
+
const addresses = this.provider.getAddresses();
|
|
163
|
+
const solanaAddr = addresses.find((a) => a.addressType === "Solana");
|
|
164
|
+
this._publicKey = solanaAddr?.address || null;
|
|
183
165
|
}
|
|
184
166
|
// Event methods for interface compliance
|
|
185
167
|
on(event, listener) {
|
|
@@ -197,16 +179,11 @@ var EmbeddedEthereumChain = class {
|
|
|
197
179
|
constructor(provider) {
|
|
198
180
|
this.provider = provider;
|
|
199
181
|
this.currentNetworkId = import_constants2.NetworkId.ETHEREUM_MAINNET;
|
|
200
|
-
this._connected = false;
|
|
201
182
|
this._accounts = [];
|
|
202
183
|
this.eventEmitter = new import_eventemitter32.EventEmitter();
|
|
203
184
|
this.setupEventListeners();
|
|
204
185
|
this.syncInitialState();
|
|
205
186
|
}
|
|
206
|
-
// EIP-1193 compliant properties
|
|
207
|
-
get connected() {
|
|
208
|
-
return this._connected;
|
|
209
|
-
}
|
|
210
187
|
get chainId() {
|
|
211
188
|
const chainId = (0, import_constants2.networkIdToChainId)(this.currentNetworkId) || 1;
|
|
212
189
|
return `0x${chainId.toString(16)}`;
|
|
@@ -230,7 +207,7 @@ var EmbeddedEthereumChain = class {
|
|
|
230
207
|
}
|
|
231
208
|
const addresses = this.provider.getAddresses();
|
|
232
209
|
const ethAddresses = addresses.filter((a) => a.addressType === "Ethereum").map((a) => a.address);
|
|
233
|
-
this.updateConnectionState(
|
|
210
|
+
this.updateConnectionState(ethAddresses);
|
|
234
211
|
return Promise.resolve(ethAddresses);
|
|
235
212
|
}
|
|
236
213
|
async disconnect() {
|
|
@@ -296,19 +273,19 @@ var EmbeddedEthereumChain = class {
|
|
|
296
273
|
return this.request({ method: "eth_accounts" });
|
|
297
274
|
}
|
|
298
275
|
isConnected() {
|
|
299
|
-
return this.
|
|
276
|
+
return this.provider.isConnected() && this._accounts.length > 0;
|
|
300
277
|
}
|
|
301
278
|
setupEventListeners() {
|
|
302
279
|
this.provider.on("connect", (data) => {
|
|
303
280
|
const ethAddresses = data.addresses?.filter((addr) => addr.addressType === "Ethereum")?.map((addr) => addr.address) || [];
|
|
304
281
|
if (ethAddresses.length > 0) {
|
|
305
|
-
this.updateConnectionState(
|
|
282
|
+
this.updateConnectionState(ethAddresses);
|
|
306
283
|
this.eventEmitter.emit("connect", { chainId: this.chainId });
|
|
307
284
|
this.eventEmitter.emit("accountsChanged", ethAddresses);
|
|
308
285
|
}
|
|
309
286
|
});
|
|
310
287
|
this.provider.on("disconnect", () => {
|
|
311
|
-
this.updateConnectionState(
|
|
288
|
+
this.updateConnectionState([]);
|
|
312
289
|
this.eventEmitter.emit("disconnect", { code: 4900, message: "Provider disconnected" });
|
|
313
290
|
this.eventEmitter.emit("accountsChanged", []);
|
|
314
291
|
});
|
|
@@ -318,12 +295,11 @@ var EmbeddedEthereumChain = class {
|
|
|
318
295
|
const addresses = this.provider.getAddresses();
|
|
319
296
|
const ethAddresses = addresses.filter((a) => a.addressType === "Ethereum").map((a) => a.address);
|
|
320
297
|
if (ethAddresses.length > 0) {
|
|
321
|
-
this.updateConnectionState(
|
|
298
|
+
this.updateConnectionState(ethAddresses);
|
|
322
299
|
}
|
|
323
300
|
}
|
|
324
301
|
}
|
|
325
|
-
updateConnectionState(
|
|
326
|
-
this._connected = connected;
|
|
302
|
+
updateConnectionState(accounts) {
|
|
327
303
|
this._accounts = accounts;
|
|
328
304
|
}
|
|
329
305
|
async handleEmbeddedRequest(args) {
|
|
@@ -551,7 +527,8 @@ var EmbeddedProvider = class {
|
|
|
551
527
|
});
|
|
552
528
|
if (session.status !== "completed") {
|
|
553
529
|
const urlSessionId = this.urlParamsAccessor.getParam("session_id");
|
|
554
|
-
|
|
530
|
+
const urlCode = this.urlParamsAccessor.getParam("code");
|
|
531
|
+
if (session.status === "pending" && !urlSessionId && !urlCode) {
|
|
555
532
|
this.logger.warn("EMBEDDED_PROVIDER", "Session mismatch detected - pending session without redirect context", {
|
|
556
533
|
sessionId: session.sessionId,
|
|
557
534
|
status: session.status
|
|
@@ -624,7 +601,7 @@ var EmbeddedProvider = class {
|
|
|
624
601
|
}
|
|
625
602
|
this.logger.log("EMBEDDED_PROVIDER", "No completed session found, checking for redirect resume");
|
|
626
603
|
if (this.authProvider.resumeAuthFromRedirect) {
|
|
627
|
-
const authResult = this.authProvider.resumeAuthFromRedirect(session.authProvider);
|
|
604
|
+
const authResult = await this.authProvider.resumeAuthFromRedirect(session.authProvider);
|
|
628
605
|
if (authResult) {
|
|
629
606
|
this.logger.info("EMBEDDED_PROVIDER", "Resuming from redirect", {
|
|
630
607
|
walletId: authResult.walletId,
|
|
@@ -787,7 +764,7 @@ var EmbeddedProvider = class {
|
|
|
787
764
|
authenticatorName: `auth-${shortPubKey}`,
|
|
788
765
|
authenticatorKind: "keypair",
|
|
789
766
|
publicKey: base64urlPublicKey,
|
|
790
|
-
algorithm:
|
|
767
|
+
algorithm: this.stamper.algorithm,
|
|
791
768
|
expiresInMs
|
|
792
769
|
}
|
|
793
770
|
]
|
|
@@ -903,6 +880,21 @@ var EmbeddedProvider = class {
|
|
|
903
880
|
});
|
|
904
881
|
}
|
|
905
882
|
}
|
|
883
|
+
/**
|
|
884
|
+
* Handles errors from signing operations.
|
|
885
|
+
* Disconnects the user if the server returns a 401/403 (revoked or expired authenticator).
|
|
886
|
+
*/
|
|
887
|
+
async handleSigningError(error) {
|
|
888
|
+
if ((0, import_client.isAuthenticationError)(error)) {
|
|
889
|
+
this.logger.warn("EMBEDDED_PROVIDER", "Authenticator rejected by server (401/403), disconnecting", { error });
|
|
890
|
+
await this.disconnect(false);
|
|
891
|
+
throw new Error("Authenticator revoked");
|
|
892
|
+
}
|
|
893
|
+
if (error instanceof import_client.SpendingLimitError) {
|
|
894
|
+
this.emit("spending_limit_reached", { error });
|
|
895
|
+
}
|
|
896
|
+
throw error;
|
|
897
|
+
}
|
|
906
898
|
async signMessage(params) {
|
|
907
899
|
if (!this.client || !this.walletId) {
|
|
908
900
|
throw new Error("Not connected");
|
|
@@ -919,7 +911,7 @@ var EmbeddedProvider = class {
|
|
|
919
911
|
message: params.message,
|
|
920
912
|
networkId: params.networkId,
|
|
921
913
|
derivationIndex
|
|
922
|
-
});
|
|
914
|
+
}).catch((error) => this.handleSigningError(error));
|
|
923
915
|
this.logger.info("EMBEDDED_PROVIDER", "Message signed successfully", {
|
|
924
916
|
walletId: this.walletId,
|
|
925
917
|
message: params.message
|
|
@@ -952,7 +944,7 @@ var EmbeddedProvider = class {
|
|
|
952
944
|
message: base64UrlMessage,
|
|
953
945
|
networkId: params.networkId,
|
|
954
946
|
derivationIndex
|
|
955
|
-
});
|
|
947
|
+
}).catch((error) => this.handleSigningError(error));
|
|
956
948
|
this.logger.info("EMBEDDED_PROVIDER", "Message signed successfully", {
|
|
957
949
|
walletId: this.walletId,
|
|
958
950
|
message: params.message
|
|
@@ -975,7 +967,7 @@ var EmbeddedProvider = class {
|
|
|
975
967
|
typedData: params.typedData,
|
|
976
968
|
networkId: params.networkId,
|
|
977
969
|
derivationIndex
|
|
978
|
-
});
|
|
970
|
+
}).catch((error) => this.handleSigningError(error));
|
|
979
971
|
this.logger.info("EMBEDDED_PROVIDER", "Typed data signed successfully", {
|
|
980
972
|
walletId: this.walletId
|
|
981
973
|
});
|
|
@@ -1012,7 +1004,7 @@ var EmbeddedProvider = class {
|
|
|
1012
1004
|
networkId: params.networkId,
|
|
1013
1005
|
derivationIndex,
|
|
1014
1006
|
account
|
|
1015
|
-
});
|
|
1007
|
+
}).catch((error) => this.handleSigningError(error));
|
|
1016
1008
|
this.logger.info("EMBEDDED_PROVIDER", "Transaction signed successfully", {
|
|
1017
1009
|
walletId: this.walletId,
|
|
1018
1010
|
networkId: params.networkId,
|
|
@@ -1045,21 +1037,13 @@ var EmbeddedProvider = class {
|
|
|
1045
1037
|
if (!account) {
|
|
1046
1038
|
throw new Error(`No address found for network ${params.networkId}`);
|
|
1047
1039
|
}
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
account
|
|
1056
|
-
});
|
|
1057
|
-
} catch (error) {
|
|
1058
|
-
if (error instanceof import_client.SpendingLimitError) {
|
|
1059
|
-
this.emit("spending_limit_reached", { error });
|
|
1060
|
-
}
|
|
1061
|
-
throw error;
|
|
1062
|
-
}
|
|
1040
|
+
const rawResponse = await this.client.signAndSendTransaction({
|
|
1041
|
+
walletId: this.walletId,
|
|
1042
|
+
transaction: transactionPayload,
|
|
1043
|
+
networkId: params.networkId,
|
|
1044
|
+
derivationIndex,
|
|
1045
|
+
account
|
|
1046
|
+
}).catch((error) => this.handleSigningError(error));
|
|
1063
1047
|
this.logger.info("EMBEDDED_PROVIDER", "Transaction signed and sent successfully", {
|
|
1064
1048
|
walletId: this.walletId,
|
|
1065
1049
|
networkId: params.networkId,
|
|
@@ -1243,8 +1227,9 @@ var EmbeddedProvider = class {
|
|
|
1243
1227
|
// OAuth session management - defaults to allowing refresh unless user explicitly logged out
|
|
1244
1228
|
clearPreviousSession: shouldClearPreviousSession,
|
|
1245
1229
|
// true only after logout
|
|
1246
|
-
allowRefresh: !shouldClearPreviousSession
|
|
1230
|
+
allowRefresh: !shouldClearPreviousSession,
|
|
1247
1231
|
// false only after logout
|
|
1232
|
+
algorithm: this.stamper.algorithm
|
|
1248
1233
|
});
|
|
1249
1234
|
if (authResult && "walletId" in authResult) {
|
|
1250
1235
|
this.logger.info("EMBEDDED_PROVIDER", "Authentication completed after redirect", {
|
|
@@ -1257,6 +1242,7 @@ var EmbeddedProvider = class {
|
|
|
1257
1242
|
tempSession.authProvider = authResult.provider || tempSession.authProvider;
|
|
1258
1243
|
tempSession.accountDerivationIndex = authResult.accountDerivationIndex;
|
|
1259
1244
|
tempSession.authUserId = authResult.authUserId;
|
|
1245
|
+
tempSession.bearerToken = authResult.bearerToken;
|
|
1260
1246
|
tempSession.status = "completed";
|
|
1261
1247
|
tempSession.lastUsed = Date.now();
|
|
1262
1248
|
if (authResult.expiresInMs > 0) {
|
|
@@ -1286,6 +1272,7 @@ var EmbeddedProvider = class {
|
|
|
1286
1272
|
session.organizationId = authResult.organizationId;
|
|
1287
1273
|
session.accountDerivationIndex = authResult.accountDerivationIndex;
|
|
1288
1274
|
session.authUserId = authResult.authUserId;
|
|
1275
|
+
session.bearerToken = authResult.bearerToken;
|
|
1289
1276
|
session.status = "completed";
|
|
1290
1277
|
session.lastUsed = Date.now();
|
|
1291
1278
|
if (authResult.expiresInMs > 0) {
|
|
@@ -1355,7 +1342,8 @@ var EmbeddedProvider = class {
|
|
|
1355
1342
|
organizationId: session.organizationId,
|
|
1356
1343
|
headers: {
|
|
1357
1344
|
...this.platform.analyticsHeaders || {},
|
|
1358
|
-
...session.authUserId ? { "x-auth-user-id": session.authUserId } : {}
|
|
1345
|
+
...session.authUserId ? { "x-auth-user-id": session.authUserId } : {},
|
|
1346
|
+
...session.bearerToken ? { Authorization: session.bearerToken } : {}
|
|
1359
1347
|
}
|
|
1360
1348
|
},
|
|
1361
1349
|
this.stamper
|