@phantom/embedded-provider-core 0.1.10 → 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 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;
@@ -154,6 +155,8 @@ declare class EmbeddedProvider {
154
155
  private walletId;
155
156
  private addresses;
156
157
  private jwtAuth;
158
+ readonly solana: ISolanaChain;
159
+ readonly ethereum: IEthereumChain;
157
160
  private eventListeners;
158
161
  constructor(config: EmbeddedProviderConfig, platform: PlatformAdapter, logger: DebugLogger);
159
162
  on(event: EmbeddedProviderEvent, callback: EventCallback): void;
@@ -189,6 +192,50 @@ declare function generateSessionId(): string;
189
192
 
190
193
  declare function retryWithBackoff<T>(operation: () => Promise<T>, operationName: string, logger: DebugLogger, maxRetries?: number, baseDelay?: number): Promise<T>;
191
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
+
192
239
  /**
193
240
  * Constants for authenticator lifecycle management
194
241
  */
@@ -205,4 +252,4 @@ declare const AUTHENTICATOR_EXPIRATION_TIME_MS: number;
205
252
  */
206
253
  declare const AUTHENTICATOR_RENEWAL_WINDOW_MS: number;
207
254
 
208
- 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;
@@ -154,6 +155,8 @@ declare class EmbeddedProvider {
154
155
  private walletId;
155
156
  private addresses;
156
157
  private jwtAuth;
158
+ readonly solana: ISolanaChain;
159
+ readonly ethereum: IEthereumChain;
157
160
  private eventListeners;
158
161
  constructor(config: EmbeddedProviderConfig, platform: PlatformAdapter, logger: DebugLogger);
159
162
  on(event: EmbeddedProviderEvent, callback: EventCallback): void;
@@ -189,6 +192,50 @@ declare function generateSessionId(): string;
189
192
 
190
193
  declare function retryWithBackoff<T>(operation: () => Promise<T>, operationName: string, logger: DebugLogger, maxRetries?: number, baseDelay?: number): Promise<T>;
191
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
+
192
239
  /**
193
240
  * Constants for authenticator lifecycle management
194
241
  */
@@ -205,4 +252,4 @@ declare const AUTHENTICATOR_EXPIRATION_TIME_MS: number;
205
252
  */
206
253
  declare const AUTHENTICATOR_RENEWAL_WINDOW_MS: number;
207
254
 
208
- 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 import_parsers = require("@phantom/parsers");
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
  /*
@@ -575,7 +743,7 @@ var EmbeddedProvider = class {
575
743
  walletId: this.walletId,
576
744
  message: params.message
577
745
  });
578
- const parsedMessage = (0, import_parsers.parseMessage)(params.message);
746
+ const parsedMessage = (0, import_parsers3.parseMessage)(params.message);
579
747
  const session = await this.storage.getSession();
580
748
  const derivationIndex = session?.accountDerivationIndex ?? 0;
581
749
  const rawResponse = await this.client.signMessage({
@@ -588,7 +756,7 @@ var EmbeddedProvider = class {
588
756
  walletId: this.walletId,
589
757
  message: params.message
590
758
  });
591
- return (0, import_parsers.parseSignMessageResponse)(rawResponse, params.networkId);
759
+ return (0, import_parsers3.parseSignMessageResponse)(rawResponse, params.networkId);
592
760
  }
593
761
  async signAndSendTransaction(params) {
594
762
  if (!this.client || !this.walletId) {
@@ -599,7 +767,7 @@ var EmbeddedProvider = class {
599
767
  walletId: this.walletId,
600
768
  networkId: params.networkId
601
769
  });
602
- const parsedTransaction = await (0, import_parsers.parseTransaction)(params.transaction, params.networkId);
770
+ const parsedTransaction = await (0, import_parsers3.parseTransactionToBase64Url)(params.transaction, params.networkId);
603
771
  const session = await this.storage.getSession();
604
772
  const derivationIndex = session?.accountDerivationIndex ?? 0;
605
773
  this.logger.log("EMBEDDED_PROVIDER", "Parsed transaction for signing", {
@@ -619,7 +787,7 @@ var EmbeddedProvider = class {
619
787
  hash: rawResponse.hash,
620
788
  rawTransaction: rawResponse.rawTransaction
621
789
  });
622
- return await (0, import_parsers.parseTransactionResponse)(rawResponse.rawTransaction, params.networkId, rawResponse.hash);
790
+ return await (0, import_parsers3.parseTransactionResponse)(rawResponse.rawTransaction, params.networkId, rawResponse.hash);
623
791
  }
624
792
  getAddresses() {
625
793
  return this.addresses;
@@ -940,7 +1108,9 @@ var EmbeddedProvider = class {
940
1108
  0 && (module.exports = {
941
1109
  AUTHENTICATOR_EXPIRATION_TIME_MS,
942
1110
  AUTHENTICATOR_RENEWAL_WINDOW_MS,
1111
+ EmbeddedEthereumChain,
943
1112
  EmbeddedProvider,
1113
+ EmbeddedSolanaChain,
944
1114
  JWTAuth,
945
1115
  generateSessionId,
946
1116
  retryWithBackoff