@joai/warps-wallet-remote 1.1.0 → 1.2.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/README.md CHANGED
@@ -56,6 +56,7 @@ If you use a custom provider key, pass it as `providerName` or the helper fallba
56
56
  - `POST /v1/wallets/generate`
57
57
  - `POST /v1/wallets/import`
58
58
  - `POST /v1/wallets/export`
59
+ - `POST /v1/wallets/delete`
59
60
  - `POST /v1/sign/transaction`
60
61
  - `POST /v1/sign/message`
61
62
 
package/dist/index.d.cts CHANGED
@@ -5,10 +5,11 @@ type RemoteWalletProviderEndpoints = {
5
5
  generate: string;
6
6
  import: string;
7
7
  export: string;
8
+ delete: string;
8
9
  signTransaction: string;
9
10
  signMessage: string;
10
11
  };
11
- type RemoteWalletOperation = 'generate' | 'import' | 'export' | 'signTransaction' | 'signMessage';
12
+ type RemoteWalletOperation = 'generate' | 'import' | 'export' | 'delete' | 'signTransaction' | 'signMessage';
12
13
  type RemoteWalletAccessTokenParams = {
13
14
  walletId: string;
14
15
  chain: string;
@@ -58,6 +59,7 @@ declare class RemoteWalletProvider implements WalletProvider {
58
59
  importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails>;
59
60
  export(): Promise<WarpWalletDetails>;
60
61
  generate(): Promise<WarpWalletDetails>;
62
+ delete(externalId: string): Promise<void>;
61
63
  private requestLifecycleWallet;
62
64
  private toWalletDetails;
63
65
  private getWalletIdOrThrow;
package/dist/index.d.ts CHANGED
@@ -5,10 +5,11 @@ type RemoteWalletProviderEndpoints = {
5
5
  generate: string;
6
6
  import: string;
7
7
  export: string;
8
+ delete: string;
8
9
  signTransaction: string;
9
10
  signMessage: string;
10
11
  };
11
- type RemoteWalletOperation = 'generate' | 'import' | 'export' | 'signTransaction' | 'signMessage';
12
+ type RemoteWalletOperation = 'generate' | 'import' | 'export' | 'delete' | 'signTransaction' | 'signMessage';
12
13
  type RemoteWalletAccessTokenParams = {
13
14
  walletId: string;
14
15
  chain: string;
@@ -58,6 +59,7 @@ declare class RemoteWalletProvider implements WalletProvider {
58
59
  importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails>;
59
60
  export(): Promise<WarpWalletDetails>;
60
61
  generate(): Promise<WarpWalletDetails>;
62
+ delete(externalId: string): Promise<void>;
61
63
  private requestLifecycleWallet;
62
64
  private toWalletDetails;
63
65
  private getWalletIdOrThrow;
package/dist/index.js CHANGED
@@ -37,6 +37,7 @@ var defaultEndpoints = {
37
37
  generate: "/v1/wallets/generate",
38
38
  import: "/v1/wallets/import",
39
39
  export: "/v1/wallets/export",
40
+ delete: "/v1/wallets/delete",
40
41
  signTransaction: "/v1/sign/transaction",
41
42
  signMessage: "/v1/sign/message"
42
43
  };
@@ -77,6 +78,7 @@ var normalizeEndpoints = (endpoints) => ({
77
78
  generate: normalizeEndpointPath(endpoints.generate),
78
79
  import: normalizeEndpointPath(endpoints.import),
79
80
  export: normalizeEndpointPath(endpoints.export),
81
+ delete: normalizeEndpointPath(endpoints.delete),
80
82
  signTransaction: normalizeEndpointPath(endpoints.signTransaction),
81
83
  signMessage: normalizeEndpointPath(endpoints.signMessage)
82
84
  });
@@ -191,6 +193,17 @@ var RemoteWalletProvider = class {
191
193
  const serviceToken = await this.resolveServiceToken();
192
194
  return await this.requestLifecycleWallet(this.remoteConfig.endpoints.generate, { agentId, chain: this.chain.name }, serviceToken, "generate");
193
195
  }
196
+ async delete(externalId) {
197
+ const serviceToken = await this.resolveServiceToken();
198
+ await this.request(
199
+ this.remoteConfig.endpoints.delete,
200
+ { walletId: externalId },
201
+ {
202
+ bearer: serviceToken,
203
+ context: this.createContext("delete", { walletId: externalId })
204
+ }
205
+ );
206
+ }
194
207
  async requestLifecycleWallet(path, payload, token, operation) {
195
208
  const response = await this.request(path, payload, {
196
209
  bearer: token,
@@ -264,6 +277,7 @@ var RemoteWalletProvider = class {
264
277
  const text = await response.text();
265
278
  throw new Error(`RemoteWalletProvider request failed (${response.status}): ${text}`);
266
279
  }
280
+ if (response.status === 204) return void 0;
267
281
  return await response.json();
268
282
  } finally {
269
283
  clearTimeout(timeout);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/RemoteWalletProvider.ts","../src/types.ts","../src/helpers.ts"],"sourcesContent":["export * from './RemoteWalletProvider'\nexport * from './helpers'\nexport * from './types'\n","import {\n getWarpWalletAddressFromConfig,\n getWarpWalletExternalIdFromConfig,\n setWarpWalletInConfig,\n WalletProvider,\n WarpAdapterGenericTransaction,\n WarpChainInfo,\n WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@joai/warps'\nimport {\n RemoteWalletOperation,\n RemoteWalletRequestContext,\n RemoteWalletLifecycleResponse,\n RemoteWalletProviderEndpoints,\n RemoteWalletProviderConfig,\n DEFAULT_REMOTE_WALLET_PROVIDER_NAME,\n} from './types'\n\nconst defaultEndpoints: RemoteWalletProviderEndpoints = {\n generate: '/v1/wallets/generate',\n import: '/v1/wallets/import',\n export: '/v1/wallets/export',\n signTransaction: '/v1/sign/transaction',\n signMessage: '/v1/sign/message',\n}\n\ntype ResolvedRemoteWalletProviderConfig = RemoteWalletProviderConfig & {\n providerName: WarpWalletProvider\n endpoints: RemoteWalletProviderEndpoints\n}\n\ntype SignTransactionResponse = {\n signedTransaction?: unknown\n signature?: unknown\n transactionHash?: unknown\n}\n\nconst trimTrailingSlash = (value: string): string => value.replace(/\\/+$/, '')\nconst isStrictHex = (value: string): boolean => /^[0-9a-f]+$/i.test(value) && value.length % 2 === 0\nconst isLoopbackHost = (host: string): boolean => ['localhost', '127.0.0.1', '::1'].includes(host.toLowerCase())\nconst isRecord = (value: unknown): value is Record<string, unknown> => Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n\nconst normalizeAndValidateBaseUrl = (baseUrl: string, allowInsecureHttp?: boolean): string => {\n const normalized = trimTrailingSlash(baseUrl.trim())\n let parsedUrl: URL\n\n try {\n parsedUrl = new URL(normalized)\n } catch {\n throw new Error('RemoteWalletProvider: baseUrl must be an absolute URL')\n }\n\n const isHttps = parsedUrl.protocol.toLowerCase() === 'https:'\n if (!isHttps && !allowInsecureHttp && !isLoopbackHost(parsedUrl.hostname)) {\n throw new Error('RemoteWalletProvider: baseUrl must use HTTPS unless allowInsecureHttp is explicitly enabled')\n }\n\n return normalized\n}\n\nconst normalizeEndpointPath = (path: string): string => {\n const normalized = path.trim()\n if (!normalized) {\n throw new Error('RemoteWalletProvider: endpoint path must be a non-empty string')\n }\n\n try {\n new URL(normalized)\n throw new Error('RemoteWalletProvider: endpoint path must be relative')\n } catch (error) {\n if (error instanceof Error && error.message.includes('must be relative')) {\n throw error\n }\n }\n\n return normalized.startsWith('/') ? normalized : `/${normalized}`\n}\n\nconst normalizeEndpoints = (endpoints: RemoteWalletProviderEndpoints): RemoteWalletProviderEndpoints => ({\n generate: normalizeEndpointPath(endpoints.generate),\n import: normalizeEndpointPath(endpoints.import),\n export: normalizeEndpointPath(endpoints.export),\n signTransaction: normalizeEndpointPath(endpoints.signTransaction),\n signMessage: normalizeEndpointPath(endpoints.signMessage),\n})\n\nconst withDefaults = (\n remoteConfig: RemoteWalletProviderConfig,\n fallbackProviderName: WarpWalletProvider\n): ResolvedRemoteWalletProviderConfig => {\n const baseUrl = normalizeAndValidateBaseUrl(remoteConfig.baseUrl, remoteConfig.allowInsecureHttp)\n const endpoints = normalizeEndpoints({\n ...defaultEndpoints,\n ...(remoteConfig.endpoints || {}),\n })\n\n return {\n ...remoteConfig,\n baseUrl,\n providerName: remoteConfig.providerName ?? fallbackProviderName,\n endpoints,\n }\n}\n\nexport class RemoteWalletProvider implements WalletProvider {\n protected readonly remoteConfig: ResolvedRemoteWalletProviderConfig\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo,\n remoteConfig: RemoteWalletProviderConfig,\n fallbackProviderName: WarpWalletProvider = DEFAULT_REMOTE_WALLET_PROVIDER_NAME\n ) {\n this.remoteConfig = withDefaults(remoteConfig, fallbackProviderName)\n }\n\n async getAddress(): Promise<string | null> {\n return getWarpWalletAddressFromConfig(this.config, this.chain.name)\n }\n\n async getPublicKey(): Promise<string | null> {\n return null\n }\n\n async signTransaction(tx: WarpAdapterGenericTransaction): Promise<WarpAdapterGenericTransaction> {\n const signAuth = await this.getSignAuth()\n const transaction = this.toSerializableTransaction(tx)\n\n const response = await this.request<SignTransactionResponse>(\n this.remoteConfig.endpoints.signTransaction,\n { walletId: signAuth.walletId, chain: this.chain.name, nonce: signAuth.nonce, transaction },\n {\n bearer: signAuth.token,\n context: this.createContext('signTransaction', { walletId: signAuth.walletId, nonce: signAuth.nonce }),\n }\n )\n const txRecord = isRecord(tx) ? tx : {}\n\n if (typeof response.transactionHash === 'string' && response.transactionHash.trim() !== '') {\n return { ...txRecord, transactionHash: response.transactionHash }\n }\n\n if (response.signedTransaction !== undefined && response.signedTransaction !== null) {\n if (typeof response.signedTransaction === 'string') {\n return { ...txRecord, signature: response.signedTransaction }\n }\n\n if (isRecord(response.signedTransaction)) {\n return { ...txRecord, ...response.signedTransaction }\n }\n\n throw new Error('RemoteWalletProvider: Invalid signedTransaction format from signer service')\n }\n\n if (response.signature !== undefined && response.signature !== null) {\n const isMultiversxSignature = this.chain.name === 'multiversx' || this.chain.name === 'claws'\n\n if (isMultiversxSignature) {\n if (typeof response.signature !== 'string' || !isStrictHex(response.signature)) {\n throw new Error('RemoteWalletProvider: Invalid hex signature for multiversx transaction')\n }\n return { ...txRecord, signature: Buffer.from(response.signature, 'hex') }\n }\n\n if (typeof response.signature !== 'string' && !Array.isArray(response.signature)) {\n throw new Error('RemoteWalletProvider: Invalid signature format from signer service')\n }\n\n return { ...txRecord, signature: response.signature }\n }\n\n throw new Error('RemoteWalletProvider: Invalid signTransaction response from signer service')\n }\n\n async signMessage(message: string): Promise<string> {\n const signAuth = await this.getSignAuth()\n\n const response = await this.request<{ signature: string }>(\n this.remoteConfig.endpoints.signMessage,\n { walletId: signAuth.walletId, chain: this.chain.name, nonce: signAuth.nonce, message },\n {\n bearer: signAuth.token,\n context: this.createContext('signMessage', { walletId: signAuth.walletId, nonce: signAuth.nonce }),\n }\n )\n\n if (!response.signature) throw new Error('RemoteWalletProvider: Missing signature in signMessage response')\n return response.signature\n }\n\n async importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails> {\n void mnemonic\n throw new Error('RemoteWalletProvider: importFromMnemonic() is not supported. Use importFromPrivateKey or generate().')\n }\n\n async importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails> {\n const agentId = this.config.user?.id\n if (!agentId) throw new Error('RemoteWalletProvider: user.id is required for key import')\n const serviceToken = await this.resolveServiceToken()\n\n return await this.requestLifecycleWallet(this.remoteConfig.endpoints.import, { agentId, chain: this.chain.name, privateKey }, serviceToken, 'import')\n }\n\n async export(): Promise<WarpWalletDetails> {\n const walletId = this.getWalletIdOrThrow()\n const serviceToken = await this.resolveServiceToken()\n\n const response = await this.request<{ provider?: WarpWalletProvider; address: string; privateKey?: string; externalId?: string }>(\n this.remoteConfig.endpoints.export,\n { walletId },\n {\n bearer: serviceToken,\n context: this.createContext('export', { walletId }),\n }\n )\n\n return {\n provider: response.provider ?? this.remoteConfig.providerName,\n address: response.address,\n privateKey: response.privateKey ?? null,\n externalId: response.externalId ?? walletId,\n }\n }\n\n async generate(): Promise<WarpWalletDetails> {\n const agentId = this.config.user?.id\n if (!agentId) throw new Error('RemoteWalletProvider: user.id is required for wallet generation')\n const serviceToken = await this.resolveServiceToken()\n\n return await this.requestLifecycleWallet(this.remoteConfig.endpoints.generate, { agentId, chain: this.chain.name }, serviceToken, 'generate')\n }\n\n private async requestLifecycleWallet(\n path: string,\n payload: Record<string, unknown>,\n token: string,\n operation: RemoteWalletOperation\n ): Promise<WarpWalletDetails> {\n const response = await this.request<RemoteWalletLifecycleResponse>(path, payload, {\n bearer: token,\n context: this.createContext(operation),\n })\n const walletDetails = this.toWalletDetails(response)\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n return walletDetails\n }\n\n private toWalletDetails(response: RemoteWalletLifecycleResponse): WarpWalletDetails {\n return {\n provider: response.provider ?? this.remoteConfig.providerName,\n address: response.address,\n externalId: response.externalId ?? response.walletId,\n }\n }\n\n private getWalletIdOrThrow(): string {\n const walletId = getWarpWalletExternalIdFromConfig(this.config, this.chain.name)\n if (!walletId) {\n throw new Error(`RemoteWalletProvider: externalId(walletId) is required for chain ${this.chain.name}`)\n }\n return walletId\n }\n\n private async resolveAccessToken(walletId: string, nonce: string): Promise<string> {\n if (this.remoteConfig.getAccessToken) {\n const token = await this.remoteConfig.getAccessToken({ walletId, chain: this.chain.name, nonce })\n return this.requireToken(token, 'access token callback')\n }\n if (this.remoteConfig.accessToken) return this.requireToken(this.remoteConfig.accessToken, 'access token')\n throw new Error('RemoteWalletProvider: No access token provider configured')\n }\n\n private async getSignAuth(): Promise<{ walletId: string; nonce: string; token: string }> {\n const walletId = this.getWalletIdOrThrow()\n const nonce = crypto.randomUUID()\n const token = await this.resolveAccessToken(walletId, nonce)\n return { walletId, nonce, token }\n }\n\n private async resolveServiceToken(): Promise<string> {\n if (this.remoteConfig.getServiceToken) {\n const token = await this.remoteConfig.getServiceToken()\n return this.requireToken(token, 'service token callback')\n }\n if (this.remoteConfig.serviceToken) return this.requireToken(this.remoteConfig.serviceToken, 'service token')\n throw new Error('RemoteWalletProvider: No service token configured for wallet lifecycle endpoints')\n }\n\n private toSerializableTransaction(tx: WarpAdapterGenericTransaction): unknown {\n if (tx && typeof tx === 'object') {\n if ('toPlainObject' in tx && typeof (tx as { toPlainObject?: () => unknown }).toPlainObject === 'function') {\n return (tx as { toPlainObject: () => unknown }).toPlainObject()\n }\n if ('toJSON' in tx && typeof (tx as { toJSON?: () => unknown }).toJSON === 'function') {\n return (tx as { toJSON: () => unknown }).toJSON()\n }\n }\n return tx\n }\n\n private async request<T>(\n path: string,\n payload: Record<string, unknown>,\n options: { bearer?: string; context: RemoteWalletRequestContext }\n ): Promise<T> {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), this.remoteConfig.timeoutMs ?? 15_000)\n const context = options.context\n\n try {\n const resolvedPayload = await this.resolvePayload(context, payload)\n const resolvedHeaders = await this.resolveHeaders(context, options.bearer)\n\n const response = await fetch(`${this.remoteConfig.baseUrl}${path}`, {\n method: 'POST',\n headers: resolvedHeaders,\n body: JSON.stringify(resolvedPayload, (_, value: unknown) => (typeof value === 'bigint' ? value.toString() : value)),\n signal: controller.signal,\n })\n\n if (!response.ok) {\n const text = await response.text()\n throw new Error(`RemoteWalletProvider request failed (${response.status}): ${text}`)\n }\n\n return (await response.json()) as T\n } finally {\n clearTimeout(timeout)\n }\n }\n\n private requireToken(token: unknown, source: string): string {\n if (typeof token !== 'string' || token.trim() === '') {\n throw new Error(`RemoteWalletProvider: ${source} returned an empty token`)\n }\n return token.trim()\n }\n\n private createContext(operation: RemoteWalletOperation, extra?: Partial<RemoteWalletRequestContext>): RemoteWalletRequestContext {\n return {\n operation,\n chain: this.chain.name,\n ...extra,\n }\n }\n\n private async resolveHeaders(context: RemoteWalletRequestContext, bearer?: string): Promise<Record<string, string>> {\n const headersFromConfig = this.remoteConfig.headers ?? {}\n const dynamicHeaders = this.remoteConfig.getHeaders ? await this.remoteConfig.getHeaders(context) : {}\n\n return {\n 'Content-Type': 'application/json',\n ...headersFromConfig,\n ...(dynamicHeaders ?? {}),\n ...(bearer ? { Authorization: `Bearer ${bearer}` } : {}),\n }\n }\n\n private async resolvePayload(context: RemoteWalletRequestContext, payload: Record<string, unknown>): Promise<Record<string, unknown>> {\n if (!this.remoteConfig.transformPayload) return payload\n return await this.remoteConfig.transformPayload(context, payload)\n }\n}\n","import { WarpWalletProvider } from '@joai/warps'\n\nexport const DEFAULT_REMOTE_WALLET_PROVIDER_NAME: WarpWalletProvider = 'remote'\n\nexport type RemoteWalletProviderEndpoints = {\n generate: string\n import: string\n export: string\n signTransaction: string\n signMessage: string\n}\n\nexport type RemoteWalletOperation = 'generate' | 'import' | 'export' | 'signTransaction' | 'signMessage'\n\nexport type RemoteWalletAccessTokenParams = {\n walletId: string\n chain: string\n nonce: string\n}\n\nexport type RemoteWalletRequestContext = {\n operation: RemoteWalletOperation\n chain: string\n walletId?: string\n nonce?: string\n}\n\nexport type RemoteWalletProviderConfig = {\n baseUrl: string\n allowInsecureHttp?: boolean\n providerName?: WarpWalletProvider\n endpoints?: Partial<RemoteWalletProviderEndpoints>\n timeoutMs?: number\n headers?: Record<string, string>\n getHeaders?: (context: RemoteWalletRequestContext) => Promise<Record<string, string> | undefined> | Record<string, string> | undefined\n transformPayload?: (\n context: RemoteWalletRequestContext,\n payload: Record<string, unknown>\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n serviceToken?: string\n getServiceToken?: () => Promise<string> | string\n accessToken?: string\n getAccessToken?: (params: RemoteWalletAccessTokenParams) => Promise<string> | string\n}\n\nexport type RemoteWalletLifecycleResponse = {\n provider?: WarpWalletProvider\n walletId: string\n externalId?: string\n address: string\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig, WarpWalletProvider } from '@joai/warps'\nimport { RemoteWalletProvider } from './RemoteWalletProvider'\nimport { RemoteWalletProviderConfig, DEFAULT_REMOTE_WALLET_PROVIDER_NAME } from './types'\n\nexport const createRemoteWalletProvider = (\n remoteConfig: RemoteWalletProviderConfig,\n fallbackProviderName: WarpWalletProvider = DEFAULT_REMOTE_WALLET_PROVIDER_NAME\n): WalletProviderFactory => {\n return (config: WarpClientConfig, chain: WarpChainInfo) => new RemoteWalletProvider(config, chain, remoteConfig, fallbackProviderName)\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/RemoteWalletProvider.ts","../src/types.ts","../src/helpers.ts"],"sourcesContent":["export * from './RemoteWalletProvider'\nexport * from './helpers'\nexport * from './types'\n","import {\n getWarpWalletAddressFromConfig,\n getWarpWalletExternalIdFromConfig,\n setWarpWalletInConfig,\n WalletProvider,\n WarpAdapterGenericTransaction,\n WarpChainInfo,\n WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@joai/warps'\nimport {\n RemoteWalletOperation,\n RemoteWalletRequestContext,\n RemoteWalletLifecycleResponse,\n RemoteWalletProviderEndpoints,\n RemoteWalletProviderConfig,\n DEFAULT_REMOTE_WALLET_PROVIDER_NAME,\n} from './types'\n\nconst defaultEndpoints: RemoteWalletProviderEndpoints = {\n generate: '/v1/wallets/generate',\n import: '/v1/wallets/import',\n export: '/v1/wallets/export',\n delete: '/v1/wallets/delete',\n signTransaction: '/v1/sign/transaction',\n signMessage: '/v1/sign/message',\n}\n\ntype ResolvedRemoteWalletProviderConfig = RemoteWalletProviderConfig & {\n providerName: WarpWalletProvider\n endpoints: RemoteWalletProviderEndpoints\n}\n\ntype SignTransactionResponse = {\n signedTransaction?: unknown\n signature?: unknown\n transactionHash?: unknown\n}\n\nconst trimTrailingSlash = (value: string): string => value.replace(/\\/+$/, '')\nconst isStrictHex = (value: string): boolean => /^[0-9a-f]+$/i.test(value) && value.length % 2 === 0\nconst isLoopbackHost = (host: string): boolean => ['localhost', '127.0.0.1', '::1'].includes(host.toLowerCase())\nconst isRecord = (value: unknown): value is Record<string, unknown> => Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n\nconst normalizeAndValidateBaseUrl = (baseUrl: string, allowInsecureHttp?: boolean): string => {\n const normalized = trimTrailingSlash(baseUrl.trim())\n let parsedUrl: URL\n\n try {\n parsedUrl = new URL(normalized)\n } catch {\n throw new Error('RemoteWalletProvider: baseUrl must be an absolute URL')\n }\n\n const isHttps = parsedUrl.protocol.toLowerCase() === 'https:'\n if (!isHttps && !allowInsecureHttp && !isLoopbackHost(parsedUrl.hostname)) {\n throw new Error('RemoteWalletProvider: baseUrl must use HTTPS unless allowInsecureHttp is explicitly enabled')\n }\n\n return normalized\n}\n\nconst normalizeEndpointPath = (path: string): string => {\n const normalized = path.trim()\n if (!normalized) {\n throw new Error('RemoteWalletProvider: endpoint path must be a non-empty string')\n }\n\n try {\n new URL(normalized)\n throw new Error('RemoteWalletProvider: endpoint path must be relative')\n } catch (error) {\n if (error instanceof Error && error.message.includes('must be relative')) {\n throw error\n }\n }\n\n return normalized.startsWith('/') ? normalized : `/${normalized}`\n}\n\nconst normalizeEndpoints = (endpoints: RemoteWalletProviderEndpoints): RemoteWalletProviderEndpoints => ({\n generate: normalizeEndpointPath(endpoints.generate),\n import: normalizeEndpointPath(endpoints.import),\n export: normalizeEndpointPath(endpoints.export),\n delete: normalizeEndpointPath(endpoints.delete),\n signTransaction: normalizeEndpointPath(endpoints.signTransaction),\n signMessage: normalizeEndpointPath(endpoints.signMessage),\n})\n\nconst withDefaults = (\n remoteConfig: RemoteWalletProviderConfig,\n fallbackProviderName: WarpWalletProvider\n): ResolvedRemoteWalletProviderConfig => {\n const baseUrl = normalizeAndValidateBaseUrl(remoteConfig.baseUrl, remoteConfig.allowInsecureHttp)\n const endpoints = normalizeEndpoints({\n ...defaultEndpoints,\n ...(remoteConfig.endpoints || {}),\n })\n\n return {\n ...remoteConfig,\n baseUrl,\n providerName: remoteConfig.providerName ?? fallbackProviderName,\n endpoints,\n }\n}\n\nexport class RemoteWalletProvider implements WalletProvider {\n protected readonly remoteConfig: ResolvedRemoteWalletProviderConfig\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo,\n remoteConfig: RemoteWalletProviderConfig,\n fallbackProviderName: WarpWalletProvider = DEFAULT_REMOTE_WALLET_PROVIDER_NAME\n ) {\n this.remoteConfig = withDefaults(remoteConfig, fallbackProviderName)\n }\n\n async getAddress(): Promise<string | null> {\n return getWarpWalletAddressFromConfig(this.config, this.chain.name)\n }\n\n async getPublicKey(): Promise<string | null> {\n return null\n }\n\n async signTransaction(tx: WarpAdapterGenericTransaction): Promise<WarpAdapterGenericTransaction> {\n const signAuth = await this.getSignAuth()\n const transaction = this.toSerializableTransaction(tx)\n\n const response = await this.request<SignTransactionResponse>(\n this.remoteConfig.endpoints.signTransaction,\n { walletId: signAuth.walletId, chain: this.chain.name, nonce: signAuth.nonce, transaction },\n {\n bearer: signAuth.token,\n context: this.createContext('signTransaction', { walletId: signAuth.walletId, nonce: signAuth.nonce }),\n }\n )\n const txRecord = isRecord(tx) ? tx : {}\n\n if (typeof response.transactionHash === 'string' && response.transactionHash.trim() !== '') {\n return { ...txRecord, transactionHash: response.transactionHash }\n }\n\n if (response.signedTransaction !== undefined && response.signedTransaction !== null) {\n if (typeof response.signedTransaction === 'string') {\n return { ...txRecord, signature: response.signedTransaction }\n }\n\n if (isRecord(response.signedTransaction)) {\n return { ...txRecord, ...response.signedTransaction }\n }\n\n throw new Error('RemoteWalletProvider: Invalid signedTransaction format from signer service')\n }\n\n if (response.signature !== undefined && response.signature !== null) {\n const isMultiversxSignature = this.chain.name === 'multiversx' || this.chain.name === 'claws'\n\n if (isMultiversxSignature) {\n if (typeof response.signature !== 'string' || !isStrictHex(response.signature)) {\n throw new Error('RemoteWalletProvider: Invalid hex signature for multiversx transaction')\n }\n return { ...txRecord, signature: Buffer.from(response.signature, 'hex') }\n }\n\n if (typeof response.signature !== 'string' && !Array.isArray(response.signature)) {\n throw new Error('RemoteWalletProvider: Invalid signature format from signer service')\n }\n\n return { ...txRecord, signature: response.signature }\n }\n\n throw new Error('RemoteWalletProvider: Invalid signTransaction response from signer service')\n }\n\n async signMessage(message: string): Promise<string> {\n const signAuth = await this.getSignAuth()\n\n const response = await this.request<{ signature: string }>(\n this.remoteConfig.endpoints.signMessage,\n { walletId: signAuth.walletId, chain: this.chain.name, nonce: signAuth.nonce, message },\n {\n bearer: signAuth.token,\n context: this.createContext('signMessage', { walletId: signAuth.walletId, nonce: signAuth.nonce }),\n }\n )\n\n if (!response.signature) throw new Error('RemoteWalletProvider: Missing signature in signMessage response')\n return response.signature\n }\n\n async importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails> {\n void mnemonic\n throw new Error('RemoteWalletProvider: importFromMnemonic() is not supported. Use importFromPrivateKey or generate().')\n }\n\n async importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails> {\n const agentId = this.config.user?.id\n if (!agentId) throw new Error('RemoteWalletProvider: user.id is required for key import')\n const serviceToken = await this.resolveServiceToken()\n\n return await this.requestLifecycleWallet(this.remoteConfig.endpoints.import, { agentId, chain: this.chain.name, privateKey }, serviceToken, 'import')\n }\n\n async export(): Promise<WarpWalletDetails> {\n const walletId = this.getWalletIdOrThrow()\n const serviceToken = await this.resolveServiceToken()\n\n const response = await this.request<{ provider?: WarpWalletProvider; address: string; privateKey?: string; externalId?: string }>(\n this.remoteConfig.endpoints.export,\n { walletId },\n {\n bearer: serviceToken,\n context: this.createContext('export', { walletId }),\n }\n )\n\n return {\n provider: response.provider ?? this.remoteConfig.providerName,\n address: response.address,\n privateKey: response.privateKey ?? null,\n externalId: response.externalId ?? walletId,\n }\n }\n\n async generate(): Promise<WarpWalletDetails> {\n const agentId = this.config.user?.id\n if (!agentId) throw new Error('RemoteWalletProvider: user.id is required for wallet generation')\n const serviceToken = await this.resolveServiceToken()\n\n return await this.requestLifecycleWallet(this.remoteConfig.endpoints.generate, { agentId, chain: this.chain.name }, serviceToken, 'generate')\n }\n\n async delete(externalId: string): Promise<void> {\n const serviceToken = await this.resolveServiceToken()\n\n await this.request(\n this.remoteConfig.endpoints.delete,\n { walletId: externalId },\n {\n bearer: serviceToken,\n context: this.createContext('delete', { walletId: externalId }),\n }\n )\n }\n\n private async requestLifecycleWallet(\n path: string,\n payload: Record<string, unknown>,\n token: string,\n operation: RemoteWalletOperation\n ): Promise<WarpWalletDetails> {\n const response = await this.request<RemoteWalletLifecycleResponse>(path, payload, {\n bearer: token,\n context: this.createContext(operation),\n })\n const walletDetails = this.toWalletDetails(response)\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n return walletDetails\n }\n\n private toWalletDetails(response: RemoteWalletLifecycleResponse): WarpWalletDetails {\n return {\n provider: response.provider ?? this.remoteConfig.providerName,\n address: response.address,\n externalId: response.externalId ?? response.walletId,\n }\n }\n\n private getWalletIdOrThrow(): string {\n const walletId = getWarpWalletExternalIdFromConfig(this.config, this.chain.name)\n if (!walletId) {\n throw new Error(`RemoteWalletProvider: externalId(walletId) is required for chain ${this.chain.name}`)\n }\n return walletId\n }\n\n private async resolveAccessToken(walletId: string, nonce: string): Promise<string> {\n if (this.remoteConfig.getAccessToken) {\n const token = await this.remoteConfig.getAccessToken({ walletId, chain: this.chain.name, nonce })\n return this.requireToken(token, 'access token callback')\n }\n if (this.remoteConfig.accessToken) return this.requireToken(this.remoteConfig.accessToken, 'access token')\n throw new Error('RemoteWalletProvider: No access token provider configured')\n }\n\n private async getSignAuth(): Promise<{ walletId: string; nonce: string; token: string }> {\n const walletId = this.getWalletIdOrThrow()\n const nonce = crypto.randomUUID()\n const token = await this.resolveAccessToken(walletId, nonce)\n return { walletId, nonce, token }\n }\n\n private async resolveServiceToken(): Promise<string> {\n if (this.remoteConfig.getServiceToken) {\n const token = await this.remoteConfig.getServiceToken()\n return this.requireToken(token, 'service token callback')\n }\n if (this.remoteConfig.serviceToken) return this.requireToken(this.remoteConfig.serviceToken, 'service token')\n throw new Error('RemoteWalletProvider: No service token configured for wallet lifecycle endpoints')\n }\n\n private toSerializableTransaction(tx: WarpAdapterGenericTransaction): unknown {\n if (tx && typeof tx === 'object') {\n if ('toPlainObject' in tx && typeof (tx as { toPlainObject?: () => unknown }).toPlainObject === 'function') {\n return (tx as { toPlainObject: () => unknown }).toPlainObject()\n }\n if ('toJSON' in tx && typeof (tx as { toJSON?: () => unknown }).toJSON === 'function') {\n return (tx as { toJSON: () => unknown }).toJSON()\n }\n }\n return tx\n }\n\n private async request<T>(\n path: string,\n payload: Record<string, unknown>,\n options: { bearer?: string; context: RemoteWalletRequestContext }\n ): Promise<T> {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), this.remoteConfig.timeoutMs ?? 15_000)\n const context = options.context\n\n try {\n const resolvedPayload = await this.resolvePayload(context, payload)\n const resolvedHeaders = await this.resolveHeaders(context, options.bearer)\n\n const response = await fetch(`${this.remoteConfig.baseUrl}${path}`, {\n method: 'POST',\n headers: resolvedHeaders,\n body: JSON.stringify(resolvedPayload, (_, value: unknown) => (typeof value === 'bigint' ? value.toString() : value)),\n signal: controller.signal,\n })\n\n if (!response.ok) {\n const text = await response.text()\n throw new Error(`RemoteWalletProvider request failed (${response.status}): ${text}`)\n }\n\n if (response.status === 204) return undefined as T\n return (await response.json()) as T\n } finally {\n clearTimeout(timeout)\n }\n }\n\n private requireToken(token: unknown, source: string): string {\n if (typeof token !== 'string' || token.trim() === '') {\n throw new Error(`RemoteWalletProvider: ${source} returned an empty token`)\n }\n return token.trim()\n }\n\n private createContext(operation: RemoteWalletOperation, extra?: Partial<RemoteWalletRequestContext>): RemoteWalletRequestContext {\n return {\n operation,\n chain: this.chain.name,\n ...extra,\n }\n }\n\n private async resolveHeaders(context: RemoteWalletRequestContext, bearer?: string): Promise<Record<string, string>> {\n const headersFromConfig = this.remoteConfig.headers ?? {}\n const dynamicHeaders = this.remoteConfig.getHeaders ? await this.remoteConfig.getHeaders(context) : {}\n\n return {\n 'Content-Type': 'application/json',\n ...headersFromConfig,\n ...(dynamicHeaders ?? {}),\n ...(bearer ? { Authorization: `Bearer ${bearer}` } : {}),\n }\n }\n\n private async resolvePayload(context: RemoteWalletRequestContext, payload: Record<string, unknown>): Promise<Record<string, unknown>> {\n if (!this.remoteConfig.transformPayload) return payload\n return await this.remoteConfig.transformPayload(context, payload)\n }\n}\n","import { WarpWalletProvider } from '@joai/warps'\n\nexport const DEFAULT_REMOTE_WALLET_PROVIDER_NAME: WarpWalletProvider = 'remote'\n\nexport type RemoteWalletProviderEndpoints = {\n generate: string\n import: string\n export: string\n delete: string\n signTransaction: string\n signMessage: string\n}\n\nexport type RemoteWalletOperation = 'generate' | 'import' | 'export' | 'delete' | 'signTransaction' | 'signMessage'\n\nexport type RemoteWalletAccessTokenParams = {\n walletId: string\n chain: string\n nonce: string\n}\n\nexport type RemoteWalletRequestContext = {\n operation: RemoteWalletOperation\n chain: string\n walletId?: string\n nonce?: string\n}\n\nexport type RemoteWalletProviderConfig = {\n baseUrl: string\n allowInsecureHttp?: boolean\n providerName?: WarpWalletProvider\n endpoints?: Partial<RemoteWalletProviderEndpoints>\n timeoutMs?: number\n headers?: Record<string, string>\n getHeaders?: (context: RemoteWalletRequestContext) => Promise<Record<string, string> | undefined> | Record<string, string> | undefined\n transformPayload?: (\n context: RemoteWalletRequestContext,\n payload: Record<string, unknown>\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n serviceToken?: string\n getServiceToken?: () => Promise<string> | string\n accessToken?: string\n getAccessToken?: (params: RemoteWalletAccessTokenParams) => Promise<string> | string\n}\n\nexport type RemoteWalletLifecycleResponse = {\n provider?: WarpWalletProvider\n walletId: string\n externalId?: string\n address: string\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig, WarpWalletProvider } from '@joai/warps'\nimport { RemoteWalletProvider } from './RemoteWalletProvider'\nimport { RemoteWalletProviderConfig, DEFAULT_REMOTE_WALLET_PROVIDER_NAME } from './types'\n\nexport const createRemoteWalletProvider = (\n remoteConfig: RemoteWalletProviderConfig,\n fallbackProviderName: WarpWalletProvider = DEFAULT_REMOTE_WALLET_PROVIDER_NAME\n): WalletProviderFactory => {\n return (config: WarpClientConfig, chain: WarpChainInfo) => new RemoteWalletProvider(config, chain, remoteConfig, fallbackProviderName)\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -13,6 +13,7 @@ var defaultEndpoints = {
13
13
  generate: "/v1/wallets/generate",
14
14
  import: "/v1/wallets/import",
15
15
  export: "/v1/wallets/export",
16
+ delete: "/v1/wallets/delete",
16
17
  signTransaction: "/v1/sign/transaction",
17
18
  signMessage: "/v1/sign/message"
18
19
  };
@@ -53,6 +54,7 @@ var normalizeEndpoints = (endpoints) => ({
53
54
  generate: normalizeEndpointPath(endpoints.generate),
54
55
  import: normalizeEndpointPath(endpoints.import),
55
56
  export: normalizeEndpointPath(endpoints.export),
57
+ delete: normalizeEndpointPath(endpoints.delete),
56
58
  signTransaction: normalizeEndpointPath(endpoints.signTransaction),
57
59
  signMessage: normalizeEndpointPath(endpoints.signMessage)
58
60
  });
@@ -167,6 +169,17 @@ var RemoteWalletProvider = class {
167
169
  const serviceToken = await this.resolveServiceToken();
168
170
  return await this.requestLifecycleWallet(this.remoteConfig.endpoints.generate, { agentId, chain: this.chain.name }, serviceToken, "generate");
169
171
  }
172
+ async delete(externalId) {
173
+ const serviceToken = await this.resolveServiceToken();
174
+ await this.request(
175
+ this.remoteConfig.endpoints.delete,
176
+ { walletId: externalId },
177
+ {
178
+ bearer: serviceToken,
179
+ context: this.createContext("delete", { walletId: externalId })
180
+ }
181
+ );
182
+ }
170
183
  async requestLifecycleWallet(path, payload, token, operation) {
171
184
  const response = await this.request(path, payload, {
172
185
  bearer: token,
@@ -240,6 +253,7 @@ var RemoteWalletProvider = class {
240
253
  const text = await response.text();
241
254
  throw new Error(`RemoteWalletProvider request failed (${response.status}): ${text}`);
242
255
  }
256
+ if (response.status === 204) return void 0;
243
257
  return await response.json();
244
258
  } finally {
245
259
  clearTimeout(timeout);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/RemoteWalletProvider.ts","../src/types.ts","../src/helpers.ts"],"sourcesContent":["import {\n getWarpWalletAddressFromConfig,\n getWarpWalletExternalIdFromConfig,\n setWarpWalletInConfig,\n WalletProvider,\n WarpAdapterGenericTransaction,\n WarpChainInfo,\n WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@joai/warps'\nimport {\n RemoteWalletOperation,\n RemoteWalletRequestContext,\n RemoteWalletLifecycleResponse,\n RemoteWalletProviderEndpoints,\n RemoteWalletProviderConfig,\n DEFAULT_REMOTE_WALLET_PROVIDER_NAME,\n} from './types'\n\nconst defaultEndpoints: RemoteWalletProviderEndpoints = {\n generate: '/v1/wallets/generate',\n import: '/v1/wallets/import',\n export: '/v1/wallets/export',\n signTransaction: '/v1/sign/transaction',\n signMessage: '/v1/sign/message',\n}\n\ntype ResolvedRemoteWalletProviderConfig = RemoteWalletProviderConfig & {\n providerName: WarpWalletProvider\n endpoints: RemoteWalletProviderEndpoints\n}\n\ntype SignTransactionResponse = {\n signedTransaction?: unknown\n signature?: unknown\n transactionHash?: unknown\n}\n\nconst trimTrailingSlash = (value: string): string => value.replace(/\\/+$/, '')\nconst isStrictHex = (value: string): boolean => /^[0-9a-f]+$/i.test(value) && value.length % 2 === 0\nconst isLoopbackHost = (host: string): boolean => ['localhost', '127.0.0.1', '::1'].includes(host.toLowerCase())\nconst isRecord = (value: unknown): value is Record<string, unknown> => Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n\nconst normalizeAndValidateBaseUrl = (baseUrl: string, allowInsecureHttp?: boolean): string => {\n const normalized = trimTrailingSlash(baseUrl.trim())\n let parsedUrl: URL\n\n try {\n parsedUrl = new URL(normalized)\n } catch {\n throw new Error('RemoteWalletProvider: baseUrl must be an absolute URL')\n }\n\n const isHttps = parsedUrl.protocol.toLowerCase() === 'https:'\n if (!isHttps && !allowInsecureHttp && !isLoopbackHost(parsedUrl.hostname)) {\n throw new Error('RemoteWalletProvider: baseUrl must use HTTPS unless allowInsecureHttp is explicitly enabled')\n }\n\n return normalized\n}\n\nconst normalizeEndpointPath = (path: string): string => {\n const normalized = path.trim()\n if (!normalized) {\n throw new Error('RemoteWalletProvider: endpoint path must be a non-empty string')\n }\n\n try {\n new URL(normalized)\n throw new Error('RemoteWalletProvider: endpoint path must be relative')\n } catch (error) {\n if (error instanceof Error && error.message.includes('must be relative')) {\n throw error\n }\n }\n\n return normalized.startsWith('/') ? normalized : `/${normalized}`\n}\n\nconst normalizeEndpoints = (endpoints: RemoteWalletProviderEndpoints): RemoteWalletProviderEndpoints => ({\n generate: normalizeEndpointPath(endpoints.generate),\n import: normalizeEndpointPath(endpoints.import),\n export: normalizeEndpointPath(endpoints.export),\n signTransaction: normalizeEndpointPath(endpoints.signTransaction),\n signMessage: normalizeEndpointPath(endpoints.signMessage),\n})\n\nconst withDefaults = (\n remoteConfig: RemoteWalletProviderConfig,\n fallbackProviderName: WarpWalletProvider\n): ResolvedRemoteWalletProviderConfig => {\n const baseUrl = normalizeAndValidateBaseUrl(remoteConfig.baseUrl, remoteConfig.allowInsecureHttp)\n const endpoints = normalizeEndpoints({\n ...defaultEndpoints,\n ...(remoteConfig.endpoints || {}),\n })\n\n return {\n ...remoteConfig,\n baseUrl,\n providerName: remoteConfig.providerName ?? fallbackProviderName,\n endpoints,\n }\n}\n\nexport class RemoteWalletProvider implements WalletProvider {\n protected readonly remoteConfig: ResolvedRemoteWalletProviderConfig\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo,\n remoteConfig: RemoteWalletProviderConfig,\n fallbackProviderName: WarpWalletProvider = DEFAULT_REMOTE_WALLET_PROVIDER_NAME\n ) {\n this.remoteConfig = withDefaults(remoteConfig, fallbackProviderName)\n }\n\n async getAddress(): Promise<string | null> {\n return getWarpWalletAddressFromConfig(this.config, this.chain.name)\n }\n\n async getPublicKey(): Promise<string | null> {\n return null\n }\n\n async signTransaction(tx: WarpAdapterGenericTransaction): Promise<WarpAdapterGenericTransaction> {\n const signAuth = await this.getSignAuth()\n const transaction = this.toSerializableTransaction(tx)\n\n const response = await this.request<SignTransactionResponse>(\n this.remoteConfig.endpoints.signTransaction,\n { walletId: signAuth.walletId, chain: this.chain.name, nonce: signAuth.nonce, transaction },\n {\n bearer: signAuth.token,\n context: this.createContext('signTransaction', { walletId: signAuth.walletId, nonce: signAuth.nonce }),\n }\n )\n const txRecord = isRecord(tx) ? tx : {}\n\n if (typeof response.transactionHash === 'string' && response.transactionHash.trim() !== '') {\n return { ...txRecord, transactionHash: response.transactionHash }\n }\n\n if (response.signedTransaction !== undefined && response.signedTransaction !== null) {\n if (typeof response.signedTransaction === 'string') {\n return { ...txRecord, signature: response.signedTransaction }\n }\n\n if (isRecord(response.signedTransaction)) {\n return { ...txRecord, ...response.signedTransaction }\n }\n\n throw new Error('RemoteWalletProvider: Invalid signedTransaction format from signer service')\n }\n\n if (response.signature !== undefined && response.signature !== null) {\n const isMultiversxSignature = this.chain.name === 'multiversx' || this.chain.name === 'claws'\n\n if (isMultiversxSignature) {\n if (typeof response.signature !== 'string' || !isStrictHex(response.signature)) {\n throw new Error('RemoteWalletProvider: Invalid hex signature for multiversx transaction')\n }\n return { ...txRecord, signature: Buffer.from(response.signature, 'hex') }\n }\n\n if (typeof response.signature !== 'string' && !Array.isArray(response.signature)) {\n throw new Error('RemoteWalletProvider: Invalid signature format from signer service')\n }\n\n return { ...txRecord, signature: response.signature }\n }\n\n throw new Error('RemoteWalletProvider: Invalid signTransaction response from signer service')\n }\n\n async signMessage(message: string): Promise<string> {\n const signAuth = await this.getSignAuth()\n\n const response = await this.request<{ signature: string }>(\n this.remoteConfig.endpoints.signMessage,\n { walletId: signAuth.walletId, chain: this.chain.name, nonce: signAuth.nonce, message },\n {\n bearer: signAuth.token,\n context: this.createContext('signMessage', { walletId: signAuth.walletId, nonce: signAuth.nonce }),\n }\n )\n\n if (!response.signature) throw new Error('RemoteWalletProvider: Missing signature in signMessage response')\n return response.signature\n }\n\n async importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails> {\n void mnemonic\n throw new Error('RemoteWalletProvider: importFromMnemonic() is not supported. Use importFromPrivateKey or generate().')\n }\n\n async importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails> {\n const agentId = this.config.user?.id\n if (!agentId) throw new Error('RemoteWalletProvider: user.id is required for key import')\n const serviceToken = await this.resolveServiceToken()\n\n return await this.requestLifecycleWallet(this.remoteConfig.endpoints.import, { agentId, chain: this.chain.name, privateKey }, serviceToken, 'import')\n }\n\n async export(): Promise<WarpWalletDetails> {\n const walletId = this.getWalletIdOrThrow()\n const serviceToken = await this.resolveServiceToken()\n\n const response = await this.request<{ provider?: WarpWalletProvider; address: string; privateKey?: string; externalId?: string }>(\n this.remoteConfig.endpoints.export,\n { walletId },\n {\n bearer: serviceToken,\n context: this.createContext('export', { walletId }),\n }\n )\n\n return {\n provider: response.provider ?? this.remoteConfig.providerName,\n address: response.address,\n privateKey: response.privateKey ?? null,\n externalId: response.externalId ?? walletId,\n }\n }\n\n async generate(): Promise<WarpWalletDetails> {\n const agentId = this.config.user?.id\n if (!agentId) throw new Error('RemoteWalletProvider: user.id is required for wallet generation')\n const serviceToken = await this.resolveServiceToken()\n\n return await this.requestLifecycleWallet(this.remoteConfig.endpoints.generate, { agentId, chain: this.chain.name }, serviceToken, 'generate')\n }\n\n private async requestLifecycleWallet(\n path: string,\n payload: Record<string, unknown>,\n token: string,\n operation: RemoteWalletOperation\n ): Promise<WarpWalletDetails> {\n const response = await this.request<RemoteWalletLifecycleResponse>(path, payload, {\n bearer: token,\n context: this.createContext(operation),\n })\n const walletDetails = this.toWalletDetails(response)\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n return walletDetails\n }\n\n private toWalletDetails(response: RemoteWalletLifecycleResponse): WarpWalletDetails {\n return {\n provider: response.provider ?? this.remoteConfig.providerName,\n address: response.address,\n externalId: response.externalId ?? response.walletId,\n }\n }\n\n private getWalletIdOrThrow(): string {\n const walletId = getWarpWalletExternalIdFromConfig(this.config, this.chain.name)\n if (!walletId) {\n throw new Error(`RemoteWalletProvider: externalId(walletId) is required for chain ${this.chain.name}`)\n }\n return walletId\n }\n\n private async resolveAccessToken(walletId: string, nonce: string): Promise<string> {\n if (this.remoteConfig.getAccessToken) {\n const token = await this.remoteConfig.getAccessToken({ walletId, chain: this.chain.name, nonce })\n return this.requireToken(token, 'access token callback')\n }\n if (this.remoteConfig.accessToken) return this.requireToken(this.remoteConfig.accessToken, 'access token')\n throw new Error('RemoteWalletProvider: No access token provider configured')\n }\n\n private async getSignAuth(): Promise<{ walletId: string; nonce: string; token: string }> {\n const walletId = this.getWalletIdOrThrow()\n const nonce = crypto.randomUUID()\n const token = await this.resolveAccessToken(walletId, nonce)\n return { walletId, nonce, token }\n }\n\n private async resolveServiceToken(): Promise<string> {\n if (this.remoteConfig.getServiceToken) {\n const token = await this.remoteConfig.getServiceToken()\n return this.requireToken(token, 'service token callback')\n }\n if (this.remoteConfig.serviceToken) return this.requireToken(this.remoteConfig.serviceToken, 'service token')\n throw new Error('RemoteWalletProvider: No service token configured for wallet lifecycle endpoints')\n }\n\n private toSerializableTransaction(tx: WarpAdapterGenericTransaction): unknown {\n if (tx && typeof tx === 'object') {\n if ('toPlainObject' in tx && typeof (tx as { toPlainObject?: () => unknown }).toPlainObject === 'function') {\n return (tx as { toPlainObject: () => unknown }).toPlainObject()\n }\n if ('toJSON' in tx && typeof (tx as { toJSON?: () => unknown }).toJSON === 'function') {\n return (tx as { toJSON: () => unknown }).toJSON()\n }\n }\n return tx\n }\n\n private async request<T>(\n path: string,\n payload: Record<string, unknown>,\n options: { bearer?: string; context: RemoteWalletRequestContext }\n ): Promise<T> {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), this.remoteConfig.timeoutMs ?? 15_000)\n const context = options.context\n\n try {\n const resolvedPayload = await this.resolvePayload(context, payload)\n const resolvedHeaders = await this.resolveHeaders(context, options.bearer)\n\n const response = await fetch(`${this.remoteConfig.baseUrl}${path}`, {\n method: 'POST',\n headers: resolvedHeaders,\n body: JSON.stringify(resolvedPayload, (_, value: unknown) => (typeof value === 'bigint' ? value.toString() : value)),\n signal: controller.signal,\n })\n\n if (!response.ok) {\n const text = await response.text()\n throw new Error(`RemoteWalletProvider request failed (${response.status}): ${text}`)\n }\n\n return (await response.json()) as T\n } finally {\n clearTimeout(timeout)\n }\n }\n\n private requireToken(token: unknown, source: string): string {\n if (typeof token !== 'string' || token.trim() === '') {\n throw new Error(`RemoteWalletProvider: ${source} returned an empty token`)\n }\n return token.trim()\n }\n\n private createContext(operation: RemoteWalletOperation, extra?: Partial<RemoteWalletRequestContext>): RemoteWalletRequestContext {\n return {\n operation,\n chain: this.chain.name,\n ...extra,\n }\n }\n\n private async resolveHeaders(context: RemoteWalletRequestContext, bearer?: string): Promise<Record<string, string>> {\n const headersFromConfig = this.remoteConfig.headers ?? {}\n const dynamicHeaders = this.remoteConfig.getHeaders ? await this.remoteConfig.getHeaders(context) : {}\n\n return {\n 'Content-Type': 'application/json',\n ...headersFromConfig,\n ...(dynamicHeaders ?? {}),\n ...(bearer ? { Authorization: `Bearer ${bearer}` } : {}),\n }\n }\n\n private async resolvePayload(context: RemoteWalletRequestContext, payload: Record<string, unknown>): Promise<Record<string, unknown>> {\n if (!this.remoteConfig.transformPayload) return payload\n return await this.remoteConfig.transformPayload(context, payload)\n }\n}\n","import { WarpWalletProvider } from '@joai/warps'\n\nexport const DEFAULT_REMOTE_WALLET_PROVIDER_NAME: WarpWalletProvider = 'remote'\n\nexport type RemoteWalletProviderEndpoints = {\n generate: string\n import: string\n export: string\n signTransaction: string\n signMessage: string\n}\n\nexport type RemoteWalletOperation = 'generate' | 'import' | 'export' | 'signTransaction' | 'signMessage'\n\nexport type RemoteWalletAccessTokenParams = {\n walletId: string\n chain: string\n nonce: string\n}\n\nexport type RemoteWalletRequestContext = {\n operation: RemoteWalletOperation\n chain: string\n walletId?: string\n nonce?: string\n}\n\nexport type RemoteWalletProviderConfig = {\n baseUrl: string\n allowInsecureHttp?: boolean\n providerName?: WarpWalletProvider\n endpoints?: Partial<RemoteWalletProviderEndpoints>\n timeoutMs?: number\n headers?: Record<string, string>\n getHeaders?: (context: RemoteWalletRequestContext) => Promise<Record<string, string> | undefined> | Record<string, string> | undefined\n transformPayload?: (\n context: RemoteWalletRequestContext,\n payload: Record<string, unknown>\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n serviceToken?: string\n getServiceToken?: () => Promise<string> | string\n accessToken?: string\n getAccessToken?: (params: RemoteWalletAccessTokenParams) => Promise<string> | string\n}\n\nexport type RemoteWalletLifecycleResponse = {\n provider?: WarpWalletProvider\n walletId: string\n externalId?: string\n address: string\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig, WarpWalletProvider } from '@joai/warps'\nimport { RemoteWalletProvider } from './RemoteWalletProvider'\nimport { RemoteWalletProviderConfig, DEFAULT_REMOTE_WALLET_PROVIDER_NAME } from './types'\n\nexport const createRemoteWalletProvider = (\n remoteConfig: RemoteWalletProviderConfig,\n fallbackProviderName: WarpWalletProvider = DEFAULT_REMOTE_WALLET_PROVIDER_NAME\n): WalletProviderFactory => {\n return (config: WarpClientConfig, chain: WarpChainInfo) => new RemoteWalletProvider(config, chain, remoteConfig, fallbackProviderName)\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/RemoteWalletProvider.ts","../src/types.ts","../src/helpers.ts"],"sourcesContent":["import {\n getWarpWalletAddressFromConfig,\n getWarpWalletExternalIdFromConfig,\n setWarpWalletInConfig,\n WalletProvider,\n WarpAdapterGenericTransaction,\n WarpChainInfo,\n WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@joai/warps'\nimport {\n RemoteWalletOperation,\n RemoteWalletRequestContext,\n RemoteWalletLifecycleResponse,\n RemoteWalletProviderEndpoints,\n RemoteWalletProviderConfig,\n DEFAULT_REMOTE_WALLET_PROVIDER_NAME,\n} from './types'\n\nconst defaultEndpoints: RemoteWalletProviderEndpoints = {\n generate: '/v1/wallets/generate',\n import: '/v1/wallets/import',\n export: '/v1/wallets/export',\n delete: '/v1/wallets/delete',\n signTransaction: '/v1/sign/transaction',\n signMessage: '/v1/sign/message',\n}\n\ntype ResolvedRemoteWalletProviderConfig = RemoteWalletProviderConfig & {\n providerName: WarpWalletProvider\n endpoints: RemoteWalletProviderEndpoints\n}\n\ntype SignTransactionResponse = {\n signedTransaction?: unknown\n signature?: unknown\n transactionHash?: unknown\n}\n\nconst trimTrailingSlash = (value: string): string => value.replace(/\\/+$/, '')\nconst isStrictHex = (value: string): boolean => /^[0-9a-f]+$/i.test(value) && value.length % 2 === 0\nconst isLoopbackHost = (host: string): boolean => ['localhost', '127.0.0.1', '::1'].includes(host.toLowerCase())\nconst isRecord = (value: unknown): value is Record<string, unknown> => Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n\nconst normalizeAndValidateBaseUrl = (baseUrl: string, allowInsecureHttp?: boolean): string => {\n const normalized = trimTrailingSlash(baseUrl.trim())\n let parsedUrl: URL\n\n try {\n parsedUrl = new URL(normalized)\n } catch {\n throw new Error('RemoteWalletProvider: baseUrl must be an absolute URL')\n }\n\n const isHttps = parsedUrl.protocol.toLowerCase() === 'https:'\n if (!isHttps && !allowInsecureHttp && !isLoopbackHost(parsedUrl.hostname)) {\n throw new Error('RemoteWalletProvider: baseUrl must use HTTPS unless allowInsecureHttp is explicitly enabled')\n }\n\n return normalized\n}\n\nconst normalizeEndpointPath = (path: string): string => {\n const normalized = path.trim()\n if (!normalized) {\n throw new Error('RemoteWalletProvider: endpoint path must be a non-empty string')\n }\n\n try {\n new URL(normalized)\n throw new Error('RemoteWalletProvider: endpoint path must be relative')\n } catch (error) {\n if (error instanceof Error && error.message.includes('must be relative')) {\n throw error\n }\n }\n\n return normalized.startsWith('/') ? normalized : `/${normalized}`\n}\n\nconst normalizeEndpoints = (endpoints: RemoteWalletProviderEndpoints): RemoteWalletProviderEndpoints => ({\n generate: normalizeEndpointPath(endpoints.generate),\n import: normalizeEndpointPath(endpoints.import),\n export: normalizeEndpointPath(endpoints.export),\n delete: normalizeEndpointPath(endpoints.delete),\n signTransaction: normalizeEndpointPath(endpoints.signTransaction),\n signMessage: normalizeEndpointPath(endpoints.signMessage),\n})\n\nconst withDefaults = (\n remoteConfig: RemoteWalletProviderConfig,\n fallbackProviderName: WarpWalletProvider\n): ResolvedRemoteWalletProviderConfig => {\n const baseUrl = normalizeAndValidateBaseUrl(remoteConfig.baseUrl, remoteConfig.allowInsecureHttp)\n const endpoints = normalizeEndpoints({\n ...defaultEndpoints,\n ...(remoteConfig.endpoints || {}),\n })\n\n return {\n ...remoteConfig,\n baseUrl,\n providerName: remoteConfig.providerName ?? fallbackProviderName,\n endpoints,\n }\n}\n\nexport class RemoteWalletProvider implements WalletProvider {\n protected readonly remoteConfig: ResolvedRemoteWalletProviderConfig\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo,\n remoteConfig: RemoteWalletProviderConfig,\n fallbackProviderName: WarpWalletProvider = DEFAULT_REMOTE_WALLET_PROVIDER_NAME\n ) {\n this.remoteConfig = withDefaults(remoteConfig, fallbackProviderName)\n }\n\n async getAddress(): Promise<string | null> {\n return getWarpWalletAddressFromConfig(this.config, this.chain.name)\n }\n\n async getPublicKey(): Promise<string | null> {\n return null\n }\n\n async signTransaction(tx: WarpAdapterGenericTransaction): Promise<WarpAdapterGenericTransaction> {\n const signAuth = await this.getSignAuth()\n const transaction = this.toSerializableTransaction(tx)\n\n const response = await this.request<SignTransactionResponse>(\n this.remoteConfig.endpoints.signTransaction,\n { walletId: signAuth.walletId, chain: this.chain.name, nonce: signAuth.nonce, transaction },\n {\n bearer: signAuth.token,\n context: this.createContext('signTransaction', { walletId: signAuth.walletId, nonce: signAuth.nonce }),\n }\n )\n const txRecord = isRecord(tx) ? tx : {}\n\n if (typeof response.transactionHash === 'string' && response.transactionHash.trim() !== '') {\n return { ...txRecord, transactionHash: response.transactionHash }\n }\n\n if (response.signedTransaction !== undefined && response.signedTransaction !== null) {\n if (typeof response.signedTransaction === 'string') {\n return { ...txRecord, signature: response.signedTransaction }\n }\n\n if (isRecord(response.signedTransaction)) {\n return { ...txRecord, ...response.signedTransaction }\n }\n\n throw new Error('RemoteWalletProvider: Invalid signedTransaction format from signer service')\n }\n\n if (response.signature !== undefined && response.signature !== null) {\n const isMultiversxSignature = this.chain.name === 'multiversx' || this.chain.name === 'claws'\n\n if (isMultiversxSignature) {\n if (typeof response.signature !== 'string' || !isStrictHex(response.signature)) {\n throw new Error('RemoteWalletProvider: Invalid hex signature for multiversx transaction')\n }\n return { ...txRecord, signature: Buffer.from(response.signature, 'hex') }\n }\n\n if (typeof response.signature !== 'string' && !Array.isArray(response.signature)) {\n throw new Error('RemoteWalletProvider: Invalid signature format from signer service')\n }\n\n return { ...txRecord, signature: response.signature }\n }\n\n throw new Error('RemoteWalletProvider: Invalid signTransaction response from signer service')\n }\n\n async signMessage(message: string): Promise<string> {\n const signAuth = await this.getSignAuth()\n\n const response = await this.request<{ signature: string }>(\n this.remoteConfig.endpoints.signMessage,\n { walletId: signAuth.walletId, chain: this.chain.name, nonce: signAuth.nonce, message },\n {\n bearer: signAuth.token,\n context: this.createContext('signMessage', { walletId: signAuth.walletId, nonce: signAuth.nonce }),\n }\n )\n\n if (!response.signature) throw new Error('RemoteWalletProvider: Missing signature in signMessage response')\n return response.signature\n }\n\n async importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails> {\n void mnemonic\n throw new Error('RemoteWalletProvider: importFromMnemonic() is not supported. Use importFromPrivateKey or generate().')\n }\n\n async importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails> {\n const agentId = this.config.user?.id\n if (!agentId) throw new Error('RemoteWalletProvider: user.id is required for key import')\n const serviceToken = await this.resolveServiceToken()\n\n return await this.requestLifecycleWallet(this.remoteConfig.endpoints.import, { agentId, chain: this.chain.name, privateKey }, serviceToken, 'import')\n }\n\n async export(): Promise<WarpWalletDetails> {\n const walletId = this.getWalletIdOrThrow()\n const serviceToken = await this.resolveServiceToken()\n\n const response = await this.request<{ provider?: WarpWalletProvider; address: string; privateKey?: string; externalId?: string }>(\n this.remoteConfig.endpoints.export,\n { walletId },\n {\n bearer: serviceToken,\n context: this.createContext('export', { walletId }),\n }\n )\n\n return {\n provider: response.provider ?? this.remoteConfig.providerName,\n address: response.address,\n privateKey: response.privateKey ?? null,\n externalId: response.externalId ?? walletId,\n }\n }\n\n async generate(): Promise<WarpWalletDetails> {\n const agentId = this.config.user?.id\n if (!agentId) throw new Error('RemoteWalletProvider: user.id is required for wallet generation')\n const serviceToken = await this.resolveServiceToken()\n\n return await this.requestLifecycleWallet(this.remoteConfig.endpoints.generate, { agentId, chain: this.chain.name }, serviceToken, 'generate')\n }\n\n async delete(externalId: string): Promise<void> {\n const serviceToken = await this.resolveServiceToken()\n\n await this.request(\n this.remoteConfig.endpoints.delete,\n { walletId: externalId },\n {\n bearer: serviceToken,\n context: this.createContext('delete', { walletId: externalId }),\n }\n )\n }\n\n private async requestLifecycleWallet(\n path: string,\n payload: Record<string, unknown>,\n token: string,\n operation: RemoteWalletOperation\n ): Promise<WarpWalletDetails> {\n const response = await this.request<RemoteWalletLifecycleResponse>(path, payload, {\n bearer: token,\n context: this.createContext(operation),\n })\n const walletDetails = this.toWalletDetails(response)\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n return walletDetails\n }\n\n private toWalletDetails(response: RemoteWalletLifecycleResponse): WarpWalletDetails {\n return {\n provider: response.provider ?? this.remoteConfig.providerName,\n address: response.address,\n externalId: response.externalId ?? response.walletId,\n }\n }\n\n private getWalletIdOrThrow(): string {\n const walletId = getWarpWalletExternalIdFromConfig(this.config, this.chain.name)\n if (!walletId) {\n throw new Error(`RemoteWalletProvider: externalId(walletId) is required for chain ${this.chain.name}`)\n }\n return walletId\n }\n\n private async resolveAccessToken(walletId: string, nonce: string): Promise<string> {\n if (this.remoteConfig.getAccessToken) {\n const token = await this.remoteConfig.getAccessToken({ walletId, chain: this.chain.name, nonce })\n return this.requireToken(token, 'access token callback')\n }\n if (this.remoteConfig.accessToken) return this.requireToken(this.remoteConfig.accessToken, 'access token')\n throw new Error('RemoteWalletProvider: No access token provider configured')\n }\n\n private async getSignAuth(): Promise<{ walletId: string; nonce: string; token: string }> {\n const walletId = this.getWalletIdOrThrow()\n const nonce = crypto.randomUUID()\n const token = await this.resolveAccessToken(walletId, nonce)\n return { walletId, nonce, token }\n }\n\n private async resolveServiceToken(): Promise<string> {\n if (this.remoteConfig.getServiceToken) {\n const token = await this.remoteConfig.getServiceToken()\n return this.requireToken(token, 'service token callback')\n }\n if (this.remoteConfig.serviceToken) return this.requireToken(this.remoteConfig.serviceToken, 'service token')\n throw new Error('RemoteWalletProvider: No service token configured for wallet lifecycle endpoints')\n }\n\n private toSerializableTransaction(tx: WarpAdapterGenericTransaction): unknown {\n if (tx && typeof tx === 'object') {\n if ('toPlainObject' in tx && typeof (tx as { toPlainObject?: () => unknown }).toPlainObject === 'function') {\n return (tx as { toPlainObject: () => unknown }).toPlainObject()\n }\n if ('toJSON' in tx && typeof (tx as { toJSON?: () => unknown }).toJSON === 'function') {\n return (tx as { toJSON: () => unknown }).toJSON()\n }\n }\n return tx\n }\n\n private async request<T>(\n path: string,\n payload: Record<string, unknown>,\n options: { bearer?: string; context: RemoteWalletRequestContext }\n ): Promise<T> {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), this.remoteConfig.timeoutMs ?? 15_000)\n const context = options.context\n\n try {\n const resolvedPayload = await this.resolvePayload(context, payload)\n const resolvedHeaders = await this.resolveHeaders(context, options.bearer)\n\n const response = await fetch(`${this.remoteConfig.baseUrl}${path}`, {\n method: 'POST',\n headers: resolvedHeaders,\n body: JSON.stringify(resolvedPayload, (_, value: unknown) => (typeof value === 'bigint' ? value.toString() : value)),\n signal: controller.signal,\n })\n\n if (!response.ok) {\n const text = await response.text()\n throw new Error(`RemoteWalletProvider request failed (${response.status}): ${text}`)\n }\n\n if (response.status === 204) return undefined as T\n return (await response.json()) as T\n } finally {\n clearTimeout(timeout)\n }\n }\n\n private requireToken(token: unknown, source: string): string {\n if (typeof token !== 'string' || token.trim() === '') {\n throw new Error(`RemoteWalletProvider: ${source} returned an empty token`)\n }\n return token.trim()\n }\n\n private createContext(operation: RemoteWalletOperation, extra?: Partial<RemoteWalletRequestContext>): RemoteWalletRequestContext {\n return {\n operation,\n chain: this.chain.name,\n ...extra,\n }\n }\n\n private async resolveHeaders(context: RemoteWalletRequestContext, bearer?: string): Promise<Record<string, string>> {\n const headersFromConfig = this.remoteConfig.headers ?? {}\n const dynamicHeaders = this.remoteConfig.getHeaders ? await this.remoteConfig.getHeaders(context) : {}\n\n return {\n 'Content-Type': 'application/json',\n ...headersFromConfig,\n ...(dynamicHeaders ?? {}),\n ...(bearer ? { Authorization: `Bearer ${bearer}` } : {}),\n }\n }\n\n private async resolvePayload(context: RemoteWalletRequestContext, payload: Record<string, unknown>): Promise<Record<string, unknown>> {\n if (!this.remoteConfig.transformPayload) return payload\n return await this.remoteConfig.transformPayload(context, payload)\n }\n}\n","import { WarpWalletProvider } from '@joai/warps'\n\nexport const DEFAULT_REMOTE_WALLET_PROVIDER_NAME: WarpWalletProvider = 'remote'\n\nexport type RemoteWalletProviderEndpoints = {\n generate: string\n import: string\n export: string\n delete: string\n signTransaction: string\n signMessage: string\n}\n\nexport type RemoteWalletOperation = 'generate' | 'import' | 'export' | 'delete' | 'signTransaction' | 'signMessage'\n\nexport type RemoteWalletAccessTokenParams = {\n walletId: string\n chain: string\n nonce: string\n}\n\nexport type RemoteWalletRequestContext = {\n operation: RemoteWalletOperation\n chain: string\n walletId?: string\n nonce?: string\n}\n\nexport type RemoteWalletProviderConfig = {\n baseUrl: string\n allowInsecureHttp?: boolean\n providerName?: WarpWalletProvider\n endpoints?: Partial<RemoteWalletProviderEndpoints>\n timeoutMs?: number\n headers?: Record<string, string>\n getHeaders?: (context: RemoteWalletRequestContext) => Promise<Record<string, string> | undefined> | Record<string, string> | undefined\n transformPayload?: (\n context: RemoteWalletRequestContext,\n payload: Record<string, unknown>\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n serviceToken?: string\n getServiceToken?: () => Promise<string> | string\n accessToken?: string\n getAccessToken?: (params: RemoteWalletAccessTokenParams) => Promise<string> | string\n}\n\nexport type RemoteWalletLifecycleResponse = {\n provider?: WarpWalletProvider\n walletId: string\n externalId?: string\n address: string\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig, WarpWalletProvider } from '@joai/warps'\nimport { RemoteWalletProvider } from './RemoteWalletProvider'\nimport { RemoteWalletProviderConfig, DEFAULT_REMOTE_WALLET_PROVIDER_NAME } from './types'\n\nexport const createRemoteWalletProvider = (\n remoteConfig: RemoteWalletProviderConfig,\n fallbackProviderName: WarpWalletProvider = DEFAULT_REMOTE_WALLET_PROVIDER_NAME\n): WalletProviderFactory => {\n return (config: WarpClientConfig, chain: WarpChainInfo) => new RemoteWalletProvider(config, chain, remoteConfig, fallbackProviderName)\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAOK;;;ACRA,IAAM,sCAA0D;;;ADkBvE,IAAM,mBAAkD;AAAA,EACtD,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,aAAa;AACf;AAaA,IAAM,oBAAoB,CAAC,UAA0B,MAAM,QAAQ,QAAQ,EAAE;AAC7E,IAAM,cAAc,CAAC,UAA2B,eAAe,KAAK,KAAK,KAAK,MAAM,SAAS,MAAM;AACnG,IAAM,iBAAiB,CAAC,SAA0B,CAAC,aAAa,aAAa,KAAK,EAAE,SAAS,KAAK,YAAY,CAAC;AAC/G,IAAM,WAAW,CAAC,UAAqD,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAE1I,IAAM,8BAA8B,CAAC,SAAiB,sBAAwC;AAC5F,QAAM,aAAa,kBAAkB,QAAQ,KAAK,CAAC;AACnD,MAAI;AAEJ,MAAI;AACF,gBAAY,IAAI,IAAI,UAAU;AAAA,EAChC,QAAQ;AACN,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAEA,QAAM,UAAU,UAAU,SAAS,YAAY,MAAM;AACrD,MAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,eAAe,UAAU,QAAQ,GAAG;AACzE,UAAM,IAAI,MAAM,6FAA6F;AAAA,EAC/G;AAEA,SAAO;AACT;AAEA,IAAM,wBAAwB,CAAC,SAAyB;AACtD,QAAM,aAAa,KAAK,KAAK;AAC7B,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,gEAAgE;AAAA,EAClF;AAEA,MAAI;AACF,QAAI,IAAI,UAAU;AAClB,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE,SAAS,OAAO;AACd,QAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,kBAAkB,GAAG;AACxE,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO,WAAW,WAAW,GAAG,IAAI,aAAa,IAAI,UAAU;AACjE;AAEA,IAAM,qBAAqB,CAAC,eAA6E;AAAA,EACvG,UAAU,sBAAsB,UAAU,QAAQ;AAAA,EAClD,QAAQ,sBAAsB,UAAU,MAAM;AAAA,EAC9C,QAAQ,sBAAsB,UAAU,MAAM;AAAA,EAC9C,QAAQ,sBAAsB,UAAU,MAAM;AAAA,EAC9C,iBAAiB,sBAAsB,UAAU,eAAe;AAAA,EAChE,aAAa,sBAAsB,UAAU,WAAW;AAC1D;AAEA,IAAM,eAAe,CACnB,cACA,yBACuC;AACvC,QAAM,UAAU,4BAA4B,aAAa,SAAS,aAAa,iBAAiB;AAChG,QAAM,YAAY,mBAAmB;AAAA,IACnC,GAAG;AAAA,IACH,GAAI,aAAa,aAAa,CAAC;AAAA,EACjC,CAAC;AAED,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,cAAc,aAAa,gBAAgB;AAAA,IAC3C;AAAA,EACF;AACF;AAEO,IAAM,uBAAN,MAAqD;AAAA,EAG1D,YACmB,QACA,OACjB,cACA,uBAA2C,qCAC3C;AAJiB;AACA;AAIjB,SAAK,eAAe,aAAa,cAAc,oBAAoB;AAAA,EACrE;AAAA,EAEA,MAAM,aAAqC;AACzC,WAAO,+BAA+B,KAAK,QAAQ,KAAK,MAAM,IAAI;AAAA,EACpE;AAAA,EAEA,MAAM,eAAuC;AAC3C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,IAA2E;AAC/F,UAAM,WAAW,MAAM,KAAK,YAAY;AACxC,UAAM,cAAc,KAAK,0BAA0B,EAAE;AAErD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,KAAK,aAAa,UAAU;AAAA,MAC5B,EAAE,UAAU,SAAS,UAAU,OAAO,KAAK,MAAM,MAAM,OAAO,SAAS,OAAO,YAAY;AAAA,MAC1F;AAAA,QACE,QAAQ,SAAS;AAAA,QACjB,SAAS,KAAK,cAAc,mBAAmB,EAAE,UAAU,SAAS,UAAU,OAAO,SAAS,MAAM,CAAC;AAAA,MACvG;AAAA,IACF;AACA,UAAM,WAAW,SAAS,EAAE,IAAI,KAAK,CAAC;AAEtC,QAAI,OAAO,SAAS,oBAAoB,YAAY,SAAS,gBAAgB,KAAK,MAAM,IAAI;AAC1F,aAAO,EAAE,GAAG,UAAU,iBAAiB,SAAS,gBAAgB;AAAA,IAClE;AAEA,QAAI,SAAS,sBAAsB,UAAa,SAAS,sBAAsB,MAAM;AACnF,UAAI,OAAO,SAAS,sBAAsB,UAAU;AAClD,eAAO,EAAE,GAAG,UAAU,WAAW,SAAS,kBAAkB;AAAA,MAC9D;AAEA,UAAI,SAAS,SAAS,iBAAiB,GAAG;AACxC,eAAO,EAAE,GAAG,UAAU,GAAG,SAAS,kBAAkB;AAAA,MACtD;AAEA,YAAM,IAAI,MAAM,4EAA4E;AAAA,IAC9F;AAEA,QAAI,SAAS,cAAc,UAAa,SAAS,cAAc,MAAM;AACnE,YAAM,wBAAwB,KAAK,MAAM,SAAS,gBAAgB,KAAK,MAAM,SAAS;AAEtF,UAAI,uBAAuB;AACzB,YAAI,OAAO,SAAS,cAAc,YAAY,CAAC,YAAY,SAAS,SAAS,GAAG;AAC9E,gBAAM,IAAI,MAAM,wEAAwE;AAAA,QAC1F;AACA,eAAO,EAAE,GAAG,UAAU,WAAW,OAAO,KAAK,SAAS,WAAW,KAAK,EAAE;AAAA,MAC1E;AAEA,UAAI,OAAO,SAAS,cAAc,YAAY,CAAC,MAAM,QAAQ,SAAS,SAAS,GAAG;AAChF,cAAM,IAAI,MAAM,oEAAoE;AAAA,MACtF;AAEA,aAAO,EAAE,GAAG,UAAU,WAAW,SAAS,UAAU;AAAA,IACtD;AAEA,UAAM,IAAI,MAAM,4EAA4E;AAAA,EAC9F;AAAA,EAEA,MAAM,YAAY,SAAkC;AAClD,UAAM,WAAW,MAAM,KAAK,YAAY;AAExC,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,KAAK,aAAa,UAAU;AAAA,MAC5B,EAAE,UAAU,SAAS,UAAU,OAAO,KAAK,MAAM,MAAM,OAAO,SAAS,OAAO,QAAQ;AAAA,MACtF;AAAA,QACE,QAAQ,SAAS;AAAA,QACjB,SAAS,KAAK,cAAc,eAAe,EAAE,UAAU,SAAS,UAAU,OAAO,SAAS,MAAM,CAAC;AAAA,MACnG;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,UAAW,OAAM,IAAI,MAAM,iEAAiE;AAC1G,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,mBAAmB,UAA8C;AACrE,SAAK;AACL,UAAM,IAAI,MAAM,sGAAsG;AAAA,EACxH;AAAA,EAEA,MAAM,qBAAqB,YAAgD;AACzE,UAAM,UAAU,KAAK,OAAO,MAAM;AAClC,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,0DAA0D;AACxF,UAAM,eAAe,MAAM,KAAK,oBAAoB;AAEpD,WAAO,MAAM,KAAK,uBAAuB,KAAK,aAAa,UAAU,QAAQ,EAAE,SAAS,OAAO,KAAK,MAAM,MAAM,WAAW,GAAG,cAAc,QAAQ;AAAA,EACtJ;AAAA,EAEA,MAAM,SAAqC;AACzC,UAAM,WAAW,KAAK,mBAAmB;AACzC,UAAM,eAAe,MAAM,KAAK,oBAAoB;AAEpD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,KAAK,aAAa,UAAU;AAAA,MAC5B,EAAE,SAAS;AAAA,MACX;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,cAAc,UAAU,EAAE,SAAS,CAAC;AAAA,MACpD;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU,SAAS,YAAY,KAAK,aAAa;AAAA,MACjD,SAAS,SAAS;AAAA,MAClB,YAAY,SAAS,cAAc;AAAA,MACnC,YAAY,SAAS,cAAc;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAM,WAAuC;AAC3C,UAAM,UAAU,KAAK,OAAO,MAAM;AAClC,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,iEAAiE;AAC/F,UAAM,eAAe,MAAM,KAAK,oBAAoB;AAEpD,WAAO,MAAM,KAAK,uBAAuB,KAAK,aAAa,UAAU,UAAU,EAAE,SAAS,OAAO,KAAK,MAAM,KAAK,GAAG,cAAc,UAAU;AAAA,EAC9I;AAAA,EAEA,MAAM,OAAO,YAAmC;AAC9C,UAAM,eAAe,MAAM,KAAK,oBAAoB;AAEpD,UAAM,KAAK;AAAA,MACT,KAAK,aAAa,UAAU;AAAA,MAC5B,EAAE,UAAU,WAAW;AAAA,MACvB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,cAAc,UAAU,EAAE,UAAU,WAAW,CAAC;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,uBACZ,MACA,SACA,OACA,WAC4B;AAC5B,UAAM,WAAW,MAAM,KAAK,QAAuC,MAAM,SAAS;AAAA,MAChF,QAAQ;AAAA,MACR,SAAS,KAAK,cAAc,SAAS;AAAA,IACvC,CAAC;AACD,UAAM,gBAAgB,KAAK,gBAAgB,QAAQ;AACnD,0BAAsB,KAAK,QAAQ,KAAK,MAAM,MAAM,aAAa;AACjE,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,UAA4D;AAClF,WAAO;AAAA,MACL,UAAU,SAAS,YAAY,KAAK,aAAa;AAAA,MACjD,SAAS,SAAS;AAAA,MAClB,YAAY,SAAS,cAAc,SAAS;AAAA,IAC9C;AAAA,EACF;AAAA,EAEQ,qBAA6B;AACnC,UAAM,WAAW,kCAAkC,KAAK,QAAQ,KAAK,MAAM,IAAI;AAC/E,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,oEAAoE,KAAK,MAAM,IAAI,EAAE;AAAA,IACvG;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,mBAAmB,UAAkB,OAAgC;AACjF,QAAI,KAAK,aAAa,gBAAgB;AACpC,YAAM,QAAQ,MAAM,KAAK,aAAa,eAAe,EAAE,UAAU,OAAO,KAAK,MAAM,MAAM,MAAM,CAAC;AAChG,aAAO,KAAK,aAAa,OAAO,uBAAuB;AAAA,IACzD;AACA,QAAI,KAAK,aAAa,YAAa,QAAO,KAAK,aAAa,KAAK,aAAa,aAAa,cAAc;AACzG,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AAAA,EAEA,MAAc,cAA2E;AACvF,UAAM,WAAW,KAAK,mBAAmB;AACzC,UAAM,QAAQ,OAAO,WAAW;AAChC,UAAM,QAAQ,MAAM,KAAK,mBAAmB,UAAU,KAAK;AAC3D,WAAO,EAAE,UAAU,OAAO,MAAM;AAAA,EAClC;AAAA,EAEA,MAAc,sBAAuC;AACnD,QAAI,KAAK,aAAa,iBAAiB;AACrC,YAAM,QAAQ,MAAM,KAAK,aAAa,gBAAgB;AACtD,aAAO,KAAK,aAAa,OAAO,wBAAwB;AAAA,IAC1D;AACA,QAAI,KAAK,aAAa,aAAc,QAAO,KAAK,aAAa,KAAK,aAAa,cAAc,eAAe;AAC5G,UAAM,IAAI,MAAM,kFAAkF;AAAA,EACpG;AAAA,EAEQ,0BAA0B,IAA4C;AAC5E,QAAI,MAAM,OAAO,OAAO,UAAU;AAChC,UAAI,mBAAmB,MAAM,OAAQ,GAAyC,kBAAkB,YAAY;AAC1G,eAAQ,GAAwC,cAAc;AAAA,MAChE;AACA,UAAI,YAAY,MAAM,OAAQ,GAAkC,WAAW,YAAY;AACrF,eAAQ,GAAiC,OAAO;AAAA,MAClD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,QACZ,MACA,SACA,SACY;AACZ,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,aAAa,aAAa,IAAM;AAC1F,UAAM,UAAU,QAAQ;AAExB,QAAI;AACF,YAAM,kBAAkB,MAAM,KAAK,eAAe,SAAS,OAAO;AAClE,YAAM,kBAAkB,MAAM,KAAK,eAAe,SAAS,QAAQ,MAAM;AAEzE,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,aAAa,OAAO,GAAG,IAAI,IAAI;AAAA,QAClE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,MAAM,KAAK,UAAU,iBAAiB,CAAC,GAAG,UAAoB,OAAO,UAAU,WAAW,MAAM,SAAS,IAAI,KAAM;AAAA,QACnH,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,cAAM,IAAI,MAAM,wCAAwC,SAAS,MAAM,MAAM,IAAI,EAAE;AAAA,MACrF;AAEA,UAAI,SAAS,WAAW,IAAK,QAAO;AACpC,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B,UAAE;AACA,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,aAAa,OAAgB,QAAwB;AAC3D,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,YAAM,IAAI,MAAM,yBAAyB,MAAM,0BAA0B;AAAA,IAC3E;AACA,WAAO,MAAM,KAAK;AAAA,EACpB;AAAA,EAEQ,cAAc,WAAkC,OAAyE;AAC/H,WAAO;AAAA,MACL;AAAA,MACA,OAAO,KAAK,MAAM;AAAA,MAClB,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEA,MAAc,eAAe,SAAqC,QAAkD;AAClH,UAAM,oBAAoB,KAAK,aAAa,WAAW,CAAC;AACxD,UAAM,iBAAiB,KAAK,aAAa,aAAa,MAAM,KAAK,aAAa,WAAW,OAAO,IAAI,CAAC;AAErG,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,GAAG;AAAA,MACH,GAAI,kBAAkB,CAAC;AAAA,MACvB,GAAI,SAAS,EAAE,eAAe,UAAU,MAAM,GAAG,IAAI,CAAC;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,MAAc,eAAe,SAAqC,SAAoE;AACpI,QAAI,CAAC,KAAK,aAAa,iBAAkB,QAAO;AAChD,WAAO,MAAM,KAAK,aAAa,iBAAiB,SAAS,OAAO;AAAA,EAClE;AACF;;;AExXO,IAAM,6BAA6B,CACxC,cACA,uBAA2C,wCACjB;AAC1B,SAAO,CAAC,QAA0B,UAAyB,IAAI,qBAAqB,QAAQ,OAAO,cAAc,oBAAoB;AACvI;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joai/warps-wallet-remote",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Generic remote wallet provider for signer services",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -34,6 +34,6 @@
34
34
  "access": "public"
35
35
  },
36
36
  "dependencies": {
37
- "@joai/warps": "^4.1.0"
37
+ "@joai/warps": "^4.3.0"
38
38
  }
39
39
  }